Wydaje się, że jest to problem związany tylko z Safari. Wypróbowałem 4 na Macu i 3 na Windowsie i nadal nie mam szczęścia.
Próbuję załadować zewnętrzny plik HTML i wykonać osadzony JavaScript.
Kod, którego próbuję użyć, jest następujący:
$("#myBtn").click(function() {
$("#myDiv").load("trackingCode.html");
});
trackingCode.html
wygląda następująco (teraz jest prosty, ale rozwinie się raz / jeśli to działa):
<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>
Widzę oba komunikaty ostrzegawcze w IE (6 i 7) oraz Firefox (2 i 3). Nie widzę jednak wiadomości w Safari (ostatnia przeglądarka, którą muszę się martwić - wymagania projektu - proszę o żadne wojny ognia).
Jakieś przemyślenia na temat tego, dlaczego Safari ignoruje JavaScript w trackingCode.html
pliku?
Ostatecznie chciałbym móc przekazywać obiekty JavaScript do tego trackingCode.html
pliku, aby były używane w wywołaniu gotowym do jQuery, ale chciałbym się upewnić, że jest to możliwe we wszystkich przeglądarkach, zanim pójdę tą drogą.
$("#images").load(location.href+" #images",function(){ $.getScript("js/productHelper.js"); });
źródło
Inna wersja wcześniejszego rozwiązania Johna Pick'a działa dobrze:
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); } ); } ... });
źródło
Zdaję sobie sprawę, że jest to nieco starszy post, ale dla każdego, kto przychodzi na tę stronę i szuka podobnego rozwiązania ...
http://api.jquery.com/jQuery.getScript/
źródło
Wydaje się, że to nie działa, jeśli ładujesz pole HTML do dynamicznie utworzonego elementu.
$('body').append('<div id="loader"></div>'); $('#loader').load('htmlwithscript.htm');
Patrzę na firebug DOM i nie ma żadnego węzła skryptu, tylko HTML i mój węzeł CSS.
Czy ktoś to spotkał?
źródło
Prawie to masz. Powiedz jquery, że chcesz załadować tylko skrypt:
$("#myBtn").click(function() { $("#myDiv").load("trackingCode.html script"); });
źródło
Napisałem następującą wtyczkę jquery do funkcji ładowania html: http://webtech-training.blogspot.in/2010/10/dyamic-html-loader.html
źródło
Przetestuj z tym w trackingCode.html:
<script type="text/javascript"> $(function() { show_alert(); function show_alert() { alert("Inside the jQuery ready"); } }); </script>
źródło
Natknąłem się na to, w którym skrypty ładowały się raz, ale powtarzanie wywołań nie powodowało uruchomienia skryptu.
Okazało się, że wystąpił problem z używaniem .html () do wyświetlenia wskaźnika oczekiwania, a następnie połączeniem .load () po nim.
// Processes scripts as expected once per page load, but not for repeat calls $("#id").html("<img src=wait.gif>").load("page.html");
Kiedy wykonywałem oddzielne wywołania, moje wbudowane skrypty ładowały się za każdym razem zgodnie z oczekiwaniami.
// Without chaining html and load together, scripts are processed as expected every time $("#id").html("<img src=wait.gif>"); $("#id").load("page.html");
Aby uzyskać dalsze badania, zwróć uwagę, że istnieją dwie wersje .load ()
Proste wywołanie .load () (bez selektora po adresie url) jest po prostu skrótem do wywołania $ .ajax () z dataType: "html" i pobrania zwracanej zawartości i wywołania .html () w celu umieszczenia tej zawartości w DOM . Dokumentacja dotycząca dataType: „html” wyraźnie stwierdza, że „dołączone tagi skryptów są oceniane po wstawieniu do DOM”. http://api.jquery.com/jquery.ajax/ So .load () oficjalnie uruchamia skrypty wbudowane.
Złożone wywołanie .load () ma selektor, taki jak load ("page.html #content"). Gdy jest używany w ten sposób, jQuery celowo odfiltrowuje tagi skryptów, jak omówiono w artykułach takich jak ten: https://forum.jquery.com/topic/the-load-function-and-script-blocks#14737000000752785 W tym przypadku skrypty nigdy uciekaj, ani razu.
źródło
Jeśli chcesz załadować zarówno kod HTML, jak i skrypty, oto bardziej zautomatyzowany sposób, korzystając z obu
$(selector).load()
ijQuery.getScript()
. Ten konkretny przykład ładuje zawartość HTML elementu o identyfikatorze „toLoad” zcontent.html
, wstawia kod HTML do elementu o identyfikatorze „content”, a następnie ładuje i uruchamia wszystkie skrypty w elemencie o identyfikatorze „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()); } }); } });
Ten kod znajduje wszystkie elementy skryptu w ładowanej treści i przechodzi przez każdy z tych elementów. Jeśli element posiada
src
atrybut, czyli jest to skrypt z zewnętrznego pliku, używamyjQuery.getScript
metody pobierania i uruchamiania skryptu. Jeśli element nie masrc
atrybutu, co oznacza, że jest to skrypt wbudowany, po prostu używamy goeval
do uruchamiania kodu. Jeśli nie znajdzie żadnych elementów skryptu, wstawia wyłącznie kod HTML do elementu docelowego i nie próbuje załadować żadnych skryptów.Przetestowałem tę metodę w Chrome i działa. Pamiętaj, aby zachować ostrożność podczas używania
eval
, ponieważ może uruchamiać potencjalnie niebezpieczne skrypty i jest ogólnie uważany za szkodliwy. Możesz chcieć uniknąć używania wbudowanych skryptów podczas korzystania z tej metody, aby uniknąć konieczności używaniaeval
.źródło
Cóż, miałem ten sam problem, który wydawał się występować tylko w Firefoksie, i nie mogłem użyć innego polecenia JQuery oprócz .load (), ponieważ modyfikowałem front-end na istniejących plikach PHP ...
W każdym razie po użyciu polecenia .load () osadziłem mój skrypt JQuery w zewnętrznym ładowanym kodzie HTML i wydawało się, że działa. Nie rozumiem, dlaczego JS, który załadowałem na górze głównego dokumentu, nie działał dla nowej zawartości, jednak ...
źródło
Udało mi się rozwiązać ten problem, zmieniając
$(document).ready()
nawindow.onLoad()
.źródło
Tacking do @efreed answer ...
Używałem
.load('mypage.html #theSelectorIwanted')
do wywoływania treści ze strony za pomocą selektora, ale oznacza to, że nie wykonuje skryptów wbudowanych w środku.Zamiast tego mogłem zmienić moje znaczniki, aby
'#theSelectorIwanted'
stały się własnym plikiem i użyłemload('theSelectorIwanted.html`, function() {});
i działał dobrze wbudowane skrypty.
Nie każdy ma tę opcję, ale było to szybkie obejście, aby dostać się tam, gdzie chciałem!
źródło