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

当上述内容装入AJAX从someScript.js每一个事件监听器变得活跃并保持,即使内容被通过jQuery稍后移除像这样这似乎是等效于如何从特定的加载文件中删除所有事件侦听器?

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

$("#loaded-content").remove(); 

如果内容不断加载和删除,应该怎么做以防止同一个事件监听器被激活多次?我尝试添加一个全局变量var scriptHasRun = false;,然后在someScript.js下面的代码:

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

    <more code> 

}); 

它为someScript.js,但随后而来someOtherScript.js出现被加载同样的方式,这样可以防止事情事先我用同样的方法与另一个变量var otherScriptHasRun = false;和第二次它在页面中加载它不再工作。当我取消支票时,它开始正常工作。我想知道如何复制someOtherScript.js的情况,或者在正常情况下,可能会导致someScript.js多次加载?

回答

0

我看到你正在使用jQuery。我不知道你有someScript.js,但是你可以使用

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

从元件附它,所以它不会被多次附加之前解除绑定事件。

我试图使用的其他选项是广告特定事件相关的类元素来标记它们已经附加事件,并使用类似下面的行来附加事件,所以你可以跳过使用变量scriptHasRun来检查是否脚本已被加载。

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

这是为了解除每个单独的元素。在'someOtherScript.js'的情况下,当我删除调用它的html时,所有东西都解除绑定。 – Nadroev

0

这可能是因为在someScript.js事件监听器绑定到身体和someOtherScript.js的那些绑定到元素本身,因此不需要对他们如果脚本之前已经运行的代码检查,但仍然是someScript.js