超出最大调用堆栈大小,无限循环

时间:2016-05-15 13:00:30

标签: javascript jquery jquery-select2

我有三个Select2框。当我更改一个时,所有未点击的都需要重置。当我这样做,它会导致无限循环,我得到标题中列出的错误。我该如何解决这个问题?

var group = $(".searchgroup1");

group.on('change', function(){
    var box = group.index($(this));
    group.each(function(index){
        if(box != index){
            $(this).val(null).trigger("change"); // <-- this resets the <select>
            //If I remove the code up here, the infinite loop disappears
        }
    });
});

1 个答案:

答案 0 :(得分:4)

jQuery&#39; s trigger(没有参数调用的click)调用元素同步上的事件处理程序。由于您正在触发您正在处理的事件,因此您无需使用get-out子句以递归方式有效地调用事件处理程序,因此您的堆栈用完了。

以下证明回调是同步的:

&#13;
&#13;
$("#foo").on("click", function() {
  log("Clicked");
});
log("Clicking");
$("#foo").click();
log("Done clicking");

function log(msg) {
  $("<p>").text(msg).appendTo(document.body);
}
&#13;
<div id="foo"></div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

您可以通过将调用包装在setTimeout

中来使调用异步
var $this = $(this);
$this.val(null);
setTimeout(function() {
    $this.trigger("change");
}, 0);