【发布时间】:2012-08-24 00:21:45
【问题描述】:
我的公司使用基于 Web 的产品,其 UI 要求我们针对某些用例单击 200 多个复选框。我们请求了一个“取消选中所有”功能,但显然没有实现。
我尝试编写一个简单的 GreaseMonkey 脚本来解决这个问题:
$('img').click(function() {
$('input.HideQuestion:checked').each(function() {
$(this).click();
});
});
(在我用作点击目标的页面上有一张图片,我们的徽标)
问题是,每次我单击图像时,只有一个(约 270 个)复选框受到影响。每一次额外的点击都会影响下一个复选框。
我可以看到每次选中复选框时网站都会进行 Ajax 调用,但是该 Ajax 调用的响应正文是空的,所以我认为它们只是在更新服务器上的状态,而不是替换页面的一部分。
为什么最终可能只有一个复选框未被选中?
当我使用替代方法时
$(this).prop("checked", true);
所有复选框在视觉上都未选中,但不会发生 Ajax 调用,并且服务器状态永远不会更新。此外,当我选中任何复选框时,所有复选框都会恢复到 GreaseMonkey 之前的状态。
更新
我尝试了@BrockAdams 建议的以下两种方法来拦截 Ajax 调用。 alert() 都没有被调用。
覆盖 XMLHttpRequest.prototype.open https://stackoverflow.com/a/7778218/141172
(function() {
var proxied = window.XMLHttpRequest.prototype.open;
window.XMLHttpRequest.prototype.open = function() {
alert('A-ha! Open!');
return proxied.apply(this, [].slice.call(arguments));
};
})();
使用 .ajaxSuccess() 拦截目标页面的 AJAX
https://stackoverflow.com/a/8252726/141172
// Also tried: unsafeWindow.$('body').ajaxSuccess (
$('body').ajaxSuccess (
function (event, requestData)
{
alert('A-ha. Success!');
}
);
【问题讨论】:
-
所有复选框在视觉上都未选中您将选中的属性设置为
true,这会检查所有复选框,它不会取消选中它们。 -
@undefined:是的,我知道。想提一下,我也尝试过(但放弃了)这种方法。
-
这比触发点击事件超过 200 次更好。
-
我假设只有 last 复选框未被选中?这是一个真正可以使用分析目标页面的JS的案例。是用 jQuery 做 AJAX 吗?将完整的页面保存到磁盘,压缩并发布到 pastebin 或类似文件。
-
重要切线:不要添加“神秘肉”控件,即使它只是供您自己使用(假设没有秘密发生)。继续并添加一个“取消选中所有”按钮。不要将不相关的点击处理程序添加到页面上唯一的(目前)图像!您保存的头条可能是您自己的。
标签: jquery greasemonkey