在油猴脚本中打算 hook 一个 xhr 请求,写出如下代码
var x = unsafeWindow.$.ajax();
unsafeWindow.$.ajax = function(args) {
console.log(args);
return x.apply(unsafeWindow.$.ajax, args);
}
结果 Chrome 提示 apply is not a function... console.log 能正常执行,但是为什么最后一行不对呢?
1
eccstartup 2018-05-19 13:19:58 +08:00 via iPhone
自己调用自己?
|
2
TtiGeR 2018-05-19 13:20:32 +08:00
为什么要造轮子
直接搜 GreaseMonkey Intercept XHR 结果一大把的说 |
3
wly19960911 2018-05-19 13:22:57 +08:00 1
var x = unsafeWindow.$.ajax(); 这个是 return 的结果,只有 function 才有 apply,你用了()就执行了方法啊,,,
|
4
vegito2002 2018-05-19 13:41:20 +08:00
不太会熟练 js, 这个行不行:
var x = unsafeWindow.$.ajax(); unsafeWindow.$.ajax = function(args) { console.log(args); return function (args) {x.apply(unsafeWindow.$.ajax, args)}; } |
5
vegito2002 2018-05-19 13:42:27 +08:00 1
application 和 function 之间确实不是一个东西, f 是一个 function, f(1)是一个 application, 这个一般的函数式编程的课程应该都会讲. 不过不会写 ajax, 这里具体的语法看不懂到底在干什么.
|
6
wly19960911 2018-05-19 13:56:47 +08:00
@vegito2002 应该不行,按照需要写的意思,
var x = unsafeWindow.$.ajax; 而且最后也不是 return 一个 function,首先是你最后是需要一个 unsafeWindow.$.ajax 的返回值,也就是说你 return 最少是个执行方法的结果吧,但是你这个是 function 了,错误,楼主那个是 x 不是一个 function,所以执行不了 apply 方法。 |
7
rabbbit 2018-05-19 13:58:39 +08:00
var x = unsafeWindow.$.ajax;
|
8
rabbbit 2018-05-19 14:01:56 +08:00 1
贴一个别的给你参考下
var open = XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open = function() { console.log(this); open.apply(this, arguments); }; |
9
k9982874 2018-05-19 14:07:19 +08:00 via iPhone
楼主一定是在逗我们
|
10
hard2reg OP @wly19960911
@rabbbit 最后一行写成 return hook.call(this, args);可以了,不知道为什么 apply 不行。我是参照这篇写的,https://charlee.li/hook-function-in-greasemonkey.html |
11
hard2reg OP @wly19960911
@k9982874 @rabbbit @vegito2002 发现问题了,按理来说 apply 也是可以的。错误如下 ``` var x = unsafeWindow.$.ajax(); // 不应该有括号,应该写成 var x = unsafeWindow.$.ajax ; unsafeWindow.$.ajax = function(args) { console.log(args); return x.apply(unsafeWindow.$.ajax, args); } ``` |