我的公司使用基于网络的产品,其UI要求我们针对某些用例点击200多个复选框。我们要求“取消全部检查”功能,但显然不会即将发布。
我尝试编写一个简单的GreaseMonkey脚本来解决问题:
$('img').click(function() {
$('input.HideQuestion:checked').each(function() {
$(this).click();
});
});
(在我用作点击目标的页面上有一个图像,我们的徽标)
问题是,每次单击图像时,只有一个(~270个)复选框受到影响。每次额外点击都会影响下一个复选框。
我可以看到网站每次选中一个复选框时都会调用Ajax,但是该Ajax调用的响应主体是空的,所以我认为它们只是在服务器上更新状态而不是替换部分页面。 / p>
为什么只有一个复选框最终会被取消选中?
当我使用替代方法时
$(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!');
}
);
答案 0 :(得分:2)
我们确实需要查看目标页面的JS代码。但是,听起来目标页面正在等待AJAX响应,然后设置内部状态。它也可能用服务器维护的状态覆盖本地状态。
如果这是真的,那么您需要在每次取消选中后等待服务器响应,或者目标页面的javascript可能提供更好的解决方案。
等待你的更多细节(特别是目标页面是否使用jQuery来实现这个特定的AJAX),这是一个应该有效的一般方法:
$('input.HideQuestion:checked').each()
填充jQuery queue。.ajaxSuccess()
拦截目标网页的AJAX。或者覆盖XMLHttpRequest.prototype.open
,如果不是。在每次成功完成AJAX后,dequeue
下一个项目(如果有)保留在步骤1的队列中。
设置dequeue
功能以取消选中其匹配的复选框。
答案 1 :(得分:0)
试试这个:
$('img').click(function() {
$('input[type="checkbox"]:checked').prop('checked', false)
});