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引用
导致没法正常触发劫持了...