我在页面上有几个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 jsfiddle(you 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)中通过document
或window
查询DOM?
答案 0 :(得分:1)
我现在已经找到了一个包含独角兽的iframe
console.log(
$("iframe").contents().filter( function(){
return this == document
}).length
);