2011-01-21 37 views
4

我在頁面上顯示若干個iframe,它向用戶顯示 廣告 獨角獸/培根。因爲它不可能通過父檢測iframe的domready中的事件(請讓我知道這是不是真的)我有一些初始化代碼在每個IFRAME這樣的:查找在其父代中調用函數的iframe

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

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

parentdocument有代碼非常類似於以下(通過@保羅愛爾蘭about this technique):

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位,轉而使用id(或data-*或其他)是父文檔初始化代碼中的實際IFRAME元素。

如果我可以通過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的瀏覽器documentwindow的DOM - 包括Adobe AIR 2.5?

+2

+1獨角獸/培根獨角獸一個iframe中。至少它與* ads *無關......) – 2011-01-21 15:31:50

回答

1

我現在已經發現,包含你

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