How to override the window.open functionality?

前端 未结 3 1532
走了就别回头了
走了就别回头了 2020-12-07 23:38

Let\'s say I have window.open (without name parameter), scattered in my project and I want to change the implementation so that wherever name is not specified I\'ll specify

相关标签:
3条回答
  • 2020-12-07 23:56

    I know this reply is a little late, but I felt that a more general solution may be helpful for other people (trying to override other methods)

    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); 
    });
    
    0 讨论(0)
  • 2020-12-08 00:07

    P.s. In simple terms what I want to do is override the window.open functionality.

    var orgOpen = window.open;
    
    window.open = function (...args) {
        alert("Overrided!"); 
        return orgOpen(...args); 
    }
    
    window.open("http://www.stackoverflow.com");
    
    0 讨论(0)
  • 2020-12-08 00:16

    To avoid circular calls, you need to stash away the original window.open function in a variable.

    A nice way (that doesn't pollute the global namespace) is to use a closure. Pass the original window.open function to an anonymous function as an argument (called open below). This anonymous function is a factory for your hook function. Your hook function is permanently bound to the original window.open function via the open argument:

    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);
    
    0 讨论(0)
提交回复
热议问题