假设我有window.open(没有名称参数),散布在我的项目中,我想更改实现,以便在未指定名称的地方我将指定默认名称。
我想要做的是将我自己的方法挂钩到window.open,这样每当window.open运行时,它将在内部调用我自己的方法,然后调用window.open(带有name参数)。
这可以通过Javascript吗?是否会出现循环依赖问题,即window.open调用我的自定义函数,然后又调用window.open函数?
P.S。简单来说,我想要做的是覆盖window.open功能。
答案 0 :(得分:30)
要避免循环调用,您需要隐藏变量中的原始window.open
函数。
一种不错的方法(不污染全局命名空间)是使用闭包。将原始window.open
函数作为参数传递给匿名函数(下面称为open
)。这个匿名函数是hook函数的工厂。您的钩子函数通过window.open
参数永久绑定到原始open
函数:
window.open = function (open) {
return function (url, name, features) {
// set name if missing here
name = name || "default_window_name";
return open.call(window, url, name, features);
};
}(window.open);
答案 1 :(得分:9)
我知道这个回复有点晚了,但我觉得更通用的解决方案对其他人有用(试图覆盖其他方法)
function wrap(object, method, wrapper){
var fn = object[method];
return object[method] = function(){
return wrapper.apply(this, [fn.bind(this)].concat(
Array.prototype.slice.call(arguments)));
};
};
//You may want to 'unwrap' the method later
//(setting the method back to the original)
function unwrap(object, method, orginalFn){
object[method] = orginalFn;
};
//Any globally scoped function is considered a 'method' of the window object
//(If you are in the browser)
wrap(window, "open", function(orginalFn){
var originalParams = Array.prototype.slice.call(arguments, 1);
console.log('open is being overridden');
//Perform some logic
//Call the original window.open with the original params
orginalFn.apply(undefined, originalParams);
});
答案 2 :(得分:5)
P.S。简单来说,我想要做的就是覆盖window.open 功能。
var orgOpen = window.open;
window.open = function (url, windowName, windowFeatures) {
alert("Overrided!");
return orgOpen(url, windowName, windowFeatures);
}
window.open("http://www.stackoverflow.com");