Переместить все функции в дочернее окно - PullRequest
3 голосов
/ 01 ноября 2011

Если я сделаю это:

var new_win = window.open();

Как мне сделать так, чтобы все функции, которые могли использоваться в родительском окне, теперь могли использоваться в дочернем окне (new_win)?

Я не хочу сделать:

var fun1 = window.opener.fun1;
var fun2 = window.opener.fun2;
...

Ответы [ 3 ]

5 голосов
/ 01 ноября 2011

Обратите внимание, что ниже следует опасный, грязный, грязный, взлом M $ -уровня. Я полностью осознаю это, но он (теоретически) делает то, что хочет @Neal. (Я немного напуган, чтобы даже опубликовать это, и я полностью ожидаю понижения голосов)

var i, w = window.opener;
for (i in w)
{
    if (w.hasOwnProperty(i) && !window.hasOwnProperty(i) && typeof w[i] === 'function')
    {
        window[i] = w[i];
    }
}

В свете проблем с областью применения я решил, что мы должны использовать .bind. У MDN Entry для Function.bind есть шайба, которая будет необходима для некоторых браузеров.

Обратите внимание, что перед использованием .bind код должен проверить, является ли свойство функцией. Я сделал это вместе с проверками hasOwnProperty, но если вы хотите передать значения и функции, вы можете сделать это в своем собственном операторе if.

var i, w = window.opener;
for (i in w)
{
    if (w.hasOwnProperty(i) && !window.hasOwnProperty(i) && typeof w[i] === 'function')
    {
        window[i] = w[i].bind(window);
    }
}
1 голос
/ 01 ноября 2011

Во-первых, я бы создал пространство имен (помогает избежать коллизий функций), а затем просто ссылался бы на него во всплывающем окне.

родительское окно:

MyNameSpace = {
      // put functions, classes or whatever you want in here.
};

во всплывающем окне-up window:

MyNameSpace = window.opener.MyNameSpace;

Единственная проблема, которая может возникнуть из-за того, что вы запрашиваете, - это если вызываемая вами функция пытается ссылаться на объект окна.Я бы передавал объект окна любым функциям, которые управляют окном.

Например,

function (arg1, arg2, argn, windowHandle) {
      windowHandle = windowHandle || self;

      // do some stuff.

}
0 голосов
/ 01 ноября 2011

Вы можете создать новый экземпляр функции и передать имя функции и необязательные аргументы примерно так:

var parentFunction = new Function("name", "args", "return (window.opener != null) ?  opener.window[name](args) : false");

parentFunction('notification','waring, red, 2');
...