Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   .innerHTML и .html() (https://javascript.ru/forum/events/52174-innerhtml-i-html.html)

Tecvid 06.12.2014 22:15

.innerHTML и .html()
 
целый день уже не могу понять почему так происходит, значит есть элемент, при клике по нему создаётся новый блок, и потом через ajax данные попадают в этот блок

var form = document.createElement('div');
form.setAttribute('id', 'reg');
form.innerHTML = '<img src="/assets/img/loading.gif" width="227" height="28" alt="Loading..." style="margin-left:-10px;margin-top:-10px;">';
document.body.appendChild(form);

ajax({
    url: '/reg/',
    cache: false,
    success: function(data) {
        form.innerHTML = data;
    }
});


data в себе также содержит код js необходимый для функционирования полученных данных, так вот, всё вроде получается, данные попадают куда надо, в том числе и js код, но загруженный js не работает, что странно, когда подключаю jquery и пишу $('#reg').html(data), то всё прекрасно работает, попробовал сделать вот так: document.getElementById('reg').innerHTML = data;
не помогло, попробал убрать src у тега script и вписать код прямо в нём (ну а мало ли что), тоже не помогло, вобщем как ни стараюсь скрипт не хочет работать без .html(), а только из-за этого подключать jquery слишком жирно, подскажите пожалуйста как быть

Deff 06.12.2014 22:43

Tecvid,
элементы c js в jQuery нун подгружать на страницу таким макаром
Цитата:

$(элемент с js).appendTo(куды надо);
============
В нативном js, чтобы скрипт заработал нун сначало создать элемент:
var s = document.createElement('script');
Затем добавить содержимое скрипта:
s.text = cодержимое;
Затем добавить скрипт на страницу:
document.body.appendChild(s);
=============
var s = document.createElement('script');
s.text = "alert('A')";
document.body.appendChild(s);

рони 06.12.2014 22:49

Deff,
:blink: а jQuery тут причём?

Tecvid 06.12.2014 22:50

Цитата:

Сообщение от Deff (Сообщение 345092)
элементы c js в jQuery нун подгружать на страницу таким макаром

вы вообще вникли в суть моего вопроса?)

Deff 06.12.2014 22:53

Цитата:

Сообщение от Tecvid
вы вообще вникли в суть моего вопроса?)

:) Разучился
===============
Приведите конкретный пример содержимого формы с исполняемым js - Так будет проще решать, чем на пальцах!

Tecvid 06.12.2014 22:55

Цитата:

Сообщение от Deff (Сообщение 345092)
============
В нативном js, чтобы скрипт заработал нун сначало создать элемент:
var s = document.createElement('script');
Затем добавить содержимое скрипта:
s.text = cодержимое;
Затем добавить скрипт на страницу:
document.body.appendChild(s);
=============
var s = document.createElement('script');
s.text = "alert('A')";
document.body.appendChild(s);

а какая разница? если добавить содержимое после, то это всё равно что добавить содержимое в изначально существующий элемент, и ещё у меня проблема не с добавлением, а с работой скрипта который является частью содержимого

Deff 06.12.2014 22:58

Цитата:

Сообщение от рони (Сообщение 345094)
Deff,
:blink: а jQuery тут причём?

А Аjax там откель ?
Если нативно то уж XMLHttpReques

Deff 06.12.2014 22:59

Tecvid,
Аякс - из jQuery ? или откель ?

Tecvid 06.12.2014 23:00

Цитата:

Сообщение от Deff (Сообщение 345097)
Приведите конкретный пример содержимого формы с исполняемым js - Так будет проще решать, чем на пальцах!

<link type="text/css" rel="stylesheet" href="/assets/css/reg.css">

<div id="note"></div>

<img id="close" src="assets/img/close.gif" width="7" height="8" alt="x">

<form id="regForm" name="reg" action="/reg/register/" method="post">
    <input id="email" class="standby" type="text" name="email" maxlength="100" value="E-mail">
    
    <input id="passP" class="standby" type="text" value="Şifrə"><input id="pass" class="standby" type="password" name="pass"  maxlength="50" value="">
    
    <input id="confP" class="standby" type="text" value="Şifrəni təsdiqləyin"><input id="conf" class="standby" type="password" name="conf" maxlength="50" value="">
    
    <input id="fname" class="standby" type="text" name="fname" maxlength="50" value="Ad">
    
    <input id="sname" class="standby" type="text" name="sname" maxlength="50" value="Soyad">
    
    <span class="radio">
        <input id="M" type="radio" name="gender" value="m">
        <label id="male" for="M">Kişi</label>
    </span>
    <span class="radio">
        <input id="F" type="radio" name="gender" value="f">
        <label id="female" for="F">Qadın</label>
    </span>
    
    <input id="bd" class="born standby" type="text" name="bd" maxlength="2" value="Gün">
    
    <input id="bm" class="born standby" type="text" name="bm" maxlength="2" value="Ay">
    
    <input id="by" class="born standby" type="text" name="by" maxlength="4" value="İl">
    
    <input id="submit" type="submit" name="submit" value="Qeydiyyat">
</form>

<input id="auth2" type="button" value="Giriş">
<script type="text/javascript" src="/assets/js/reg.js"></script>

Tecvid 06.12.2014 23:01

Цитата:

Сообщение от Deff (Сообщение 345105)
Tecvid,
Аякс - из jQuery ? или откель ?


function ajax(options) {
    function getXmlHttp() {
        var xmlhttp;
        try {
            xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (E) {
                xmlhttp = false;
            }
        }
        if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
            xmlhttp = new XMLHttpRequest();
        }
        return xmlhttp;
    }
    
    var xmlhttp = getXmlHttp(),
        type = options.type || 'GET';
    xmlhttp.open(type, options.url, true);
    xmlhttp.setRequestHeader('X-REQUESTED-WITH', 'XMLHttpRequest');
    xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4) {
            if(xmlhttp.status == 200) {
                options.success(xmlhttp.responseText);
            }
        }
    };
    var data = options.data || null;
    xmlhttp.send(data);
}

Tecvid 06.12.2014 23:01

html форму показал, а вот js код не получается, на форуме лимит в 1290 символов

Deff 06.12.2014 23:03

Tecvid,
У Вас загружаемый скрипт в форме при любом раскладе, вписанный не через
document.write будет загружен асинхронно, поэтому после загрузки формы вы можете ничего не дождаться, обработку тогда нун делать в самом подгружаемом скрипте, либо вписывать в форму полнотекстовую версию скрипта

рони 06.12.2014 23:05

Tecvid,
jQuery парсит html перед вставкой и если видит скрипт то создаёт его на странице а не просто вставляет.

Deff 06.12.2014 23:07

Tecvid,
А подгрузить скрипт отдельно Аяксом? После загрузки формы
Если Скрипт с того же домена -Вы можете его текст Аяксом же и считать

Tecvid 06.12.2014 23:08

Цитата:

Сообщение от Deff
У Вас загружаемый скрипт при любом раскладе, вписанный не через
document.write будет загружен асинхронно

загружаться-то он загружается, но при .html(data) он работает, а при .innerHTML() нет
Цитата:

Сообщение от Deff
поэтому после загрузки формы вы можете ничего не дождаться, обработку тогда нун делать в самом подгружаемом скрипте

обработку чего вы имеете ввиду? скрипт загружаемый вместе с содержимым обрабатывает всё что связано с загружанной формой

Tecvid 06.12.2014 23:09

Цитата:

Сообщение от рони
jQuery парсит html перед вставкой и если видит скрипт то создаёт его на странице а не просто вставляет.

подскажите пожалуйста как его парсить и скрипт добавить к странице

Tecvid 06.12.2014 23:11

Цитата:

Сообщение от Deff
А подгрузить скрипт отдельно Аяксом? После загрузки формы
Если Скрипт с того же домена -Вы можете его текст Аяксом же и считать

я не понимаю вас, всмысле не понимаю к чему этот повторный запрос? можно пример чтоб понятнее стало, а то я не могу понять что именно вы имеете ввиду)

Deff 06.12.2014 23:15

Tecvid,
form.appendChild(data);

Tecvid 06.12.2014 23:23

Цитата:

Сообщение от Deff
form.appendChild(data);

а так вообще ничего не добаляется :D

Aetae 06.12.2014 23:38

<script> подключённый через innerHTML не исполняется. Функция html из jquery сама ищет скрипты в передаваемой строке и проводит предварительную обработку перед вставкой.

Хотите чтоб работало также - смотрите исходники jquery или пишите свой велосипед.
Хотите чтоб работало по-человечески - перепишите нормально код: не должны внезапно вылезать какие-то скрипты в получаемой строке. Все актуальные скрипты должны быть заранее загружены и готовы к работе.

рони 06.12.2014 23:39

Tecvid, 1 алерт это типа ajax прибыл ))) 2 алерт это вставка скрипта и его работа
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">
<script>
alert(12345)
</script>
 </head>

<body>
<div id='form'></div>


<script >
 var data =  document.getElementsByTagName('script')[0];//находим скрипт в html
 var s = document.createElement('script'); //создаём дубликат
 s.type = "text/javascript";
 s.text = data.text;//вставляем содержимое в дубликат
 document.getElementById('form').appendChild(s) //вставка на страницу
</script>


</body>

</html>

Tecvid 06.12.2014 23:47

Цитата:

Сообщение от рони
1 алерт это типа ajax прибыл ))) 2 алерт это вставка скрипта и его работа

а куда вставить ваш код? всмысле до ajax запроса, или после?))

рони 06.12.2014 23:52

Tecvid,
гммм ... когда есть что парсить

Tecvid 06.12.2014 23:54

Цитата:

Сообщение от рони
гммм ... когда есть что парсить

что-то не получается

Tecvid 06.12.2014 23:56

такую херню пишет :blink:

Uncaught TypeError: Cannot read property 'appendChild' of null

рони 06.12.2014 23:58

Tecvid,
ajax({
    url: '/reg/',
    cache: false,
    success: function(data) {
 form.innerHTML = data;
 data =  form.getElementsByTagName('script')[0];//находим скрипт в html
 var s = document.createElement('script'); //создаём дубликат
 s.type = "text/javascript";
 s.text = data.text;//вставляем содержимое в дубликат
 //form.replaceChild(data,s)
 form.appendChild(s) //вставка на страницу
    }
});

Tecvid 07.12.2014 00:13

рони,
получилось! спасибо вам большое!!! :)

danik.js 07.12.2014 05:00

Цитата:

Сообщение от Aetae
Хотите чтоб работало по-человечески - перепишите нормально код: не должны внезапно вылезать какие-то скрипты в получаемой строке

Видимо не хочет.
Tecvid, тебе тут помогают. Прояви уважение. Ответь хоть на предложение. Трудно чтоли написать "Я блядь не хочу по-человечески, хочу поуебански".

Tecvid 07.12.2014 11:24

Цитата:

Сообщение от danik.js
тебе тут помогают. Прояви уважение. Ответь хоть на предложение

а я не заметил этого сообщения :blink: видимо сонный был ночью от этого

ну в принципе код написан по человечески, а скрипт вылезает в полчаенной строке вот почему: скрипт нужен только для работы с полученными данными, а эти данные пользователь может и не загрузить, поэтому не вижу смысла заранее подключать этот громоздский скрипт, который пользователь не понадобится если он не загрузит те данные, надеюсь ясно выразился


Часовой пояс GMT +3, время: 22:14.