Javascript 无法解除绑定事件侦听器-TurboLink缓存出现问题

Javascript 无法解除绑定事件侦听器-TurboLink缓存出现问题,javascript,jquery,event-listener,turbolinks,Javascript,Jquery,Event Listener,Turbolinks,我将绑定就绪事件侦听器,然后解除其与文档的绑定 $(document).bind("ready", readyEventHandler); function readyEventHandler() { // run some code $(document).unbind("ready"); } 该代码不会产生错误,并且可以正常工作。但是,我的javascript被缓存并复制代码,因此如果我在浏览器中返回并转发一个页面,那么我将多次运行此代码。发生这种情况时,根本不会调用就绪事件侦

我将绑定就绪事件侦听器,然后解除其与文档的绑定

$(document).bind("ready", readyEventHandler);

function readyEventHandler() {
  // run some code

  $(document).unbind("ready");
}

该代码不会产生错误,并且可以正常工作。但是,我的javascript被缓存并复制代码,因此如果我在浏览器中返回并转发一个页面,那么我将多次运行此代码。发生这种情况时,根本不会调用就绪事件侦听器。我是否正确解除了此事件侦听器的绑定?我知道缓存问题会有问题(这是单独的问题),但我只想绑定ready event listener,让它运行代码,然后解除绑定。

不太确定它会有帮助,但这里是我的2美分-而不是尝试解除绑定
readyEventHandler
-确保如果运行一次函数,它不会运行两次:

var readyHandlerRun = false;

$(document).bind("ready", readyEventHandler);

function readyEventHandler() {
    if (readyHandlerRun) {
        return;
    }
    readyHandlerRun = true;
    // Rest of your code...
}
刚才弹出的另一个选项:

$(document.bind(“ready”,readyEventHandler);
函数readyEventHandler(){
readyEventHandler=函数(){}
console.log('ready');
//剩下的代码。。。
}

如果您只想使用eventhamdler一次,您可以使用
one
而不是
bind

$(document).one("ready", function() {
   // code to run on document ready just for once
});

重新绑定
ready
是没有意义的。它只在页面首次加载时发生一次。通过解除绑定并重新绑定ready事件,您真正想要实现的是什么?@Barmar,这是不正确的。文档准备好后,
ready
事件将触发(这意味着如果在文档准备好后绑定
ready
事件,则回调函数将立即被调用)。@Barmar,我真的不希望这个问题与缓存有关。虽然缓存是一个问题,但目前无法修复。我一直在使用一些会多次加载的javascript,我只想调用一次
readyEventHandler
。不是两次,不是三次,一次<代码>$(文档).ready不会这样做<代码>绑定(“就绪”)执行。希望这能有所帮助。@Barmar jQuery的
ready
事件的行为与其他事件不同。jQuery的文档中写道:“然而,jQuery的.ready()方法在一个重要且有用的方面有所不同:如果DOM就绪,浏览器在代码调用.ready(handler)之前触发DOMContentLoaded,则函数处理程序仍将被执行。相反,在事件触发后添加的DOMContentLoaded事件侦听器永远不会执行。”这意味着
ready
处理程序即使在文档加载完成后很好地进行了附加,仍然会启动。这是一个非常好的解决方案。这就是我真正提出的建议。但是现在我们正在尝试看看是否有其他解决方案,主要是通过解除事件侦听器的绑定。此解决方案可能会对我们的代码产生问题。也就是说,如果没有其他人使用unbind给出有效的回答,我会相信你。我的情况是独一无二的,我认为这个解决方案对其他人都适用。只是不是我:/I我正在试图了解您的代码将如何/在何处运行
readyEventHandler
两次涡轮链接缓存。有时是地狱。更详细地说,每次我点击页面时,Turbolinks都会存储多个Javascript副本(我们称之为主页)。每次我在浏览器中回击然后转发时,Turbolinks都会缓存主页的JS代码。因此,如果我的JS代码具有
$(document).ready
,并且TurboLink存储了该代码的多个缓存,并且我点击了主页,那么将调用多个document ready EventHandler。我正试图通过使用
bind
来解决这个问题。那么你的问题是,即使你
unbind
这个事件-一旦JS代码从缓存中取出,它将再次被TurboLink绑定,回调将被调用。。唯一的解决方案是在函数已经运行的情况下阻止它运行,并且您必须有一个全局变量来告诉您这一点。