Ich habe im Internet herumgesucht, um herauszufinden, was hier vor sich geht, und konnte keine konkrete Antwort erhalten.
Ich habe eine $(document).ready
auf meiner Site, die unabhängig vom darin enthaltenen Code mehrere Male ausgeführt werden kann.
Ich habe in den Fehlerberichten für jQuery nachgelesen, wie das .ready
Ereignis zweimal ausgelöst wird, wenn in Ihrer Anweisung eine Ausnahme auftritt. Aber selbst wenn ich den folgenden Code habe, läuft er immer noch zweimal:
$(document).ready(function() {
try{
console.log('ready');
}
catch(e){
console.log(e);
}
});
In der Konsole wird nur zweimal "fertig" protokolliert. Ist es möglich, dass ein anderer. Bereits mit einer Ausnahme ein Problem verursacht? Mein Verständnis war, dass alle .ready-Tags unabhängig voneinander waren, aber ich kann anscheinend nicht herausfinden, wo dies ins Spiel kommt?
Hier ist der Kopfblock für die Site:
<head>
<title>${path.title}</title>
<meta name="Description" content="${path.description}" />
<link href="${cssHost}${path.pathCss}" rel="stylesheet" type="text/css" />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript" charset="utf-8"><!----></script>
<script src="media/js/fancybox/jquery.fancybox.pack.js" type="text/javascript" ><!-- --></script>
<script src="/media/es/jobsite/js/landing.js" type="text/javascript" ><!-- --></script>
<script src="/media/es/jobsite/js/functions.js" type="text/javascript"><!-- --> </script>
<script src="/media/es/jobsite/js/jobParsing.js" type="text/javascript" charset="utf-8"><!----></script>
<script src="/media/es/jobsite/js/queryNormilization.js" type="text/javascript" charset="utf-8"><!----></script>
<script src="${jsHost}/js/jquery/jquery.metadata.js" type="text/javascript" charset="utf-8"><!----></script>
<script src="${jsHost}/js/jquery/jquery.form.js" type="text/javascript" charset="utf-8"><!----></script>
<script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.7/jquery.validate.min.js" type="text/javascript" charset="utf-8"><!----></script>
<script src="${jsHost}/js/jquery.i18n.properties-min.js" type="text/javascript" charset="utf-8"><!----></script>
<script type="text/javascript" charset="utf-8">
function updateBannerLink() {
var s4 = location.hash.substring(1);
$("#banner").attr('href','http://INTELATRACKING.ORG/?a=12240&c=29258&s4='+s4+'&s5=^');
}
</script>
</head>
Achten Sie nicht auf die JSP-Variablen, aber wie Sie sehen, rufe ich die Datei functions.js nur einmal auf (dort ist die Funktion .ready vorhanden).
quelle
Antworten:
Das Ready-Ereignis kann nicht zweimal ausgelöst werden. Es ist mehr als wahrscheinlich, dass Sie Code haben, der das Element, in dem der Code enthalten ist, verschiebt oder manipuliert, wodurch der Browser den Skriptblock erneut ausführt.
Dies kann vermieden werden, indem Skript-Tags in das
<head>
oder vor dem schließenden</body>
Tag eingefügt und nicht verwendet werden$('body').wrapInner();
. Verwenden$('body').html($('body').html().replace(...));
hat den gleichen Effekt.quelle
<head>
src="#"
Attributen, da dieselbe Seite im übergeordneten Fenster und im Iframe geladen wird. Daher sieht es so aus, als würde Code zweimal aufgerufen. Entfernen Sie dassrc
Attribut oder setzen Sie es auf"about:blank"
, um ein solches Verhalten zu vermeiden.Es ist mir auch passiert, aber ich habe festgestellt, dass das Skript aufgrund einer schlechten Zusammenführung zweimal enthalten war.
quelle
Dies ist mir bei der Verwendung von KendoUI passiert. Wenn Sie ein Popup-Fenster aufrufen, wird das
document.ready
Ereignis mehrmals ausgelöst . Die einfache Lösung besteht darin, ein globales Flag so zu setzen, dass es nur einmal ausgeführt wird:var pageInitialized = false; $(function() { if(pageInitialized) return; pageInitialized = true; // Put your init logic here. });
Es ist eine Art Hack-ish, aber es funktioniert.
quelle
Stellen Sie sicher, dass Sie die JS-Datei nicht zweimal einschließen. Das war mein Fall
quelle
Sie könnten in Betracht ziehen, zu verwenden
window.onload
anstatt
$(document).ready
quelle
Versuchen Sie, dies in Ihre functions.js einzufügen, um zu verhindern, dass es zweimal ausgeführt wird:
var checkit = window.check_var; if(checkit === undefined){ //file never entered. the global var was not set. window.check_var = 1; } else { //your functions.js content }
Ich schlage jedoch vor, dass Sie mehr darüber nachdenken, um zu sehen, wo Sie das zweite Mal anrufen.
quelle
Ich hatte ein ähnliches Problem, als ich versuchte, einen Teil zu aktualisieren. Ich habe ein return ActionResult anstelle eines return PartialViewResult aufgerufen. Das ActionResult hat dazu geführt, dass mein ready () zweimal ausgeführt wurde.
quelle
Es besteht die Möglichkeit, dass dieses Problem auftritt, wenn Sie denselben Controller zweimal im HTML-Code hinzufügen.
Zum Beispiel:
[js]
app.controller('AppCtrl', function ($scope) { $(document).ready(function () { alert("Hello"); //this will call twice }); });
[html]
//controller mentioned for the first time <md-content ng-controller="AppCtrl"> //some thing </md-content> //same controller mentioned again <md-content ng-controller="AppCtrl"> //some thing </md-content>
quelle
Ich hatte heute ein ähnliches Problem. A hat in meinem Fall
<button type="submit">
das$(document).ready(...)
Ereignis erneut ausgelöst . Ändern des Codes, um<button type="button">
das Problem für mich zu lösen.Siehe document.ready-Funktion, die nach dem Senden-Button erneut aufgerufen wird? hier auf stackoverflow für weitere details.
quelle
In meinem Fall wurde $ (document) .ready wegen schlechten CSS zweimal ausgelöst. Überprüfen Sie, ob ein Teil Ihres CSS vorhanden ist
background-image: url('');
quelle
Wenn der Iframe nichts anzeigt und aus anderen Gründen verwendet wird (z. B. zum Hochladen einer Datei ohne erneutes Laden), können Sie Folgendes tun:
<iframe id="upload_target" name="upload_target" style="width:0;height:0;border:0px solid #fff;"></iframe>
Beachten Sie, dass src nicht enthalten ist, wodurch verhindert wird, dass der zweite Bereitschaftsauslöser im Dokument ausgelöst wird.
quelle
Ich hatte dieses Problem mit der window.load-Funktion wurde zweimal ausgeführt: Der Grund war, dass ich auf der Hauptseite auf dieselbe Javascript-Datei sowie auf eine .net-Benutzersteuerung verwiesen hatte. Als ich den Verweis auf der Hauptseite entfernte, wurde die Ladefunktion nur einmal ausgeführt.
quelle
Das ist mir heute Morgen passiert ... und was ich herausgefunden habe, nachdem ich einen HTML-Code in einer kürzlich manipulierten jquery-modalen Form genau untersucht hatte, dass ich versehentlich ein schließendes Tabellen-Tag entfernt hatte. Ich habe mir noch nicht die Zeit genommen, um vollständig zu verstehen, warum die Funktion document.ready dadurch zweimal aufgerufen wurde , aber es tat es. Durch Hinzufügen des Closing Table-Tags wurde dieses Problem behoben.
jQuery JavaScript Library v1.8.3 (ja, es ist eine Legacy-App)
quelle