Как переопределить функциональность window.open?

Допустим, у меня есть window.open (без параметра name), разбросанный по моему проекту, и я хочу изменить реализацию так, чтобы везде, где не указано имя, я указывал имя по умолчанию.

Я хочу подключить свой собственный метод к window.open, чтобы при каждом запуске window.open он вызывал мой собственный метод, который затем вызывал бы window.open (с параметром name).

Это возможно через Javascript? Будут ли какие-либо проблемы с циклической зависимостью в этом, то есть window.open, вызывающем мою пользовательскую функцию, которая, в свою очередь, снова вызывает функцию window.open?

Постскриптум Проще говоря, я хочу переопределить функциональность window.open.

Ответы на вопрос(3)

я хочу переопределить функциональность 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");
 georg07 февр. 2012 г., 09:37
Мне было бы наплевать на загрязнение пространства имен.
 Ates Goral07 февр. 2012 г., 08:40
1. Загрязняет глобальное пространство имен. 2. Хук-функция не использует никаких аргументов. 3. Хук-функция не возвращает новый объект окна. 4. Как это вообще сработало?

что этот ответ немного запоздал, но я чувствовал, что более общее решение может быть полезным для других людей (пытаясь переопределить другие методы)

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); 
});
 Gyum Fox05 сент. 2013 г., 13:23
Хороший чистый общий способ перехвата функции объекта
Решение Вопроса

window.open функция в переменной.

Хороший способ (который не загрязняет глобальное пространство имен) - использовать замыкание. Передать оригиналwindow.open функция к анонимной функции в качестве аргумента (называетсяopen ниже). Эта анонимная функция является фабрикой для вашей функции подключения. Ваша функция крюка постоянно связана с оригиналом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);
 Ates Goral07 февр. 2012 г., 08:42
Я объяснил это обновлением выше. Я не думаю, что могу вдаваться в более глубокие детали, чем это. Я рекомендую прочесть: 1. Области функций и методы вызова / применения. 2. Модульные шаблоны.
 Sidharth Panwar07 февр. 2012 г., 08:40
Можете ли вы объяснить, что здесь происходит? Боюсь, я плохо разбираюсь в JS.
 Ates Goral07 февр. 2012 г., 09:05
IE никогда не терпит неудачу. Можете ли вы попробовать позвонить прямо?return open(window, url, name, features);
 Ates Goral05 нояб. 2012 г., 20:50
@SajjanSarkar Попробуйте добавить в URL-адрес «http: //». Без этого браузер не сможет сказать, что вы намерены перейти на другой домен вместо относительного пути.
 Sidharth Panwar07 февр. 2012 г., 08:59
Это дает эту ошибку JS: Ошибка времени выполнения Microsoft JScript: объект не поддерживает свойство или метод 'call'

Ваш ответ на вопрос