В случае, если кто-то все еще борется с этим, я подумал об опрятном решении.Предположим, вы выполняете вызов jQuery ajax:
$.ajax({
type: 'GET',
url: 'fragment.html',
success: function(html) {
$('body').append(html);
}
});
Предположим, что fragment.html
выглядит следующим образом:
<div class="fillme">
</div>
<script type="text/javascript>
$('.fillme').text('I am filled.');
</script>
Тогда требуемое состояние div.fillme
равно:
<div class="fillme">
I am filled.
</div>
Но, конечно, этого не произойдет, потому что div и скрипт добавляются одновременно, и поэтому div.fillme
не существует во время выполнения скрипта.Проблема может быть решена путем добавления скрипта после добавления div.Обратите внимание, что следующая строка кода:
var $html = $(html);
поместит список
[<div class="fillme"></div>, <script type="text/javascript">...</script>]
в переменную $html
.Это полностью функциональные фрагменты DOM, которые еще не добавлены в DOM.Самое главное, сценарий еще не выполнен;это будет, когда мы добавим его.Мы обязательно добавим его после добавления div.Вот некоторый общий код, который делает это:
$.ajax({
type: 'GET',
url: 'fragment.html',
success: function(html) {
var $html = $(html);
var nonscripts = $html.filter(function() { return !$(this).is('script'); });
var scripts = $html.filter(function() { return !$(this).is('script'); });
$('body').append(nonscripts).append(scripts);
}
});
И это все, ребята.
Edit: Вот еще более универсальное решение, которое просто используеттот факт, что элементы в переменной $html
перечислены в порядке их появления во фрагменте HTML:
$.ajax({
type: 'GET',
url: 'fragment.html',
success: function(html) {
$(html).each(function(i, element) {
$('body').append(element);
});
}
});