【问题标题】:jQuery click isn't triggered on SVG <g> but on child elementsjQuery 点击不是在 SVG <g> 上触发,而是在子元素上触发
【发布时间】:2019-07-16 16:53:30
【问题描述】:

我有一个 SVG,我试图通过使用 jQuerys 单击事件将其用作某种导航。

SVG 有几个组,其中包含各种路径和文本。当直接单击行/路径/文本时,会触发事件,但是当单击透明区域时,尽管仍然是组,但不会触发事件。关于如何定位整个区域有什么建议吗?

示例小提琴:如果您在正方形内或直接在线条上单击它会触发,但如果您在正方形和线条之间单击它不会

https://jsfiddle.net/benhnoou/96q1beu8/2/

jQuery:

$( "#diag-diagnosis" ).click(function() { 
    alert('diagnosis');
});

SVG 代码:

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 240.5 200">
  <defs>
    <style>
      .cls-1 {
        fill: #fff;
      }

      .cls-2 {
        fill: none;
        stroke: #000;
        stroke-miterlimit: 10;
        stroke-width: 4px;
      }
    </style>
  </defs>
  <title>Asset 1</title>
  <g id="Layer_2" data-name="Layer 2">
    <g id="Layer_1-2" data-name="Layer 1">
      <g id="diag-diagnosis">
        <g>
          <rect class="cls-1" x="0.5" y="0.5" width="201" height="199"/>
          <path d="M201,1V199H1V1H201m1-1H0V200H202V0Z"/>
        </g>
        <line class="cls-2" x1="238.5" y1="16.5" x2="238.5" y2="167.5"/>
      </g>
    </g>
  </g>
</svg>

【问题讨论】:

    标签: javascript jquery svg


    【解决方案1】:

    您可能想查看来自 SVG2 的 pointer-eventspointer-eventsbounding-box 属性适用于组和形状。所以这应该使两个对象之间的透明区域可点击。

    $("#diag-diagnosis").click(function() {
      alert('diagnosis');
    });
    #diag-diagnosis {
      pointer-events: bounding-box;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 240.5 200">
      <defs>
        <style>
          .cls-1 {
            fill: #fff;
          }
    
          .cls-2 {
            fill: none;
            stroke: #000;
            stroke-miterlimit: 10;
            stroke-width: 4px;
          }
        </style>
      </defs>
      <title>Asset 1</title>
      <g id="Layer_2" data-name="Layer 2">
        <g id="Layer_1-2" data-name="Layer 1">
          <g id="diag-diagnosis">
            <g>
              <rect class="cls-1" x="0.5" y="0.5" width="201" height="199"/>
              <path d="M201,1V199H1V1H201m1-1H0V200H202V0Z"/>
            </g>
            <line class="cls-2" x1="238.5" y1="16.5" x2="238.5" y2="167.5"/>
          </g>
        </g>
      </g>
    </svg>

    【讨论】:

    • 这在 Firefox 中似乎不起作用,但在 Chrome 中却很可靠。到目前为止,我认为我可以在可点击元素上使用透明形状并改为定位它们
    • 是的,不幸的是,pointer-events 似乎是 Firefox 中尚未(尚未)解决的问题:bugzilla.mozilla.org/show_bug.cgi?id=945187
    【解决方案2】:

    尝试用标签包裹它

    jsfiddle example

    <a><svg></svg></a>
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多