【问题标题】:<use> within <svg> not finding closest <div> in IE<svg> 中的 <use> 在 IE 中找不到最近的 <div>
【发布时间】:2016-02-13 20:00:22
【问题描述】:

我有一个这样的结构:

<div class="linkedItem" data-yt="youtubelink">
  <svg><use></svg>
  <div>youtube link</div>
</div>

在 jQuery 中,我在包装器 &lt;div&gt; 上分配了一个点击事件:

$("div.linkedItem").on("click",launchYouTube);

function launchYouTube(e){
    var _src = $(e.target).closest(".linkedItem").data("yt"));
};

在事件处理程序中,我在 Chrome 中获得了 _src 的值,但在 IE11 中它是 undefined。好像IE11中的&lt;use&gt;不知道它的parent是什么,因此找不到最接近的div.linkedItem

我看到一篇关于svg gotchas 的文章,我能想到的最接近的是#4(jQuery 抛出错误),但出于某种原因我不认为就是这样。任何见解都值得赞赏。

【问题讨论】:

    标签: jquery internet-explorer svg shadow-dom


    【解决方案1】:

    对于每个 SVGUseElement,SVG DOM 维护一个 SVGElementInstance 类型对象的影子树(“实例树”)。 SVGUseElement 有一个 instanceRoot 属性,它指向位于阴影树根部的 SVGElementInstance。 SVGElementInstance 有一个对应的UseElement 属性,它指向 SVGUseElement。这两个属性允许您在主 DOM 树和影子树之间跳转。

    我在 Internet Explorer 和 Chrome 中测试了您的示例。在 Chrome 中,'click' 事件被传递给 SVGUseElement,然后 jQuery 使用它来向上遍历主 DOM 树以找到所需的 'div' 元素。在 Internet Exploer 中,'click' 事件被传递给 SVGElementInstance,然后 jQuery 使用它来向上遍历阴影树。由于影子树不是主 DOM 树的一部分,jQuery 永远不会找到所需的 'div' 元素。

    您可以通过检查目标来解决此问题。如果目标是 SVGElementInstance,则将 target.correspondingUseElement 传递给 jQuery,否则将目标传递给 jQuery。您可以通过测试对应的UseElement 属性或测试 toString() 是否等于“[object SVGElementInstance]”来检查 SVGELementInstance。

    例如,您可以替换...

    function launchYouTube(e){
        var _src = $(e.target).closest(".linkedItem").data("yt"));
    };
    

    与...

    function launchYouTube(e){
        var target = e.target;
        if (target.correspondingUseElement) {
            target = target.correspondingUseElement;
        }
        var _src = $(target).closest(".linkedItem").data("yt");
        console.log(JSON.stringify(_src));
    };    
    

    或者....

    function launchYouTube(e){
        var target = e.target;
        if (target.toString() === "[object SVGElementInstance]") {
            target = target.correspondingUseElement;
        }
        var _src = $(target).closest(".linkedItem").data("yt");
        console.log(JSON.stringify(_src));
    };    
    

    【讨论】:

    猜你喜欢
    • 2012-08-05
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 2016-03-12
    • 2017-10-30
    • 1970-01-01
    相关资源
    最近更新 更多