使用jQuery 3.6.1.我的代码是:
OSH.setDivisions = function() {
let rows = $("input[name^='compdiv']");
rows.on("blur", OSH.doDivisions)
}
OSH.doDivisions = function() {
alert("In doDivisions()");
if (OSH.emptyDivisions() == 0) {
OSH.addDivision();
}
}
当页面加载时,没有任何事情发生,正如预期的那样。然后,如果我将焦点放在一个name属性以'compdiv'开头的input元素上,然后将焦点移开(通过Tab键或单击),则会弹出警报,正如预期的那样;但当我关闭警报时,它又会弹出来,我想关闭多少次就弹多少次。代码中没有其他内容调用奥什.doDivisions(),也没有编写触发器。
如果有关系,我的页面有一个带有文本输入字段表的表单。该表是用html静态编码的,其中一行包含三个文本输入字段,如下所示:
<tr>
<td><input id="compdiv_name[]" name="compdiv_name[]" type="text" style="width:320px"/></td>
<td><input id="compdiv_adult[]" name="compdiv_adult[]" type="text" style="width:60px"/></td>
<td><input id="compdiv_jr[]" name="compdiv_jr[]" type="text" style="width:60px"/></td>
</tr>
因此,所有三个输入字段都有空值。
其思想是,当焦点离开其中一个字段时,奥什.doDivisions()被触发以调用OSH.emptyDivisions(),OSH.emptyDivisions()依次计算包含3个空值输入字段的行数。如果没有包含3个空值的行,则调用奥什.addDivision()来添加另一行。我确信这是一种常见的模式。
但我不明白为什么这样做不起作用,doDivisions被反复调用,即使我没有触摸表单。
更新:下面是其他函数的代码,奥什. emptyDivisons(),zer00ne怀疑它是罪魁祸首,还有它调用的OSH.addDivision(),以及底部的$(document.ready()调用:
OSH.emptyDivisions = function() {
let numempty = 0;
let values = [];
let rows = $("input[name^='compdiv']");
for (let i = 0; i < rows.length; ++i) {
if (rows[i].type != "text") {
continue;
}
if (rows[i].name == "compdiv_name[]") {
values[i] = rows[i].value;
if (rows[i + 1].name == "compdiv_adult[]") {
values[i] += rows[i + 1].value;
if (rows[i + 2].name == "compdiv_jr[]") {
values[i] += rows[i + 2].value;
if (values[i] == "") {
++numempty;
i += 2;
}
}
}
}
}
return numempty;
}
OSH.addDivision = function() {
let data = '\
<tr>\
<td><input id="compdiv_name[]" name="compdiv_name[]" type="text" style="width:320px"/></td>\
<td><input id="compdiv_adult[]" name="compdiv_adult[]" type="text" style="width:60px"/></td>\
<td><input id="compdiv_jr[]" name="compdiv_jr[]" type="text" style="width:60px"/></td>\
</tr>\
';
$("#lastDivision").before(data);
}
$(document).ready(OSH.setDivisions());
1条答案
按热度按时间laawzig21#
在厌倦了解雇
alert(In doDivisions())
,我把它改成console.log("In doDivisions());
和低,看它不再循环!所以我的结论是,解除警报会触发任何/所有(?)页面上可见的输入元素。实际上,我看到我的问题已经有了答案here