Проверьте, имеет ли JS доступ к документу iframe
Есть ли стандартный способ узнать, имеет ли мой script доступ к документу iframe
?
Я не мог найти ничего в Интернете, поэтому я придумал это:
function checkifr() {
function errHandler() {
alert('Error. Try again later.');
}
var ifr = $('#ifr')[0]; //the iframe DOM element
try {
var d = ifr.contentWindow || ifr.contentDocument;
if (!d) {
errHandler();
return false;
}
var b = $('#ifr').contents().find('body');
//... manipulate iframe content
} catch(e) {
errHandler();
}
}
Это работает, Firefox вызывает ошибку, когда я пытаюсь получить доступ к содержимому iframe
и заканчивается в блоке catch
. Chrome показывает предупреждение Unsafe JavaScript attempt to access frame
в консоли, но никогда не входит в блок catch
, он возвращает null
для этих попыток, поэтому первоначальный if (!d)
позаботится об этом. Opera и IE ведут себя аналогично FF. Изменить:. В приведенном выше коде теперь Chrome возвращает "пустой" объект Window (без свойств), которые не запускают мой блок if
. Отметьте Esailija ответ, который прекрасно работает в кросс-браузере!
Здесь скрипт.
I не может проверить iframe
src
на window.location
.
Исправление:. Это связано с тем, что эта функция является частью небольшого плагина для загрузки изображений, который я разрабатываю (используя iframe
как цель, поскольку IE < 9 не поддерживает XHR2) и цель в основном заключается в проверке ошибки соединения/таймаута/и т.д. Страницы браузера по умолчанию для этих ошибок подчиняются одной и той же полиции происхождения, поэтому цель этого вопроса. Я не хочу посылать вызов ajax, чтобы проверить, доступна ли страница, поскольку я хочу проверить сам запрос отправки. jQuery .load не срабатывает для ошибок, jQuery .error и атрибут onerror
HTML не работайте для этого. Иллюстрация рабочего script доступна здесь, но вы можете полностью игнорировать его и просто ответить на вопрос ниже.
Обратите внимание, что приведенный выше блок предназначен исключительно для иллюстрации того, почему я не могу использовать iframe.src
.
Я думаю, что должен быть простой/стандартный способ проверки доступности iframe
, но я не могу найти что-либо в Интернете или SO, кроме полурешений, которые просто проверяют iframe.src
и не делают применяются для многих случаев. Если мой хакерский блок try
/catch
считается технически "чистым" решением, другие могут повторно использовать его, если не найден лучший вариант.
Итак, есть ли какой-либо стандартный или более простой способ или плагин jQuery, чтобы проверить, имеет ли мой script доступ к документу iframe
без сравнения iframe
src
с window.location
? Без try
/catch
блоков и ошибок/предупреждений в консоли, если это возможно.
Ответы
Ответ 1
Здесь другой вариант не может сделать это без try catch.
Тесты http://jsfiddle.net/LHjwZ/11/
function checkIframe( ifr ) {
var key = ( +new Date ) + "" + Math.random();
try {
var global = ifr.contentWindow;
global[key] = "asd";
return global[key] === "asd";
}
catch( e ) {
return false;
}
}
Ответ 2
Вот одна идея, которая будет работать независимо от того, выбрали ли исключения исключение или нет:
function checkFrameAccess(ifr) {
try {
var doc = ifr.contentDocument || ifr.contentWindow.document;
var origClass = doc.body.className;
var newClass = origClass += " xxxxx";
doc.body.className = newClass;
var valid = doc.body.className == newClass;
doc.body.className = origClass;
return(valid);
} catch(e) {
return(false);
}
}
Если они генерируют исключение, вы попадаете в обработчик исключений и возвращаете false
. Если они не генерируют исключение, то вы проверяете, действительно ли вы можете изменить имя класса тега body в кадре. Если модификация работает, то, видимо, вы можете ее изменить. Если нет, то это не позволит вам получить к нему доступ.