找到在其父级中调用函数的iframe

时间:2011-01-21 15:29:57

标签: javascript jquery webkit air

我在页面上有几个iframe向用户显示 ads unicorns / bacon。因为无法通过父级检测到iframe的domready事件(如果不是这样,请告诉我)我在每个iframe中都有一些初始化代码,如下所示:

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

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

parent document的代码与以下代码非常相似(about this technique来自@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);
};

这是example in jsfiddleyou can edit it here)。它的效果很好(至少在Chrome开发中是这样)。

现在我想做的就是摆脱iframe中的data-controller位,而是使用实际iframe元素的id(或data-*或其他)在父文档中初始化代码。

如果我可以通过DOMWindow查询DOM,它将如下所示:

$.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中测试)。

因为S.O.当一个问题在这里有一个问题时,回答者喜欢它:

是否有任何(有效)方法可以在基于webkit的浏览器(包括Adobe Air 2.5)中通过documentwindow查询DOM?

1 个答案:

答案 0 :(得分:1)

我现在已经找到了一个包含独角兽的iframe

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