触发更改所有选择但触发的选择

时间:2016-01-02 16:05:04

标签: jquery

所以我有一些选择元素,当其中一个触发更改事件时,我想在其他元素上触发它。我得到"调用堆栈大小超过"使用以下代码时:

$('select').change(function(e){
    $('select').not(this).change();
});

我认为错误是因为这里有某种方式存在无限循环,但我无法看到它是怎样的。

3 个答案:

答案 0 :(得分:0)

您正在触发其他select更改事件,然后将触发所有其他事件,依此类推......导致无限循环。

您的最佳下注是检查事件是否是手动触发,而不是用户互动:

$('select').change(function(e) {
  if (e.isTrigger) return;
  $('select').not(this).change();
});

编辑好我不好,你最好的选择是检查event.originalEvent

$('select').change(function(e) {
  if (!e.originalEvent) return;
  $('select').not(this).change();
});

See why

来自主要开发核心:

  

不确定它是否已准备好加入公共API

答案 1 :(得分:0)

这是因为在其他选择中你有相同的事件。假设您有2个选择:1和2。

当1更改时,会发生更改事件并在2上触发更改事件(这就是您想要的)。但是2上的更改事件也会触发所有其他选择上的更改事件(这已经是您想要避免的事情)。在这里你有一个无限循环,顺便说一句,甚至不是线性的。

您可能要做的是在全局变量中设置一些标志(或者在event.data对象中添加一些属性,参见here),这将仅在第一次迭代时激活。

答案 2 :(得分:0)

避免使用inifite循环的另一种方法是:

var key = null;
$.ajax({
    type: "POST",
    url: "GetRecord?DB=EMP&Table=EMP_HISTORY",
    dataType: 'xml',
    data: {
        "Where": "COMPANY='" + companies_name + "'"   
    },
    success: function(xml) {
        $(xml).find('record').each(function() {
            key = $(this).find("KEY").text();
        });

        if (key) {
            var url = "GetDisplay?Template=Record/test.htm&DB=EMP&Table=EMP_HISTORY&Where=KEY=" + key + "";
            window.open(url, "_self");
        }
    },
    error: function(error) {
        alert('error');
    }
});