#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');