Я пытаюсь сделать метод, который передает объекты похожему методу во всплывающем окне. Я не управляю кодом в целевом методе, или объект передал в. Целевой метод в настоящее время сериализирует объект, с помощью JSON.stringify
если это возможно, или instanceof Array
.
Первой проблемой с этим является ошибка в IE8 (см. ниже). Второе, и более фундаментальный, то, что примитивы не являются тем же через окна:
w = open("http://google.com")
w.Array == Array // returns false
Переопределение на всплывающем окне любые классы, которые могли бы быть переданы в, и затем восстановление их после работ вызова, но это является действительно хрупким и головная боль обслуживания.
Сериализация объекта в JSON и затем парсинг его в контексте окна поражают ошибку Firefox ниже.
Я, также немного ненавидят, чтобы сделать глубокую копию объекта или проанализировать использование JSON new w.Object
, и т.д., потому что не такое чувство, что это должен быть сложный.
Кто-либо может предложить разумный способ иметь дело с этим, или я должен просто признать, что объекты не могут быть переданы дословно между окнами?
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
, но поскольку последний тест показывает, что повреждения, когда у Вас есть объекты из обоих окон.
Это кажется тем вызовом 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, представляют меня в виде строки.
Для того, что это стоит, это то, что я делаю сейчас:
w. $. EVALJSON (STR)
, который связывает примитивы правильно , альтернативно (если jQuery-json недоступен), вы можете ввести следующий скрипт в Цель:
<script type="text/javascript">
function parseJSON(j) {
return JSON.parse(j)
}
</script>
как это будет захватывать JSON, а не звонящий.
Любые лучшие решения с радостью оценены.
Чтобы увидеть это, открыть консоль Firebug И попробуйте:
Ошибка: разрешение запрещено для
Думайте на мгновение: вы пытаетесь открыть новое окно с произвольным сайтом и отправлять ему данные, доступные для JS. Кажется слишком неуверенным, чтобы позволить этому.
Если вы пытаетесь сделать скрипты с перекрестным доменом, похоже JSONP может стоить расследование.
Я не могу сказать, что я полностью понимаю вашу проблему, но есть интересное окно. Им
Hack, который стоит проверить: http://www.sitepen.com/blog/2008/ 07/22 / Windowname-Transport / (Post Blog использует dojo, но, конечно, это можно сделать с чистыми js). Это безопаснее, чем JSONP, легко реализовать, и кажется, работает на всех браузерах.
По сути, это позволяет хранить любые данные, из любой длины в окне . Время
переменной . Что такое круто, это то, что эта переменная не будет покраснена / очищена на изменении / обновлении страниц, поэтому с некоторым умным использованием iframes вы получаете простой и безопасный перекрестный транспорт :)