在Rails应用程序中调用jQuery函数的次数太多了

时间:2014-05-28 02:57:25

标签: javascript jquery html ruby-on-rails

在我的Rails应用程序中,我正在提交单个UI操作(更改select值),但相应的函数被调用两次。功能如下。

    // doc.js
    $(document).on("change", "select.class", (function(){
        if ($("select.otherSelect").find(":selected").is( ":disabled" ) == false) {
            $.ajax({
                  //Ajax call
            });
            console.log("Selector was changed")
        }
    }));

我知道函数被多次调用,因为当我仅更改select元素一次时,JS控制台中出现了“Selector was changed”文本不止一次。在写这篇文章之前,连续六次更改select元素会导致函数被调用一次,然后两次,然后是四次,然后是八次,然后是十六次,然后是三十二次。

为什么会这样?

2 个答案:

答案 0 :(得分:1)

我解决了这个问题。首先,我有一个整个页面,其元素由$(document).ready(function() {中的函数绑定。这成了问题,因为我使用select异步地用页面中的许多元素替换需要被这些函数绑定的新元素(但是没有,因为绑定只发生一次)。

为了解决这个问题,我将$(document).ready(function() {中的所有内容复制到函数docReady()中,然后在docReady()内调用$(document).ready(function() {,每当我异步重新加载内容时这页纸。这个策略引起了我的错误;现在我绑定了页面的每个元素,包括select本身!

现在,我在select中只调用了一次$(document).ready(function() {的绑定函数,并且每次select更改它时,我都会调用异步生成的元素的绑定函数值。

答案 1 :(得分:0)

您可以尝试这样:

$(document).on("change", "select.class", (function(){
if($(this).data('clicked')) {
      return;
  }
        if ($("select.otherSelect").find(":selected").is( ":disabled" ) == false) {
            $.ajax({
                  //Ajax call
            });
            console.log("Selector was changed")
        }
$(this).data('clicked', true);
    }); //removed here was extra )