У меня есть страница HTML как так:
<html>
<body>
<div id='something'>
...
<script>
var x = 'hello world';
</script>
...
</div>
</body>
</html>
На другой странице я делаю это:
$.ajax({
url: 'example.html',
type: 'GET',
success: function(data) {
$('#mydiv').html($(data).find('#something').html());
alert(x);
}
});
jQuery, однако, не выполняет JavaScript в первом файле, даже при том, что в документации говорится, что она делает. Как я могу заставить его сделать это?
Править: К сожалению, в приложении реального мира я продолжаю работать, я не управляю тем, что имеет "включенная" страница. Мы находимся на том же домене, но я не могу изменить код, который он производит, поскольку это - упакованный продукт, который наш отдел ИТ не позволит нам изменить.
Как указал Пойнти ( простите за каламбур ), jQuery портит теги SCRIPT, когда вы передаете HTML в $ ()
. Однако он не удаляет их - он просто добавляет их в коллекцию DOM, созданную из вашего HTML. Вы можете выполнить сценарии следующим образом:
$.ajax({
url: 'example.html',
type: 'GET',
success: function(data) {
var dom = $(data);
$('#mydiv').html(dom.find('#something').html());
dom.filter('script').each(function(){
$.globalEval(this.text || this.textContent || this.innerHTML || '');
});
}
});
Я не совсем уверен в этом, но возможно, что происходит следующее: когда jQuery создает фрагмент из $ (data)
, теги скрипта в этот момент теряются.
Если вы можете сделать так, чтобы включенная страница действительно была просто фрагментом:
<div id='something'>
<!-- ... -->
<script>var x = 'hello world';</script>
</div>
без каких-либо других окружающих вещей, тогда ваш обратный вызов успеха может сделать это:
success: function(data) {
$('#mydiv').html(data);
}
Теперь эти теги сценария будут замечены jQuery html ()
, которая явно ищет и удаляет их. Однако он сохраняет эти блоки сценария и выполняет их после завершения обновления целевого содержимого.
Я ожидаю, что первый страница выполняет JavaScript, однако он недоступен со второй страницы, поэтому alert (x)
не будет работать
Если вы хотите вернуть x
, вам придется выведите его в ответ AJAX.