Найдите iframe, который вызвал функцию в родительском элементе - PullRequest
4 голосов
/ 21 января 2011

У меня есть несколько фреймов на странице, которые отображают рекламу единорогов / бекон для пользователей.Поскольку невозможно определить событие domready iframe через родительский (пожалуйста, дайте мне знать, если это не так), у меня есть некоторый код инициализации в каждом iframe, подобный этому:

<body data-controller="unicorn">
    <!-- content -->

    <script>
        var $ = parent.jQuery;
        if($ && $.frameReady){
            $(document).ready(function(){
                $.frameReady(document);
            });
        }
    </script>
</body>

parentdocument имеет код, очень похожий на следующий ( об этой технике через @Paul Irish):

var frames = {
    // the following is irrelevant to my question but awesome.
    "unicorn": function (document) {
        var script = document.createElement("script"),
            element = document.getElementsByTagName("script")[0];
        script.src = "http://www.cornify.com/js/cornify.js";
        script.onload = function () {
            // defaultView is the DOMWindow.
            document.defaultView.cornify_add();
            $(document).click(document.defaultView.cornify_add);
            script.parentNode.removeChild(script);
        };
        element.parentNode.appendChild(script, element);
    },
    "bacon" : function(document) { /** mmm, bacon **/ }
};
// relevant but boring...
$.frameReady = function(document){
    var controller = $(document.body).data("controller");
    controller && frames[controller] && frames[controller](document);
};

Вот пример в jsfiddle ( Вы можете редактировать это здесь ).Он отлично работает (по крайней мере, в Chrome dev).

Теперь мне хотелось бы избавиться от бита data-controller в iframe и вместо этого использовать id (или data-*).или что-то еще) фактического элемента iframe, который находится в родительском документе для инициализации кода.

Если бы я мог запросить DOM через DOMWindow, это выглядело бы так:

$.frameReady = function(document){
    var iframe = $("body").find(document.defaultView),
        controller = iframe.data("controller");
    controller && frames[controller] && frames[controller](document);
};

К счастью, мне это нужно только для работы в браузерах на основе webkit, на самом деле в Adobe Air 2.5 (но я тестирую в Chrome ATM).

Потому что SO, отвечающие на вопросы, любят, когда у Вопроса возникает вопрос:1030 *

Существуют ли (эффективные) способы запроса DOM через document или window в браузерах на основе webkit, включая Adobe Air 2.5?

1 Ответ

1 голос
/ 21 января 2011

Я обнаружил, что один фрейм, содержащий единорога для вас

console.log(
        $("iframe").contents().filter( function(){
           return this == document
        }).length
);
...