Проверьте, имеет ли 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 .ошибка и атрибут HTML onerror не работают для этого. Один иллюстрация рабочего сценария доступна здесь, но вы можете полностью проигнорировать ее и просто ответить на вопрос ниже.

Обратите внимание, что приведенный выше блок предназначен исключительно для иллюстрации того, почему я не могу использовать iframe.src.

Я действительно думаю, что должен быть более простой/стандартный способ проверить "доступность" iframe, но я не могу найти ничего в интернете, кроме полурешений, которые просто проверяют iframe.src и не применяются во многих случаях. Если мой хакиш try / catch блок считается технически "чистым" решением, другие могут повторно использовать его, если не будет найден лучший вариант.

Итак, существует ли какой-либо стандартный или более простой способ или плагин jQuery, чтобы проверить, имеет ли мой скрипт доступ к документу iframe, не сравнивая iframe src с window.location? Без него try/catch блоки и ошибки/предупреждения в консоли, если это возможно.

2 13

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 во фрейме. Если модификация работает, то, по-видимому, вы можете ее изменить. Если нет, то он не позволит вам получить к нему доступ.