2017-10-19 1 views
1
<div id="loaded-content"> 
    @Scripts.Render("~/someScript.js") 
</div> 

Dies scheintWie werden alle Ereignislistener aus einer bestimmten geladenen Datei entfernt?

<div id="loaded-content"> 
    <script src="/someScript.js"></script> 
</div> 

Wenn der obige Gehalt mit ajax jedes Ereignis Hörer von someScript.js aktiv wird und bleibt, selbst geladen ist äquivalent zu sein, wenn der Inhalt später über jQuery wie so entfernt wird:

Was sollte getan werden, um zu verhindern, dass dieselben Ereignis-Listener mehrmals aktiviert werden, wenn der Inhalt ständig geladen und entfernt wird? Ich habe versucht, eine globale Variable var scriptHasRun = false; hinzufügen, dann der folgenden Code in someScript.js:

$(document).ready(function(){ 
    if(scriptHasRun){ 
     return; 
    } 
    scriptHasRun = true; 

    <more code> 

}); 

Es funktioniert für someScript.js, aber dann kam someOtherScript.js, die die gleiche Art und Weise geladen, so zu sein scheint, die Dinge im Voraus zu verhindern, dass ich das gleiche verwendet Methode mit einer anderen Variablen var otherScriptHasRun = false; und das zweite Mal, wenn es in der Seite geladen wird, funktioniert es nicht mehr. Es begann normal zu funktionieren, als ich den Scheck entfernte. Ich würde gerne wissen, wie man die Umstände von someOtherScript.js repliziert, oder falls das normal ist, was dazu führen könnte, dass someScript.js mehrfach geladen wird?

Antwort

0

Ich sehe, dass Sie jQuery verwenden. Ich bin mir nicht sicher, was Sie in someScript.js haben, aber Sie können verwenden

$('#element').off('click', handleClick); 

vor dem Anbringen es Ereignis von Element zu lösen, so dass es nicht mehrfach angebracht bekommt. Andere Option, die ich versuchen würde, ist, bestimmte ereignisbezogene Klassen für ein Element anzubringen, um sie als bereits anhängendes Ereignis zu markieren und etwas wie die folgende Zeile zu verwenden, um die Ereignisse anzuhängen, damit Sie die Variable scriptHasRun verwenden können Skript wurde geladen.

$('#myElemetSelector:not(.boundToEventX)').addClass('boundToEventX').on('click', onElemetClickedFunction); 
+0

Das ist für die Bindung jedes einzelnen Elements. Im Fall von 'someOtherScript.js' löst sich alles auf, wenn ich den html entferne, der es aufgerufen hat. – Nadroev

0

Es ist wahrscheinlich, weil die Veranstaltung Zuhörer in someScript.js an den Körper gebunden sind, und die, die in someOtherScript.js sind die Elemente selbst gebunden, so dass der Code, wenn das Skript vor ihnen nicht benötigt wird, ausgeführt wurde überprüft , ist aber immer noch für someScript.js.

Verwandte Themen