所以我有一些选择元素,当其中一个触发更改事件时,我想在其他元素上触发它。我得到"调用堆栈大小超过"使用以下代码时:
$('select').change(function(e){
$('select').not(this).change();
});
我认为错误是因为这里有某种方式存在无限循环,但我无法看到它是怎样的。
答案 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();
});
来自主要开发核心:
不确定它是否已准备好加入公共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');
}
});