Проверьте, имеет ли JS доступ к документу iframe
Есть ли какой-либо стандартный способ узнать, имеет ли мой скрипт доступ к документу 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. Edit: теперь Chrome возвращает "пустой" объект окна (без свойств), который не вызывает мой блок if
. Проверьте ответ Esailija , который прекрасно работает в кросс-браузере!
Вот скрипка.
Я не могу проверить iframe
's src
против window.location
.
Обратите внимание, что приведенный выше блок предназначен исключительно для иллюстрации того, почему я не могу использоватьJustificatory Background: это потому, что эта функция является частью небольшого плагина загрузки изображений, который я разрабатываю (используя
iframe
как цель, так как IE.обработчик load не срабатывает для ошибок, jQuery .ошибка и атрибут HTMLonerror
не работают для этого. Один иллюстрация рабочего сценария доступна здесь, но вы можете полностью проигнорировать ее и просто ответить на вопрос ниже.
iframe.src
.
Я действительно думаю, что должен быть более простой/стандартный способ проверить "доступность" iframe
, но я не могу найти ничего в интернете, кроме полурешений, которые просто проверяют iframe.src
и не применяются во многих случаях. Если мой хакиш try
/ catch
блок считается технически "чистым" решением, другие могут повторно использовать его, если не будет найден лучший вариант.
Итак, существует ли какой-либо стандартный или более простой способ или плагин jQuery, чтобы проверить, имеет ли мой скрипт доступ к документу iframe
, не сравнивая iframe
src
с window.location
? Без него try
/catch
блоки и ошибки/предупреждения в консоли, если это возможно.
2 ответа:
Вот еще один вариант, не могу действительно сделать это без 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; } }
Вот одна идея, которая будет работать независимо от того, вызовет ли доступ исключение или нет:
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 во фрейме. Если модификация работает, то, по-видимому, вы можете ее изменить. Если нет, то он не позволит вам получить к нему доступ.