SVG中的jQuery .offset()在Safari中不起作用

问题描述 投票:0回答:1

我有一个地图SVG与一些互动点。悬停点显示位于点附近的HTML div

所以我在SVG中使用jQuery .offset()。它在Chrome和Firefox中运行良好,但它似乎在Safari中不起作用。它总是回归

{top: 0, left: 0}

HTML / SVG

<svg xmlns="http://www.w3.org/2000/svg" width="1211" height="1198">
    (...)
    <g data-city="amsterdam">
    <path/>
  </g>
    <g data-city="london">
    <path/>
  </g>
    <g data-city="paris">
    <path/>
  </g>
  (...)
</svg>

jQuery的

    // -- Open infosbox --
  $('[data-city]').on('touchstart mouseover', function(){
    var city = $(this).attr('data-city');
    var cityEl = $('.city--'+city);
    var offset = setOffsetPosition($(this), cityEl);

    $('.city').removeClass('active');
    cityEl.offset(offset).addClass('active');
  });

  // -- Close infosbox --
  $('[data-city]').on('mouseleave', function(){
        $('.city').removeClass('active');
  });

    function setOffsetPosition($this, $el) {
        var offset = $this.offset();
        var elW = $el.width();
        var elH = $el.height();
        var marginB = 20;
        offset.top = offset.top - (elH + marginB);
        offset.left = offset.left - (elW/2);
        return offset;
    }

完整代码

这是我的codepen看到的完整代码,欢迎任何帮助

jquery svg safari
1个回答
3
投票

如果jQuery是一个针对SVG支持的库,我会称之为jQuery错误。但事实并非如此,因此他们可以说这是Safari必须修复的上游错误。

会发生什么是jQuery代码的this part

    // Return zeros for disconnected and hidden (display: none) elements (gh-2310)
    // Support: IE <=11 only
    // Running getBoundingClientRect on a
    // disconnected node in IE throws an error
    if ( !elem.getClientRects().length ) {
        return { top: 0, left: 0 };
    }

这被认为是IE的后备,以确保不会因断开连接的DOM节点而引发错误。但是它使用接口Element.getClientRects(),如果元素在SVG名称空间中,Safari会返回一个空列表。

解决这个问题的方法是直接使用其余的代码。您知道所选节点是文档的一部分,因此提到的错误不会发生:

function setOffsetPosition($this, $el) {
    var rect = $this[0].getBoundingClientRect();
    var win = $this[0].ownerDocument.defaultView;

    var elW = $el.width();
    var elH = $el.height();
    var marginB = 20;
    return {
         top: rect.top + win.pageYOffset - (elH + marginB),
         left: rect.left + win.pageXOffset - (elW/2)
    };
}
© www.soinside.com 2019 - 2024. All rights reserved.