Изменение ответа jquery ajax html 1.3.2 по сравнению с 1.4.2 (ака, где мой тег сценария?)

Я использую jquery 1.3.2 для извлечения фрагментов html (включая скрипт) с сервера. Типичный ответ может быть таким:

<div id="content"><div id="inner">...

<script type=...> alert("hello world");</script>

<p>Hello World</p>

</div></div>

Я использую функцию запроса .get:

$.get($(this).attr("href"), function(response) {
    $("#inner").replaceWith($("#inner", response));
        });

И все нормально и работает как положено: возвращенные фрагменты html загружаются в DOM и скрипты запускаются.

Однако, когда я использую 1.4.2, я замечаю, что теги сценария были удалены и больше не выполняются.

Переход к более новой кодовой базе jquery дает строки кода (строка 4498):

ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );

который, кажется, является виновником «удаления» сценария из его счастливого места отдыха как часть процесса селектора. Но это не помогает мне внедрять точно то, что я хочу, в DOM.

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


person cmroanirgo    schedule 23.03.2010    source источник


Ответы (4)


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

<script type="text/javascript">alert("hello world");</script>
<p>Hello World</p>

тогда вы могли бы использовать

$("#inner").load($(this).attr("href"));

Который, кажется, не страдает от этой проблемы.


Или, если на самом деле возвращается только фрагмент этой формы (который является допустимым xml), вы также можете попробовать указать xml как dataType.

$.get($(this).attr("href"), null, function(response) {
    $("#inner").replaceWith($("#inner", response));
}, "xml");
person jitter    schedule 24.03.2010
comment
используя $(#inner).load($(this).attr(href)); сделал свое дело. спасибо дрожь - person cmroanirgo; 24.03.2010

Не знаю, все ли согласятся, но я бы сказал, что проблема в структуре того, что вы делаете.

Вытягивание синтаксиса javascript из базы данных звучит как очень странная вещь, в то время как вы можете просто иметь файлы js и вызывать их, чтобы они выполняли свои задачи, когда страница будет готова.

person Ali Habibzadeh    schedule 23.03.2010
comment
Я вижу много вариантов использования для такого сценария, но ОП не сказал, что контент поступает из базы данных, просто он представляет собой смешанный HTML и JS. - person Joel; 24.03.2010

все в порядке и работает как положено: возвращенные html-фрагменты загружаются в DOM, и скрипты запускаются.

Возможно, не во всех браузерах это не так.

Загрузка <script> в DOM через HTML (явно через функцию, основанную на domManip, или как результат load()) является чем-то ненадежным и ведет себя по-разному в разных браузерах; этого следует избегать.

jQuery пытается использовать некоторые обходные пути, чтобы сделать его лучше, что является частью того, что вы там видите (он пытается извлечь <script> элементов из контента и выполнить их вручную), но он не является надежным для всех случаев, и вы не должны полагаться в теме. [Обратите внимание, что тот же код присутствует в версии 1.3.2 (строка 955), так что в этом нет ничего нового.]

Лучший подход: держите статический код отдельно от разметки; не передавать скрипты обратно в контент для вставки в DOM; когда вам нужно добавить данные или вызвать триггер после вставки, сделайте это в коде, переданном обратно отдельно от HTML (например, как часть объекта JSON).

person bobince    schedule 24.03.2010
comment
Учитывая, что он работает в IE, FF, Chrome и Safari, я думаю, можно с уверенностью сказать, что он работает. Я пропустил строки в 1.3.2. Несмотря на это, затем обслуживать тесно связанные фрагменты script/html в двух запросах ajax только потому, что jQuery решил «Большой брат» меня, это нелепо, ИМХО. - person cmroanirgo; 24.03.2010
comment
Вам не нужны два запроса, вы можете иметь один запрос, возвращающий объект JSON, который содержит свойство HTML и свойство строки кода. См. stackoverflow.com /questions/1661224/, чтобы узнать, почему innerHTML-вставленные <script> – плохая идея. - person bobince; 24.03.2010

Проблема не в том, что использование встроенных скриптов является неправильным или неуместным, а в том, что jquery сильно ломается при обновлении с 1.3.2 до 1.4.2. Я думаю, что это было непреднамеренно со стороны разработчиков jQuery. Я надеюсь, что это будет исправлено в последующих выпусках, так как это делает jQuery (и jQuery-ui) ужасно менее привлекательными. Между тем, я советую изучить другие альтернативы, такие как Mootools или Yahoo UI, в качестве обходного пути для анализа HTML в режиме ajax.

person Community    schedule 30.07.2010