Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 由于rails资产多次触发jQuery事件?_Javascript_Jquery_Ruby On Rails_Asset Pipeline - Fatal编程技术网

Javascript 由于rails资产多次触发jQuery事件?

Javascript 由于rails资产多次触发jQuery事件?,javascript,jquery,ruby-on-rails,asset-pipeline,Javascript,Jquery,Ruby On Rails,Asset Pipeline,我看过这篇文章,但我仍然不明白为什么会发生这种情况 我正在开发一个rails-4.2.9应用程序,并定制了一个.js,如下所示: $(function() { var $addNotificationButton = $('#add-notification-button') $addNotificationButton.on('click', function() { console.log("hi from js") //Code for la

我看过这篇文章,但我仍然不明白为什么会发生这种情况

我正在开发一个
rails-4.2.9
应用程序,并定制了一个
.js
,如下所示:

$(function() {
    var $addNotificationButton = $('#add-notification-button')
    $addNotificationButton.on('click', function()
    {
      console.log("hi from js")
      //Code for launching a dialog       
    })
});  
现在,当第一次加载页面并单击按钮时,我只看到1条打印语句,并看到对话框在新的
路径中启动。当我关闭对话框并重新单击按钮时,我可以在控制台上看到2条打印语句,下次是3条,依此类推

我的
.js
放在
Application.js
中,在控制台上我看到了
Application.js
中的一条打印语句,但其他的附加语句来自
Chrome
中的
VM-2058.js
Firefox
中的
foundation.js
。我不知道这些是在哪里或如何出现的

我的问题是:

1) 为什么会这样?我认为print语句只会在单击按钮时执行。这不是
jquery
事件处理程序的工作方式吗

2) 虽然我可以阻止它使用
one
而不是
上的
,但我的一位同事提到,我们不应该使用
one
,因为它在第一次单击后将事件从按钮上解除绑定,而只查看加载
控制器所需的
.js
。这也行,但我们应该这样做吗?我意识到这是一个与rails资产相关的问题

我的
application.js
如下所示:

//= require_tree .
//= require ./notification (refers to the .js file above)

问题是您正在设置多个
”。在('click'..)
“处理程序上。我不确定代码的剩余部分,但肯定有什么东西在调用/重新加载JS文件,并多次执行匿名函数,每次都向
事件添加一个“bind”。这就是为什么它会随着点击次数的增加而增加?也许您的对话框再次加载JS?不确定

如果您这样做:

$(function() {
    var $addNotificationButton = $('#add-notification-button')
    $addNotificationButton.off('click').on('click', function()
    {
      console.log("hi from js")
      //Code for launching a dialog       
    })
});  

它应该像您期望的那样工作,它将解除任何现有的“点击”事件的绑定(因此,如果您有其他绑定的内容,则需要重新绑定)

“绑定”是在每次将文件加载到document ready时发生还是仅在单击按钮时发生?是否有办法检查JS文件何时加载?@linuxNoob这将取决于application.html结构、加载的视图、加载对话框的方式以及呈现的剩余JS。如果您显示视图,“对话框”是什么以及您可能要加载的剩余JS,包括“就绪”事件等等,那么我们可能可以确定它有一个指向application.html.haml-的链接。在剩下的JS中没有其他事件,除了文档就绪和按钮点击。我相信在层下面的对话框是一个引导JS模式。