微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 GreasyMonkey 脚本抑制网页上的 AJAX 调用

如何解决使用 GreasyMonkey 脚本抑制网页上的 AJAX 调用

作为我日常工作的一部分,我需要在包含多个字段的网页中填写数据。该网页的构建方式是,在选择每个字段时,会发送 AJAX 请求以进行验证和获取结果。大约有 20 个字段可以输入。此外,我发现代码是这样编写的,即在每个 AJAX 请求中发送所有 20 个字段的数据以获取结果。

但是,在慢速连接上,这会导致过度延迟,由于来自服务器的 AJAX 验证和页面刷新,我必须在选择每个字段时等待 5-10 秒。我想编写一个 Greasymonkey/Violentmonkey/Tapermonkey 脚本来抑制 AJAX,直到我填满所有 20 个字段。

注意:字段上的 onChange/click 事件包含除 AJAX 调用之外的许多其他验证,因此我不想抑制字段上的 onChange/click 事件。

典型的选择如下:

<h6 class="spin">Tube end<span class="facet-toggle"></span></h6>
    <ul style="display: block;">
        <li data-value="00any" class="  " data-display-value="Any Value" data-facet-name="C8948E"> <a> Any Value </a> </li>

        <li data-value="bevelend" class="  " data-display-value="Bevel end" data-facet-name="C8948E"> <a> Bevel end <i> 2</i> </a> </li>

        <li data-value="plainend" class="  " data-display-value="Plain end" data-facet-name="C8948E"> <a> Plain end <i> 147</i> </a> </li>

        <li data-value="screwed" class="  " data-display-value="Screwed" data-facet-name="C8948E"> <a> Screwed <i> 34</i> </a> </li>

        <li data-value="screwedandsocketed" class="  " data-display-value="Screwed and socketed" data-facet-name="C8948E"> <a> Screwed and socketed <i> 9</i> </a> </li>

        <li data-value="screwedwithoneendsocket" class="  " data-display-value="Screwed with one end Socket" data-facet-name="C8948E"> <a> Screwed with one end Socket <i> 59</i> </a> </li>
    </ul>
<div class="facet-footer">&nbsp;</div>

Developer Tools Screenshot

解决方法

您可以monkey patch AJAX 函数并过滤掉用于验证的 URL。

首先,您需要阅读代码使用什么函数。有两个 API。

XMLHTTPRequest 和新的 fetch API

需要修改代码,过滤掉不需要的网址。

如果页面使用 Fetch 你可以使用:

var ignoreURL = /validation/;

(function (fetch) {
    window.fetch = function(url,...args) {
        if (!url.match(ignoreURL)) {
            return fetch(url,...args);
        }
        return Promise.resolve({
           json: () => Promise.resolve({valid: true})
        });
    };
})(fetch);

如果您的页面使用 fetch,您需要调查发送了什么请求,如果它是 JSON 并且代码使用 res.json() 那么您需要返回脚本期望从 AJAX 请求中获得的任何内容。这里只是一个 {valid: true} 示例,但您需要检查您的确切请求。

如果代码使用 jQuery,您需要查看 jQuery 使用的代码,如果它使用 XMLHttpRequest 对象发送 AJAX 请求,您需要修改该对象,类似于上面的 fetch,但需要更多工作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。