【问题标题】:Jquery Get closest() Iframe of an A-tag returning undefinedJquery获取返回未定义的A标签的最近()Iframe
【发布时间】:2011-09-16 17:31:51
【问题描述】:

我在 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 中唯一具有相对于文档的正确偏移量的对象。有什么建议如何获得特定的偏移量?

【问题讨论】:

  • 问题是iframe 属于外部文档而不属于内部文档。 iframe 不存在于内部文档层次结构中,html 始终位于顶部。

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


【解决方案1】:

在对该主题进行了更多研究之后,我找到了解决问题的方法,方法是基于以下 stackoverflow 问题中的成分_15939 提供的解决方案:Access Parent Iframe 正如 Felix Kling 建议的那样,文档层次结构中不存在 IFRAME,所以我在所有 iframe 中搜索我的 a 标签的匹配正文。我的最终代码如下:

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
      } 
}

希望这对其他人也有帮助!

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • direct ancestors !== direct parent 。最终,整个文档都在 iframe 内,因此可以将其视为文档内每个节点的祖先。
    • 我说的是&lt;body&gt;&lt;a/&gt;&lt;iframe/&gt;&lt;/body&gt;。你说的是&lt;body&gt;&lt;iframe&gt;&lt;a/&gt;&lt;/iframe&gt;&lt;/body&gt;。我不太确定真正的问题是什么样的。
    • 是的。但从 OP 提到 body 元素的事实来看,我怀疑链接在 iframe 内。
    • 是的!抱歉回复晚了,但链接确实在 iframe 中。我需要遍历 DOM-Tree 到该链接最近的 iframe。这是我想要的特定 iframe。现在我得到了最接近的 body-element 的宽度,它是 iframe 的 body 元素,但正如所说的那样,它有几个 px 不准确。
    • 你是对的。 OP 不必要地使用 .closest() 来愚弄我。 $("html").offset() 足够了,而且性能更高。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多