«ошибка: ошибка ReferenceError: ошибка безопасности: попытка чтения защищенной переменной: запись» с Opera 11.5 и window.open и document.write

#javascript #opera #window.open #document.write

#javascript #opera #window.open #document.write

Вопрос:

У меня возникла проблема с window.open, которая возникает только с Opera (версия 11.5).

 function openpageopera()
{
  var w = window.open("","_blank");
  try
  {
    w.document.write("<p>hello</p>world");
    w.document.close();
  }
  catch(err)
  {
    alert("error:"   err);
  }
}
  

Теперь он работает безупречно, когда я выполняю эту функцию после загрузки страницы, следовательно:

 $(document).ready(function() {
  openpageopera();
});
  

И это также работает, если я открываю URL-адрес, такой как Google, yahoo, или даже веб-страницу со своего веб-сервера.

Однако, когда я прикрепляю его к событию onclick, например, к кнопке HTML, происходит сбой.

 <input type="button" value="Fails" onclick="openpageopera();">
  

Что конкретно не удается? Ну, страница открывается, но она пуста. document.write НЕ работает. В улове была отмечена ошибка:

ошибка: ошибка ссылки: ошибка безопасности: попытка чтения защищенной переменной: запись

Я не понимаю, почему выполнение этого на кнопке html вызывает ошибку безопасности. Почему это происходит и как я могу это решить?

Большое вам спасибо за вашу помощь!

Комментарии:

1. У меня не сбой (opera 11.51)

2. Можете ли вы вставить свой полный код, чтобы я мог его протестировать?

3. Ее это: jsfiddle.net/doktormolle/EePex

4. Да, ваш код действительно работает. Нечетно. Я скопировал все содержимое своего документа и вставил его в новый документ и переименовал файл. Этот новый документ работал нормально, но его код точно такой же. Затем я очистил все личные данные и попробовал как оригинал, так и дубликат, и они оба работали нормально. Это странно, потому что я убедился, что очистил кеш (shift или ctrl обновить). Должно быть, это была проблема с кэшированием, хотя, я думаю, я не совсем уверен. Спасибо за вашу помощь.

5. Я получаю то же сообщение при попытке запустить phpmyadmin (opera версии 11.52)…

Ответ №1:

Если где-то есть код, он может изменить контекст document.domain безопасности родительской страницы. (Это также происходит, если document.domain имеет текущее значение.) Когда вы открываете «» или about:blank, он должен наследовать родительский контекст безопасности и document.write() должен работать, но я знаю, что в прошлом у Opera были некоторые ошибки, когда настройка document.domain вызывала проблемы при работе с пустыми всплывающими окнами. Я полагаю, что эти ошибки исправлены в 11.50, но, похоже, вы столкнулись с аналогичной проблемой. По возможности избегайте установки document.domain..

Если вы увидите, что эта проблема возникает снова, пожалуйста, сообщите мне об этом и, желательно, дайте мне увидеть полный код. Я бы хотел исправить эту ошибку в каждом воплощении..

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

Комментарии:

1. Спасибо. Я не устанавливаю document.domain. Я использую jQuery через CDN; поэтому, если они не манипулируют им, я вообще его не использую.

2. В этом случае — и если проблема действительно исчезла после очистки личных данных — вы, вероятно, правы, что это была какая-то проблема с кэшем. Я никогда не видел этого сам и очень мало знаю о том, как организованы данные кэша, но, возможно, ошибка в таблице кэша может заставить Opera применить неправильный контекст безопасности для страницы? это очень странно.. :-/

Ответ №2:

Я закончил очистку всех личных данных в браузере Opera, и это сработало. Однако каждый раз, когда я загружал страницу, я обязательно нажимал shift или ctrl обновить, чтобы очистить кеш. Либо это была проблема с кешем, либо что-то совсем другое.