我无疑是编程的超级新手。我正在尝试设计一个快速的javascript注入网站上的一个类,它将取消选中并模拟一系列复选框上的点击。这并不是恶意的,我们用来下载数据以供在这个类中使用的Web表单提供了比必要更多的变量,如果我们可以“取消选中”all并且只检查我们想要的那些变量,那将会更加方便。但是,只需通过javascript注入取消选中这些框就不会产生所需的结果。必须在每个框上模拟鼠标单击。我一直试图使用.click()函数无济于事。任何帮助是极大的赞赏。我的代码失败,错误为:
“TypeError:无法读取属性'click'of null”
CODE:
var getInputs = document.getElementsByTagName("input");
for (var i = 0, max = getInputs.length; i < max; i++){
if (getInputs[i].type === 'checkbox')
getInputs[i].checked = false;
document.getElementById('shr_SUBJECT=VC' + i).click();
}
--------编辑#1 --------------
仅供参考,这是我尝试使用此网站的网站:
http://factfinder2.census.gov/faces/nav/jsf/pages/searchresults.xhtml
如果你搜索并打开这些表中的任何一个,那么它们就是巨大的。如果我可以通过javascript一次“取消选中”和“点击”它们来轻松削减变量,那将是非常棒的。
ALMOST底部的代码有效。
我现在遇到的问题是它在第一次或第二次运行for循环后抛出错误:
"TypeError: document.getElementById(...) is null"
我明白这是因为它试图找到的价值不存在?有时在这些表格上,复选框显示为灰色/不存在或者“不可点击”。关于我为什么会收到此错误的理论是因为在表格/表格中,“可用”ID将开始:
shr_SUBJECT=VC03 or sh_SUBJECT=VC04
然后可以跳到:
shr_SUBJECT=VC06 then skip to shr_SUBJECT=VC09 and so on...
因此,如果for循环命中一个不可用的ID,如05或07,则返回null错误:(
我做了一些阅读并了解到javascript能够“捕获”被“抛出”的错误吗?我现在的问题是,我想知道如果抛出此错误,是否有一种简单的方法可以简单地迭代到下一个ID。
再一次,感谢任何和所有的帮助,你们真棒。
旧书草稿
var getInputs = document.getElementsByTagName("input");
for (var i = 3, max = getInputs.length; i < max; i++){
if (getInputs[i].type === 'checkbox' && i < 10){
var count = i;
var endid = count.toString();
var begid = "shr_SUBJECT=VC0";
var fullid = begid.concat(endid);
document.getElementById(fullid).click();
}
else if(getInputs[i].type === 'checkbox' && i >= 10){
var count = i ;
var endid = count.toString();
var begid = "shr_SUBJECT=VC";
var fullid = begid.concat(endid);
document.getElementById(fullid).click();
}
}
-------- EDIT#2 ----------
我试图操作的表格的示例可以在以下URL找到:
如果单击“修改表”按钮,则可以通过复选框选择/取消选择特定变量。如果右键单击几个“活动”复选框并检查元素,它看起来像这样:
<input id="shr_SUBJECT=VC03" checked="" alt="hide SUBJECT=VC03" name="" value="" onclick="javascript:hiderow('SUBJECT=VC03');" type="checkbox">
<input id="shr_SUBJECT=VC25" checked="" alt="hide SUBJECT=VC25" name="" value="" onclick="javascript:hiderow('SUBJECT=VC25');" type="checkbox">
非常感谢@Jonathan Steinbeck关于三元运算符的提示,它确实清理了我的代码。
该脚本正常运行,但我现在遇到的问题是它在try,catch语句之后没有迭代足够多次。如果id#中存在间隙;说它从shr_SUBJECT = VC19跳到shr_SUBJECT = VC = 24脚本将停止运行。有没有办法让它继续重试try / catch,直到它获得有效的ID#或存在/是活动的复选框?
脚本当前草案:
var getInputs = document.getElementsByTagName("input");
for (var i = 3, max = getInputs.length; i < max; i += 1) {
try {
if (getInputs[i].type === 'checkbox'){
document.getElementById("shr_SUBJECT=VC" + (i < 10 ? "0" : "") + i).click();
}
}
catch (err) {
i+=1;
if (getInputs[i].type === 'checkbox'){
if (getInputs[i].type === 'checkbox'){
document.getElementById("shr_SUBJECT=VC" + (i < 10 ? "0" : "") + i).click();
}
}
}
}
答案 0 :(得分:1)
当您使用不存在的ID调用document.getElementById()时,将返回null。因此,此错误意味着您尝试在null上调用.click()方法,这无法工作。 因此,您应该检查所需元素的正确ID命名方案。也许元素&#39; count从1开始而不是0?
另外,就我所知,.click()对所有元素都不起作用。因此,根据您要检索的元素类型,您可能必须按照RobG的评论建议create and dispatch your own event。
编辑以回应您最近的修改:
你可以在try-catch中包装抛出错误的代码,如下所示:
for (var i = 3, max = getInputs.length; i < max; i += 1) {
try {
document.getElementById("the_ID").click();
}
catch (error) {
console.error(error);
// continue stops the current execution of the loop body and continues
// with the next iteration step
continue;
}
// any code here will only be executed if there's not been an error thrown
// in the try block because of the continue in the catch block
}
另外,你正在做什么?&#39; i&#39;变量?将它分配给如此多的变量是没有意义的。这也是一样的:
document.getElementById("shr_SUBJECT=VC" + (i < 10 ? "0" : "") + i).click();
... ? ... : ...
是一个运算符(称为&#39; ternary operator&#39;),其工作原理如下:在&#34;?&#34;之前评估表达式。 - 如果它导致真实价值,则表达式为&#34;?&#34;和&#34;:&#34;被评估并成为使用运算符的结果;如果条件结果为假,那么&#34;之后的部分:&#34;被评估为运算符的值。所以,虽然&#34;如果&#34;是JavaScript中的一个语句(并且语句通常不会产生值),三元运算符可以用作表达式,因为它会产生一个值。
通过将字符串与其他字符串连接起来,你就会强迫其他东西&#39;要转换为字符串。所以像这样的表达式通常会产生一个字符串:
"" + someNonStringVar
此外,在JavaScript中定义循环体中的变量没有意义。 JavaScript变量具有函数范围,而不是块范围。这意味着循环体中定义的任何变量也存在于整个函数内部。因此,建议在函数顶部写下所有&#34; var&#34;以明确其范围。顺便说一句,JavaScript的这种行为称为“hoisting&#39;”。
我进一步查看了您在最近编辑中提供的网址,但我找不到您所描述的ID的命名方案。您在哪个表中找到了这些?
编辑以响应您的第二次修改:
你不应该惹这个&#39; i&#39; for循环体内的变量。它使您的代码更难以推理,并且可能不是您想要做的事情。您不需要在catch块中处理迭代的下一步。 &#39; i&#39;即使在从DOM中获取元素期间出现错误,变量也会递增。这就是你首先使用catch的原因。