Переместить все функции в дочернее окно

#javascript #new-window

#javascript #создать-окно

Вопрос:

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

 var new_win = window.open();
 

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

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

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

Комментарии:

1. Есть ли у вас какие-либо динамически генерируемые функции, и вы хотите, чтобы они также были включены? В противном случае, почему бы не включить те же файлы javascript и в открытое окно (используя newWin.document.write, если у вас нет местоположения).

2. @draevor все функции являются динамическими в зависимости от щелчка пользователя по родительскому окну.

Ответ №1:

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

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

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

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

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

Комментарии:

1. Обратите внимание, что все функции по-прежнему выполняются в области исходного окна.

2. @RobW нет, если это находится внутри new_window.onload = function(){...above code...} , я считаю (используя this или new_window вместо window )

3. Когда я использую function foo(){alert(document.title)};var w = window.open('about:blank');w.onload=function(){w.foo=foo} и использую foo() в открытом окне, я получаю заголовок исходного документа.

4. Я не вижу в этом проблемы. Это именно то, что должно произойти.

5. Это должно выполняться в дочернем окне, а не в родительском.

Ответ №2:

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

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

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

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

 MyNameSpace = window.opener.MyNameSpace;
 

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

например

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

      // do some stuff.

}
 

Ответ №3:

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

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

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