jquery ajax изменение ответа html 1.3.2 против 1.4.2 (иначе, где мой тег сценария?) - PullRequest
2 голосов
/ 24 марта 2010

Я использую 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 делает это? Что еще более важно, как я могу исправить это, чтобы мои скрипты работали?

Ответы [ 4 ]

1 голос
/ 24 марта 2010

Если вы можете изменить свой код на стороне сервера, чтобы вернуть это (просто удалите 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");
0 голосов
/ 30 июля 2010

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

0 голосов
/ 24 марта 2010

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

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

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

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

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

0 голосов
/ 24 марта 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...