Как безопасно передать ссылку на объект через окно? - PullRequest
2 голосов
/ 07 июня 2010

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

var obj = new Foo();
anotherWin.bar(obj);

В anotherWin аргумент сохраняется в глобальной переменной.

var g_obj;

function bar(obj)
{
   g_obj = obj;
   ...
}

Когда другая функция пытается сослаться на g_obj.Id , выдается исключение " Невозможно оценить выражение ". Это происходит в IE8.0.7600.16385 в Windows 7.

В отладчике Visual Studio, когда возникает это исключение, g_obj отображается как

 {...}

Похоже, все его свойства потеряны.

Возможно, основной причиной является то, что объект создается в одном окне, но на него ссылаются только в другом окне. Объект может быть собран в любое время.

Есть ли способ обойти это?

Ответы [ 3 ]

4 голосов
/ 21 июня 2010

Объекты DOM не сохраняются через окна. Однако, если вы можете жить с представлением JSON , тогда я преобразую ваш объект в JSON , отправлю его через, а затем проанализирую JSON.

Существует несколько способов кодирования и декодирования JSON в javascript (подсказка: использование eval() - это катастрофа безопасности).

  • Некоторые современные браузеры (Firefox> = 3.5, Internet Explorer> = 8.0) предоставляют безопасные и быстрые собственные реализации.
  • Некоторые фреймворки JavaScript (например, YUI , но не jquery ) из той же функциональности.
  • самый надежный способ , чтобы сделать это использовать библиотеку Дугласа Крокфорда json2.js Это соответствует стандарту, безопасно, назад совместим и будет использовать собственный анализатор браузера, если он существует.

Используя библиотеку Крокфорда, ваш пример станет:

<script type="text/javascript" src="json2.js"></script>

[...]

var obj = new Foo();
anotherWin.json_bar(JSON.stringify(obj));

В ДругойВин :

<script type="text/javascript" src="json2.js"></script>

[...]

var g_obj;

function bar(obj)
{
   g_obj = obj;
   [...]
}


function json_bar(json_obj)
{
    bar(JSON.parse(json_obj));
}

Не забудьте минимизировать json2.js - при консервативном минимизации это всего лишь 3,5 КБ на размер загрузки вашей страницы.

1 голос
/ 17 июня 2010

Сериализуйте ваш объект, отправьте его, затем десериализуйте.

1 голос
/ 17 июня 2010

это односторонняя операция, или вы хотите, чтобы изменения, сделанные в anotherWin, отражались в исходном окне?

если это один из способов, я бы преобразовал его в строку json, отправили разобрать его обратно в объект.

Передача ссылки может быть невозможной.

...