Кажется, это проблема, связанная только с Safari. Я пробовал 4 на Mac и 3 на Windows, и мне все еще не повезло.
Я пытаюсь загрузить внешний файл HTML и выполнить встроенный JavaScript.
Код, который я пытаюсь использовать, таков:
$("#myBtn").click(function() {
$("#myDiv").load("trackingCode.html");
});
trackingCode.html
выглядит так (сейчас просто, но будет расширяться один раз / если у меня это сработает):
<html>
<head>
<title>Tracking HTML File</title>
<script language="javascript" type="text/javascript">
alert("outside the jQuery ready");
$(function() {
alert("inside the jQuery ready");
});
</script>
</head>
<body>
</body>
</html>
Я вижу оба предупреждающих сообщения в IE (6 и 7) и Firefox (2 и 3). Однако я не могу видеть сообщения в Safari (последний браузер, о котором я должен беспокоиться - требования проекта - пожалуйста, не пламя войн).
Есть мысли о том, почему Safari игнорирует JavaScript в trackingCode.html
файле?
В конце концов, я хотел бы иметь возможность передавать объекты JavaScript в этот trackingCode.html
файл для использования в вызове jQuery ready, но я хотел бы убедиться, что это возможно во всех браузерах, прежде чем я пойду по этому пути.
$("#images").load(location.href+" #images",function(){ $.getScript("js/productHelper.js"); });
источник
Другая версия решения Джона Пика как раз раньше, это отлично работает для меня:
jQuery.ajax({ .... success: function(data, textStatus, jqXHR) { jQuery(selecteur).html(jqXHR.responseText); var reponse = jQuery(jqXHR.responseText); var reponseScript = reponse.filter("script"); jQuery.each(reponseScript, function(idx, val) { eval(val.text); } ); } ... });
источник
Я понимаю, что это что-то вроде более старого поста, но для всех, кто заходит на эту страницу в поисках аналогичного решения ...
http://api.jquery.com/jQuery.getScript/
источник
Это не работает, если вы загружаете поле HTML в динамически создаваемый элемент.
$('body').append('<div id="loader"></div>'); $('#loader').load('htmlwithscript.htm');
Я смотрю на firebug DOM, и там вообще нет узла сценария, только HTML и мой узел CSS.
Кто-нибудь сталкивался с этим?
источник
Вы почти получили это. Скажите jquery, что вы хотите загрузить только скрипт:
$("#myBtn").click(function() { $("#myDiv").load("trackingCode.html script"); });
источник
Я написал следующий плагин jquery для функции загрузки html: http://webtech-training.blogspot.in/2010/10/dyamic-html-loader.html
источник
Проверьте это в файле trackingCode.html:
<script type="text/javascript"> $(function() { show_alert(); function show_alert() { alert("Inside the jQuery ready"); } }); </script>
источник
Я столкнулся с этим, когда скрипты загружались один раз, но повторные вызовы не запускали скрипт.
Оказалось, что проблема заключается в использовании .html () для отображения индикатора ожидания и последующего связывания .load () после него.
// Processes scripts as expected once per page load, but not for repeat calls $("#id").html("<img src=wait.gif>").load("page.html");
Когда я делал им отдельные вызовы, мои встроенные скрипты загружались каждый раз, как и ожидалось.
// Without chaining html and load together, scripts are processed as expected every time $("#id").html("<img src=wait.gif>"); $("#id").load("page.html");
Для дальнейшего исследования обратите внимание, что существует две версии .load ()
Простой вызов .load () (без селектора после URL) - это просто сокращение для вызова $ .ajax () с dataType: "html" и получения возвращаемого содержимого и вызова .html () для помещения этого содержимого в DOM . А в документации для dataType: «html» четко указано, что «включенные теги сценария оцениваются при вставке в DOM». http://api.jquery.com/jquery.ajax/ Итак .load () официально запускает встроенные скрипты.
У сложного вызова .load () есть селектор, например load ("page.html #content"). При таком использовании jQuery целенаправленно отфильтровывает теги сценариев, как описано в статьях вроде этой: https://forum.jquery.com/topic/the-load-function-and-script-blocks#14737000000752785 В этом случае сценарии никогда не бежать, ни разу.
источник
Если вы хотите загрузить и HTML, и скрипты, вот более автоматизированный способ сделать это, используя оба
$(selector).load()
иjQuery.getScript()
. В этом конкретном примере загружается HTML-содержимое элемента с идентификатором «toLoad» изcontent.html
, вставляется HTML- код в элемент с идентификатором «content», а затем загружаются и запускаются все сценарии внутри элемента с идентификатором «toLoad».$("#content").load("content.html #toLoad", function(data) { var scripts = $(data).find("script"); if (scripts.length) { $(scripts).each(function() { if ($(this).attr("src")) { $.getScript($(this).attr("src")); } else { eval($(this).html()); } }); } });
Этот код находит все элементы сценария в загружаемом содержимом и просматривает каждый из этих элементов. Если у элемента есть
src
атрибут, то есть это скрипт из внешнего файла, мы используемjQuery.getScript
метод выборки и запуска скрипта. Если элемент не имеетsrc
атрибута, то есть это встроенный скрипт, мы просто используем егоeval
для запуска кода. Если он не находит элементов сценария, он вставляет только HTML в целевой элемент и не пытается загрузить какие-либо сценарии.Я тестировал этот метод в Chrome, и он работает. Не забывайте соблюдать осторожность при использовании
eval
, так как он может запускать потенциально небезопасные сценарии и обычно считается вредным. Возможно, вы захотите избежать использования встроенных скриптов при использовании этого метода, чтобы избежать использованияeval
.источник
Что ж, у меня была та же проблема, которая, казалось, возникла только для Firefox, и я не мог использовать другую команду JQuery, кроме .load (), поскольку я изменял интерфейс для существующих файлов PHP ...
В любом случае, после использования команды .load () я встроил свой сценарий JQuery во внешний загружаемый HTML-код, и, похоже, он работал. Я не понимаю, почему JS, который я загрузил в верхней части основного документа, не работал с новым контентом ...
источник
Мне удалось решить эту проблему, изменив
$(document).ready()
наwindow.onLoad()
.источник
Переходя к ответу @efreed ...
Я использовал
.load('mypage.html #theSelectorIwanted')
для вызова контента со страницы с помощью селектора, но это означает, что он не выполняет встроенные скрипты внутри.Вместо этого я смог изменить свою разметку так, чтобы
'#theSelectorIwanted'
она стала собственным файлом, и я использовалload('theSelectorIwanted.html`, function() {});
и он отлично запускал встроенные скрипты.
Не у всех есть такая возможность, но это был быстрый обходной путь, чтобы добраться туда, куда я хотел!
источник