Jquery获取最近的()if-a返回未定义的A-tag

时间:2011-09-14 09:20:59

标签: javascript jquery iframe internet-explorer-8 offset

我在onmouseover的javascript中调用了一个函数。在函数调用中,我包含srcElement(它是一个a-tag)。现在我需要得到该a-tag最近的Iframe的offsetWidth。但是当我尝试这个时:

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

我未定义!这也不起作用:

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;

有没有办法从body标签获取偏移量(并且它是iframe的正确偏移量?我知道我可以获得body-element的宽度,但是它不准确几个px ...显然,更好的是Iframe的正确偏移量! Iframe具有与原始页面相同的端口,协议和主机。我只需要它与Internet Explorer 8一起工作。 非常感谢帮助!

更新:经过Felix Kling和scr4ve提出的解决方案后,我发现我无法使用body元素或html元素的偏移量!由于两个偏移都返回0,我假设iframe元素是dom中唯一具有相对于文档的正确偏移量的对象。有关如何获得特定偏移的任何建议吗?

2 个答案:

答案 0 :(得分:3)

在对这个主题做了一些更多的研究之后,我找到了解决问题的方法,基于在这个stackoverflow问题中由ingredient_15939提供的解决方案:Access Parent Iframe正如Felix Kling建议文档中不存在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
      } 
}

希望这也可以帮助其他人!

答案 1 :(得分:0)

根据the docs,.closest()只考虑直接祖先。我想你的iframe不是你的a-tag的直接父级?仔细查看Tree Traversal的文档。 .silbings()可能符合您的需求。

顺便说一句,考虑使用console.log而不是alert。

澄清后更新:在这种情况下,$("html").offset()足够且性能更高。框架中只有一个html标签,不需要.closest()。 OP也可能对.outerWidth() / Height感兴趣。