Подтвердить что ты не робот

Проверьте, имеет ли 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 блоков и ошибок/предупреждений в консоли, если это возможно.

4b9b3361

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