GreaseMonkey jQuery脚本只影响一个元素

时间:2012-08-24 00:21:45

标签: jquery greasemonkey

我的公司使用基于网络的产品,其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!');
        }
    );  

2 个答案:

答案 0 :(得分:2)

我们确实需要查看目标页面的JS代码。但是,听起来目标页面正在等待AJAX​​响应,然后设置内部状态。它也可能用服务器维护的状态覆盖本地状态。

如果这是真的,那么您需要在每次取消选中后等待服务器响应,或者目标页面的javascript可能提供更好的解决方案。

等待你的更多细节(特别是目标页面是否使用jQuery来实现这个特定的AJAX),这是一个应该有效的一般方法:

  1. 使用$('input.HideQuestion:checked').each()填充jQuery queue
  2. 如果可能,使用.ajaxSuccess()拦截目标网页的AJAX。或者覆盖XMLHttpRequest.prototype.open,如果不是。
  3. 在每次成功完成AJAX后,dequeue下一个项目(如果有)保留在步骤1的队列中。

    设置dequeue功能以取消选中其匹配的复选框。

答案 1 :(得分:0)

试试这个:

$('img').click(function() {
    $('input[type="checkbox"]:checked').prop('checked', false)
});