cxxjackie 发表于 2024-1-11 22:50:08

gbly 发表于 2024-1-11 16:24
大佬冒昧问一下,如果想在请求完成之前,直接返回请求结果应该怎么写。起因是我有个xhr请求但是速度太慢了 ...

可以做到但这个库没实现,对响应的修改是基于原响应基础上的,覆盖响应值的话请求都不需要发生,这个可以自己写代码实现,给你写个可能不是很通用的例子(不需要引入这个库):
const xhrOpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function(method, url, ...args) {
    if (url.includes('www.example.com/test')) {
      let onload = null;
      Object.defineProperty(this, 'onload', {
            configurable: true,
            enumerable: true,
            get: () => onload,
            set: value => (onload = value)
      });
      this.send = () => {
            Object.defineProperty(this, 'responseText', {
                configurable: true,
                enumerable: true,
                get: () => '我是响应值',
            });
            const loadEvent = new ProgressEvent('load');
            this.dispatchEvent(loadEvent);
            onload.call(this, loadEvent);
      };
    }
    return xhrOpen.call(this, method, url, ...args);
};

cxxjackie 发表于 2024-1-11 22:53:59

JML 发表于 2024-1-11 19:29
只是测试而已,没多大作用。后来发现修改响应数据即使成功,但是网页只是偶尔变成修改后的状态,可能有其 ...

没输出可能只是因为console.log被劫持了,有些网页会这么干,至于不生效我没复现也没办法分析了。

gbly 发表于 2024-1-12 15:55:46

本帖最后由 gbly 于 2024-1-12 17:16 编辑

cxxjackie 发表于 2024-1-11 22:50
可以做到但这个库没实现,对响应的修改是基于原响应基础上的,覆盖响应值的话请求都不需要发生,这个可以 ...
大佬onload.call(this, loadEvent);这里好像有bug,执行call的时候onload还是null导致报错,我是不是得找到获取onload这个函数变量的办法。您方便的话能加我联系方式帮我看看能不能解决吗,有偿qq 2123546812

cxxjackie 发表于 2024-1-12 22:01:14

gbly 发表于 2024-1-12 15:55
大佬onload.call(this, loadEvent);这里好像有bug,执行call的时候onload还是null导致报错,我是不是得找 ...

let onload = null;
这句改成这样试试:
let onload = this.onload;
不行的话说明监听的事件不是onload,可能是onreadystatechange,也可能addEventListener绑上去的。

gbly 发表于 2024-1-13 10:27:09

本帖最后由 gbly 于 2024-1-13 10:52 编辑

cxxjackie 发表于 2024-1-12 22:01
这句改成这样试试:

不行的话说明监听的事件不是onload,可能是onreadystatechange,也可能addEventLis ...
感谢大佬,能用了,最后确认是onloadend,不过这段代码好像和ajaxHooker有冲突,只要@require js了就不起效果了

cxxjackie 发表于 2024-1-13 22:13:36

gbly 发表于 2024-1-13 10:27
感谢大佬,能用了,最后确认是onloadend,不过这段代码好像和ajaxHooker有冲突,只要@require js了就不起 ...

确实有冲突,库也做了事件的劫持,跟这个原理差不多,所以会跟这段代码相互覆盖。如果确实有使用库的需求,可以尝试1.1.1版本,少了异步特性和filter方法。

sdcsdv 发表于 2024-3-12 17:24:08

请问ajaxHooker跨域拦截axios请求优先级问题如何处理?

https://bbs.tampermonkey.net.cn/thread-6252-1-1.html

player 发表于 2024-4-4 09:59:53

index.js:310 Uncaught DOMException: Failed to execute 'open' on 'XMLHttpRequest': Synchronous requests from a document must not set a response type.
    at Proxy.open (chrome-extension://ndcooeababalnlpkfedmmbbbgkljhpjf/ajaxhook%20test.user.js:749:35)
    at t.next (https://gogitil.woa.com/wego/wetextmarksystemkweb/static/release/js/chunk-vendors.cb87b694.js:16:168044)
    at onRequest (https://gogitil.woa.com/wego/wetextmarksystemkweb/static/release/js/chunk-vendors.cb87b694.js:16:189583)
    at r (https://gogitil.woa.com/wego/wetextmarksystemkweb/static/release/js/chunk-vendors.cb87b694.js:16:169296)
    at https://gogitil.woa.com/wego/wetextmarksystemkweb/static/release/js/chunk-vendors.cb87b694.js:16:177754
    at https://gogitil.woa.com/wego/wetextmarksystemkweb/static/release/js/chunk-vendors.cb87b694.js:72:37777
throw @ index.js:310
(匿名) @ index.js:522
(匿名) @ index.js:45
setTimeout(异步)
(匿名) @ index.js:188
(匿名) @ index.esm.js:805
send @ xhr-proxy.js:204
(匿名) @ xhr-hook.js:109
(匿名) @ xhr.js:178
e.exports @ xhr.js:12
e.exports @ dispatchRequest.js:59
Promise.then(异步)
s.request @ Axios.js:51
(匿名) @ bind.js:9
c @ request.js:25
(匿名) @ request.js:24
C @ request.js:22
q @ request.js:134
t.a @ request.js:162
API_action @ marker_page.store.js:115
(匿名) @ vuex.esm.js:792
m.dispatch @ vuex.esm.js:457
dispatch @ vuex.esm.js:347
GET_userinfo @ marker_page.store.js:130
(匿名) @ vuex.esm.js:792
m.dispatch @ vuex.esm.js:457
dispatch @ vuex.esm.js:347
(匿名) @ marker_page.js:15
p @ vue-router.esm.js:2158
i @ vue-router.esm.js:1884
Ne @ vue-router.esm.js:1892
Ge.confirmTransition @ vue-router.esm.js:2185
Ge.transitionTo @ vue-router.esm.js:2072
dt.init @ vue-router.esm.js:2775
beforeCreate @ vue-router.esm.js:1235
nt @ vue.runtime.esm.js:1854
Bn @ vue.runtime.esm.js:4219
e._init @ vue.runtime.esm.js:5004
Si @ vue.runtime.esm.js:5085
c760 @ marker_page.js:123
s @ bootstrap:107
7 @ v-copy.js:6
s @ bootstrap:107
a @ bootstrap:71
(匿名) @ marker_page.f9add598.js:1
(匿名) @ marker_page.f9add598.js:1
显示另外 29 个框架
收起
ajaxhook test.user.js:913 TypeError: Cannot set property readyState of #<XMLHttpRequest> which has only a getter
    at Object.set (ajaxhook test.user.js:910:42)
    at E.t.XMLHttpRequest.readyState (xhr-hook.js:97:15)
    at t.resolve (xhr-proxy.js:64:14)
    at t.next (xhr-proxy.js:102:8)
    at onResponse (index.esm.js:1909:26)
    at o (xhr-proxy.js:129:5)
    at c (xhr-proxy.js:155:7)
    at E.t.XMLHttpRequest.onreadystatechange (xhr-proxy.js:169:14)
    at i.<computed> (xhr-hook.js:87:48)
    at XhrEvents.trigger (ajaxhook test.user.js:679:70)
不知道网站更新了什么,就突然报错了,我把自己的代码全部注释掉,也是一样报错

cxxjackie 发表于 2024-4-4 23:17:49

player 发表于 2024-4-4 09:59
index.js:310 Uncaught DOMException: Failed to execute 'open' on 'XMLHttpRequest': Synchronous reques ...

我知道这个问题,xhr在open时漏传了一个可选参数,导致有些请求变成同步的了,这个bug因为比较小所以我一直没更新,想着攒一攒再一起更的,结果给忘了。。。
1.3.4已修复,你试试看还有问题的话,发个链接我测试看看。

李恒道 发表于 2024-4-19 10:14:29

https://bbs.tampermonkey.net.cn/thread-6852-1-1.html
c大,这个我研究了一下
是原网页劫持了open的函数,重新改了xhr的apply引用
导致没法正常触发劫持了...
页: 6 7 8 9 10 11 12 13 14 15 [16] 17 18 19
查看完整版本: ajax劫持库ajaxHooker