【问题标题】:GreaseMonkey jQuery Script only Affects One ElementGreaseMonkey jQuery 脚本只影响一个元素
【发布时间】: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


【解决方案1】:

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

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

等待您提供更多详细信息(尤其是目标页面是否针对此特定 AJAX 使用 jQuery),以下是一个应该可行的通用方法:

  1. 使用$('input.HideQuestion:checked').each() 填充jQuery queue

  2. 如果可能,使用.ajaxSuccess() 拦截目标页面的 AJAX。或者通过覆盖XMLHttpRequest.prototype.open,如果不是。

  3. 每次成功完成 AJAX 时,dequeue 下一个项目(如果有)从步骤 1 开始保留在队列中。

    设置dequeue 函数以取消选中其匹配的复选框。

【讨论】:

  • 不幸的是,有问题的应用程序是专有的。你的方法听起来很有趣。但是,我似乎无法实施 2。发布了我的三个尝试。你觉得鳕鱼有问题吗?
  • unsafeWindow.$('body').ajaxSuccess() 可以工作,但前提是目标页面使用 jQuery(并且通常)作为其 AJAX。可以? ... XMLHttpRequest.prototype.open 方法不是我这样做的方式,但它应该工作(未经测试),如果,并且只有在,您将覆盖代码注入目标页面。此外,出于您的目的,您需要从响应中收听 status 200
  • 请参阅stackoverflow.com/a/6805461,了解来自 Greasemonkey 的通用 AJAX 拦截方法的一种实现。
【解决方案2】:

试试这个:

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

【讨论】:

  • 不幸的是,它不会“粘住”,因为在我单击任何复选框后,页面中的某些状态会被重置。另外,UI 设计使得页面仅在选中/取消选中复选框时刷新(糟糕)。没有“刷新”按钮。点击浏览器刷新按钮,恢复存储在服务器端的校验状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-24
  • 2013-08-01
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多