2009-03-24 4 views
1

Возможно ли скопировать функцию (или любой объект в этом случае) из одного контекста окна в другой в Javascript?Копирование объекта функции из одного окна в другое

Предположим, у меня есть родительский окно с рама в нем. Кадр определяет функцию foo(), которую я хотел бы скопировать во внешнее окно. (Одна из причин, чтобы сделать это было бы так, что foo() доступна, когда кадра документа переходит к другому URL.)

Я знаю, что может легко создать ссылки на foo() в родителя делая

function foo() { ... }  
parent.foo = foo; 

Но с этим методом foo() до сих пор живет в рамке документа, и не будут доступны для родителя должен Рамка разгрузить.

Я знаю, что я могу создать новую функцию в родителя с помощью конструктора Function:

parent.foo = new parent.Function(" ... "); 

Однако, это требует, чтобы у меня моя функции в виде строки JS.

DOM поддерживает перемещение узлов из одного документа в другой посредством importNode(). Есть ли у Javascript аналогичная функция?

+0

Не было бы лучше просто написать функцию javascript внутри родителя? Рамка всегда будет иметь доступ к родительскому элементу. Таким образом, вы можете использовать функцию в родительском или кадре. Или я не понимаю? –

+0

Теоретически это возможно, но в моем случае есть некоторые ограничения. В частности, мой сценарий иногда включается в документ фрейма, и я не хочу ограничивать его. – levik

+0

@levik: просто введите функцию в родительском элементе и * вытяните * его в кадр (вместо того, чтобы нажимать на родителя). Таким образом, если кадр выгружается, копия родителя все еще жива и хорошо. –

ответ

1

Решение nitko кажется правильным, хотя требуется немного больше работы. Эта функция, кажется, работает на FF2, FF3, IE7 и Chrome:

function importFunction(fn, win) { 
    var code = fn.toString(); 
    var params = code.match(/\(([^)]*)\)/); 
    if (typeof(params[1]) !== 'undefined') { 
     params = params[1].split(/\s*,\s*/); 
    } else { 
     params = null; 
    } 
    code = code.replace(/^[^{]*{/, ''); 
    code = code.replace(/}$/, ''); 
    if (params) { 
     return new win.Function(params, code); 
    } 
    return new win.Function(code); 
    } 

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

parent.foo = importFunction(foo, parent); 
-1

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

parent.foo = new parent.Function(originalFunction.toString()); 

Хотя я не знаю, он доступен в любом браузере, я думаю, что я видел его работу в основных браузерах , современные версии.

+0

toString возвращает функцию() {...} ", поэтому это не будет – Marius

+0

работы. К сожалению, моя клавиатура работает странно. – Marius

Смежные вопросы