我有以下javascript和jquery代码的两个问题。 每个循环的jquery只迭代一次,它得到具有正确ID的第一个元素,它做了它需要做的事情并停止。
第二个问题是,当我在代码中使用else时,每个函数内部的一个,它甚至不会尝试下一个if,它只是退出那里。 我可能做了一些根本性的错误,但是从jquery每个函数和我对其他函数的期望,我都看不到它。
Javascript代码:
var $checkVal;
var $checkFailed;
$("#compliance").live("keypress", function (e) {
if (e.which == 10 || e.which == 13) {
var checkID = $(this).parents('td').next().attr('id');
var checkVal = $(this).val();
$('#' + checkID).each(function () {
var cellVal = $(this).text();
if (checkVal == cellVal) {
$(this).removeClass("compFail").addClass("compOk");
} else {
$(this).removeClass("compOk").addClass("compFail");
var checkFailed = True;
}
});
if (checkFailed == 'True') {
(this).addClass("compFail");
} else {
(this).addClass("compOk");
}
}
});
我怎样才能让每个循环迭代遍历每个元素的所有实例,并将id分配给变量checkID,并让代码在else之后继续,这样它可以做到最后的if?
答案 0 :(得分:4)
id
应该只显示在一次页面上。如果您希望多个元素具有相同的ID,请使用class
,而不是id
。
您的each
仅循环播放一次,因为您正在按id
进行选择,因此您只选择页面中的一个元素。如果您将元素更改为class
,它应该像您期望的那样工作。
答案 1 :(得分:1)
每个循环的jquery只迭代一次,它得到第一个元素 使用正确的ID执行它需要做的事情并停止。
是的,这对于您正在使用的代码来说绝对正确:
$('#' + checkID).each(function(){};)
ID属性是唯一的。 DOM中必须只有一个具有给定ID的元素。您的选择器只能匹配一个元素。您正在迭代仅包含1个项目的集合。
答案 2 :(得分:1)
这是为了说明我在评论中所说的内容,这样就不会删除错误的var:
var checkVal;
var checkFailed;
$("#compliance").live("keypress", function (e) {
if (e.which == 10 || e.which == 13) {
var checkID = $(this).parents('td').next().attr('id');
//HERE is the first edit
checkVal = $(this).val();
$('#' + checkID).each(function () {
var cellVal = $(this).text();
if (checkVal == cellVal) {
$(this).removeClass("compFail").addClass("compOk");
} else {
$(this).removeClass("compOk").addClass("compFail");
//HERE is the second
checkFailed = True;
}
});
if (checkFailed == 'True') {
(this).addClass("compFail");
} else {
(this).addClass("compOk");
}
}
});
通常情况下,您拥有它的方式会导致编译时错误(使用类似C#的类型语言)来重新声明变量。在这里,我不清楚它是否会被用作局部变量(忽略你的全局变量),或者如果javascript将它们组合起来并认为它们是相同的。无论哪种方式,你都应该像我展示的那样使用它,这样你的意图就更清晰了。
编辑:我已经从你的变量中删除了$(var $ checkVal),因为在jsFiddle上它导致了问题。所以,如果你不需要那些$,那么删除它们。另外,请注意,对jsFiddle进行测试表明您不需要更改代码(除了可能从声明中删除$),因为javascript似乎认为它们是相同的变量,尽管重新声明,我觉得有点令人惊讶tbh。