Перекрестное окно JavaScript: существует ли правильный путь?

Проблема

Я пытаюсь сделать метод, который передает объекты похожему методу во всплывающем окне. Я не управляю кодом в целевом методе, или объект передал в. Целевой метод в настоящее время сериализирует объект, с помощью JSON.stringify если это возможно, или instanceof Array.

Первой проблемой с этим является ошибка в IE8 (см. ниже). Второе, и более фундаментальный, то, что примитивы не являются тем же через окна:

w = open("http://google.com")
w.Array == Array               // returns false

Переопределение на всплывающем окне любые классы, которые могли бы быть переданы в, и затем восстановление их после работ вызова, но это является действительно хрупким и головная боль обслуживания.

Сериализация объекта в JSON и затем парсинг его в контексте окна поражают ошибку Firefox ниже.

Я, также немного ненавидят, чтобы сделать глубокую копию объекта или проанализировать использование JSON new w.Object, и т.д., потому что не такое чувство, что это должен быть сложный.

Кто-либо может предложить разумный способ иметь дело с этим, или я должен просто признать, что объекты не могут быть переданы дословно между окнами?


Ошибка IE

JSON.stringify не работает через окна в IE8. Если я передаю объект всплывающему окну, которое пытается сериализировать его, stringify возвраты undefined. Для наблюдения этой проблемы откройте консоль сценария в IE8 и попытке:

w = open("http://google.com")
JSON.stringify(Object())          // returns "{}"
w.JSON.stringify(w.Object())      // returns "{}"

w.JSON.stringify(Object())        // returns "undefined" on IE8
JSON.stringify(w.Object())        // returns "undefined" on IE8
JSON.stringify([1, w.Object()])   // returns "[1,null]" on IE8

Я пытался работать вокруг этого путем установки w.JSON = JSON, но поскольку последний тест показывает, что повреждения, когда у Вас есть объекты из обоих окон.

Ошибка Firefox

Это кажется тем вызовом w.Object() создать объект в Firefox на самом деле звонит window.Object(). Та же ошибка поражена при вызове w.JSON.parse или w.eval. Для наблюдения этого откройте консоль Firebug's и попытку:

w = open("http://google.com")
new w.Object instanceof w.Object        // returns true

w.Object() instanceof w.Object          // returns false on Firefox 3.5
w.Object() instanceof Object            // returns true on Firefox 3.5
w.Object.call(w) instanceof Object      // returns true on Firefox 3.5
w.JSON.parse("{}") instanceof w.Object  // returns false on Firefox 3.5
w.JSON.parse("{}") instanceof Object    // returns true on Firefox 3.5
w.eval("[]") instanceof w.Array         // returns false on Firefox 3.5
w.eval("[]") instanceof Array           // returns true on Firefox 3.5
w.eval.call(w, "[]") instanceof Array   // returns true on Firefox 3.5

Единственное обходное решение, которое я вижу, анализирует JSON, представляют меня в виде строки.

8
задан 16 revs 21 January 2010 в 12:13
поделиться

4 ответа

Для того, что это стоит, это то, что я делаю сейчас:

  • Убедитесь, что jQuery-Json загружен в всплывающее окно
  • STRIFIFY OBJECT
  • Call w. $. EVALJSON (STR) , который связывает примитивы правильно
  • проходят, что приводит к способу всплывающего окна

, альтернативно (если jQuery-json недоступен), вы можете ввести следующий скрипт в Цель:

<script type="text/javascript">
function parseJSON(j) {
  return JSON.parse(j)
}
</script>

как это будет захватывать JSON, а не звонящий.

Любые лучшие решения с радостью оценены.

1
ответ дан 6 December 2019 в 00:57
поделиться

Чтобы увидеть это, открыть консоль Firebug И попробуйте:

Ошибка: разрешение запрещено для для получения окна свойств .Object из . На любой строке кроме первого: W = Open (« http://google.com ») Firefox 3.5.7

Думайте на мгновение: вы пытаетесь открыть новое окно с произвольным сайтом и отправлять ему данные, доступные для JS. Кажется слишком неуверенным, чтобы позволить этому.

0
ответ дан 6 December 2019 в 00:57
поделиться

Если вы пытаетесь сделать скрипты с перекрестным доменом, похоже JSONP может стоить расследование.

1
ответ дан 6 December 2019 в 00:57
поделиться

Я не могу сказать, что я полностью понимаю вашу проблему, но есть интересное окно. Им Hack, который стоит проверить: http://www.sitepen.com/blog/2008/ 07/22 / Windowname-Transport / (Post Blog использует dojo, но, конечно, это можно сделать с чистыми js). Это безопаснее, чем JSONP, легко реализовать, и кажется, работает на всех браузерах.
По сути, это позволяет хранить любые данные, из любой длины в окне . Время переменной . Что такое круто, это то, что эта переменная не будет покраснена / очищена на изменении / обновлении страниц, поэтому с некоторым умным использованием iframes вы получаете простой и безопасный перекрестный транспорт :)

1
ответ дан 6 December 2019 в 00:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: