2011-09-14 32 views
1

我在onmouseover中調用javascript中的函數。在函數調用中,我包含srcElement(它是一個a-tag)。現在我需要獲取該標籤最接近的Iframe的offsetWidth。但是當我嘗試這個:Jquery獲取最接近的()返回undefined的A-tag的Iframe

alert($(srcElement).closest('iframe').offset().left); 

我得到undefined!這不起作用或者:

alert($(srcElement).closest('iframe').attr('title')); 

但這個工程並返回iframe的身體裏面的id:

alert($(srcElement).closest('body').attr('id')); 

這是我的HTML函數調用:

showPeopleDetails('User_Matt', event.clientX, event.clientY, event.srcElement); 

這是javascript的功能:

function showPeopleDetailsNow(UserId, x, y, srcElement){ 
    currentwidth = $(document).width(); 
    currentheight = $(document).height(); 
    adjustwidth = $(srcElement).closest('iframe').offset().left; 
    adjustheight = $(srcElement).closest('iframe').offset().top; 
    var calculatedheight = currentheight - adjustheight; 
    var calculatedwidth = currentwidth - adjustwidth; 

現在我正在這樣做,但這隻適用於我的網頁的一部分。由於id是由框架動態生成的。

adjustwidth = parent.document.getElementById('ivuFrm_page0ivu0').contentWindow.document.getElementById('ivuFrm_page0ivu2').offsetWidth; 
    adjustheight = parent.document.getElementById('ivuFrm_page0ivu0').contentWindow.document.getElementById('ivuFrm_page0ivu2').offsetHeight; 

有沒有什麼辦法讓從身體標記(偏移,這將是正確的iframe的偏移?我知道,我能得到身體元素的寬度,但它是不準確由幾個PX ...顯然,更好的將是Iframe的正確偏移量! Iframe與原始頁面具有相同的端口,協議和主機,我只需要它與Internet Explorer 8一起工作。 幫助很多讚賞!

更新:從Felix Kling和scr4ve提出的解決方案後,我發現我不能使用body元素或html元素的偏移量!因爲兩個偏移量都返回0,所以我假設Ifram e元素是dom中唯一具有相對於文檔的正確偏移量的對象。任何建議如何獲得具體的抵消?

+1

問題是'iframe'屬於外部文檔而不是內部文檔。'iframe'不存在於內部文檔層次結構中,'html'始終是最頂層的。 –

回答

2

關於這個問題做一些調查研究後,我找到了解決我的問題,通過使其基於由ingredient_15939在這個計算器問題提供的解決方案:Access Parent Iframe作爲菲利克斯克林提出的IFRAME不文檔層次存在的,所以我搜索所有的iframe來查找我的標籤的匹配正文。我的最終代碼的工作原理如下:

var searchbody = $(srcElement).closest('body'); 
var arrFrames = document.getElementsByTagName("iframe"); 

for(i = 0; i<arrFrames.length; i++){ 
    //I search and compare every IFRAME to the closest body of my srcElement 
    try{ 
     if(arrFrames[i].id != 'PeopleDetailsIframe'){ 
      if($(arrFrames[i].contentWindow.document.body).is(searchbody)){ 
     //The found IFrame has to be the one containing my a-tag 
       offsetwidth = $(arrFrames[i]).offset().left; 
       offsetheight = $(arrFrames[i]).offset().top; 
      } 
      else{ 
        //console.log("Iframe not found"); 
      } 
     } 
     } 
     catch(e){ 
       //Iframe has security issues --> avoid it 
     } 
} 

希望這可以幫助別人的!

0

根據the docs,.closest()僅考慮直接的祖先。我猜你的iframe不是直接您的a標籤的父母?仔細閱讀Tree Traversal的文檔。 .silbings()可能符合您的需求。

順便說一句,考慮使用console.log而不是alert。

澄清後的更新:$("html").offset()在這種情況下是足夠的和更高性能的。框架中只有一個html標籤,不需要.closest()。 OP可能對.outerWidth()/Height也有興趣。

+0

'直接祖先!==直接父母'。最終,整個文檔位於'iframe'內,因此可以將其視爲文檔內每個節點的祖先。 –

+0

我在說'