2013-01-22 5 views
2

У меня есть страница, содержащая iframe, в которой я ожидаю, что в пределах iframe пользователь перейдет на множество разных страниц - все они в том же домене, что и родительская.освобожден скрипт с hasOwnProperty

В окне верхнего уровня у меня есть постоянный объект, назовем его appData. И в IFRAME У меня часто бывает такие строки

parent.appData[someProperty] = {a : 1, b : 2}; 

Я в курсе общей проблемы высвобождаемых ошибок сценария, и я понимаю, что я не должен пытаться вызывать любые произвольные методы такого объекта с происходящим документа может быть выгружены, но, конечно, hasOwnProperty не должен быть таким способом, и я должен иметь возможность сказать, в какой-то следующей странице ребенка:

if (parent.appData[someProperty].hasOwnProperty('a')) 

я не должен? И вот что странно: он работает так, как я ожидаю, в каждом браузере, который я тестировал, кроме MSIE 10. Я видел недавний ответ на IE9 "Can't execute code from freed script" when calling hasOwnProperty(), и действительно, используя in, похоже, хорошо работает для моего случая, но мне интересно, имею ли я «обманывать» все время или если это ошибка в MSIE 10.

jsFiddle не обрабатывает iframe, поэтому я не уверен, как лучше всего продемонстрировать это с примером, извините.

ответ

2

Лично я буду обрабатывать все функции аналогичным образом, если вас беспокоит проблема с свободным скриптом, включая встроенные, такие как hasOwnProperty. В этом конкретном случае его все еще можно технически интерпретировать как функцию для объекта, и, по-видимому, некоторые браузеры рассматривают его как таковой (IE10), а другие рассматривают его как особый случай, который все еще доступен (другие, о которых вы упоминаете). Даже если бы он работал во всех браузерах, я все равно был бы не прав.

Таким образом, не зная о вашем точном случае, но не могли бы вы вместо того, чтобы сделать что-то вроде:

var appData = parent.appData || {}; 
var someProperty = appData[someProperty] || {}; 
if(someProperty[a] !== undefined){ 
    .. 
} 

В противном случае, вы всегда можете окружить его с try..catch

Update
И, конечно, вы также можете использовать in, как указано в связанном с вами вопросе.

+0

Да, возможно, моя интуиция просто ошибается в этом, но я думал, что «просто данные» не подпадают под освобожденное ограничение скрипта, а «код» есть. И 'hasOwnProperty' на самом деле не является« частью »объекта, по этой мысли, это просто метод, который вы можете назвать. – Dan

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