Мой сайт использовал jquery.load()
для навигации по большому фрагменту страницы. Я действительно ценю возможность включать только определенную часть загруженного контента, здесь div с id = "content":
$(frame_selector).load(url +" #content", function(response, status, xhr) {...});
Но теперь мне нужно иметь возможность запускать скрипты, которые являются частью динамически загружаемых страниц. Jquery.load()
удаляет эти сценарии, а jquery.ajax()
- нет. Поэтому я продублировал функцию частичного содержимого jquery.load
в вызове ajax следующим образом:
$.ajax({
url: url,
dataType: 'html',
success: function(data, textStatus, XMLHttpRequest) {
// Only include the response within the #content id element.
$(frame_selector).html( jQuery("<div>")
.append(data)
.find("#content")
);
}
});
Проблема в том, что скрипты, которые динамически загружаются из вызова ajax, не работают надежно. Иногда они, кажется, не имеют никакого эффекта, возможно, потому что они бегут слишком рано. Сценарии просто выполняют DOM-манипуляции в jquery - не полагаясь на изображения, флэш-память или что-то, что еще не загружено. Чтобы не застрять, у меня есть этот отвратительный хак, чтобы все заработало. Вместо загруженного AJAX-скрипта просто используйте:
$(document).ready( function() {...} ); // unreliable
Я задерживаю сценарий за 200 мс до запуска:
$(document).ready( window.setTimeout( function() {...}, 200 )); // HATE THIS
Кто-нибудь знает, как я могу сделать это надежно, без жесткого кодирования задержки? Я предполагаю, что это условие гонки между <script>
и моей логикой загрузки #content
в новый div, но я не уверен, что с этим делать.