Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/480.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用javascript单击svg元素_Javascript_Html_Svg - Fatal编程技术网

使用javascript单击svg元素

使用javascript单击svg元素,javascript,html,svg,Javascript,Html,Svg,我有一个简单的HTML页面,其中包含一个作为对象嵌入的svg图像。我想使用javascript使svg中的元素可以单击 单击svg的特定元素(具有id='node1')后,我希望执行函数testFunc 我试图创建一个事件侦听器,但没有成功。该对象似乎没有contentDocument <!DOCTYPE html> <html lang="en" dir="ltr"> <head> <meta charset="utf-8">

我有一个简单的HTML页面,其中包含一个作为对象嵌入的svg图像。我想使用javascript使svg中的元素可以单击

单击svg的特定元素(具有
id='node1'
)后,我希望执行函数
testFunc

我试图创建一个事件侦听器,但没有成功。该对象似乎没有contentDocument

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>

    <script>
      function testFunc()
      {
      alert("test")
      }
    </script>

  </head>
  <body>

    <div style="text-align:center;">
      <object type="image/svg+xml" data="graph-test.svg" id="flow">
       fallback here
      </object>
    </div>

  <script>
    window.addEventListener("load", function() {
      var svgObject = document.getElementById('flow').contentDocument;
      var node1 = svgObject.getElementById('node1');
      node1.addEventListener("click", testFunc)
    });
  </script>


  </body>
</html>

函数testFunc()
{
警报(“测试”)
}
退后
addEventListener(“加载”,函数(){
var svgObject=document.getElementById('flow').contentDocument;
var node1=svgObject.getElementById('node1');
node1.addEventListener(“单击”,testFunc)
});
这是svg

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">


<svg width="407pt" height="360pt"
 viewBox="0.00 0.00 406.71 360.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 356)">
<title>%3</title>
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-356 402.7104,-356 402.7104,4 -4,4"/>
<!-- A -->
<g id="node1" class="node">
<title>A</title>
<polygon fill="#666699" stroke="#666699" points="350.0797,-352 130.7514,-352 130.7514,-316 350.0797,-316 350.0797,-352"/>
<text text-anchor="middle" x="240.4155" y="-336.8" font-family="Times,serif" font-size="14.00" fill="#ffffff">It&#39;s annoying that you are </text>
<text text-anchor="middle" x="240.4155" y="-322.8" font-family="Times,serif" font-size="14.00" fill="#ffffff"> enduring something that&#39;s annoying</text>
</g>
<!-- B -->
<g id="node2" class="node">
<title>B</title>
<polygon fill="#666699" stroke="#666699" points="168.7467,-194 .0844,-194 .0844,-158 168.7467,-158 168.7467,-194"/>
<text text-anchor="middle" x="84.4155" y="-178.8" font-family="Times,serif" font-size="14.00" fill="#ffffff">Did you do something you </text>
<text text-anchor="middle" x="84.4155" y="-164.8" font-family="Times,serif" font-size="14.00" fill="#ffffff"> sohuld not have done?</text>
</g>
<!-- A&#45;&gt;B -->
<g id="edge1" class="edge">
<title>A&#45;&gt;B</title>
<path fill="none" stroke="#000000" d="M169.3515,-315.8946C140.9836,-304.9901 110.8283,-288.0007 92.7729,-262 81.2401,-245.3921 79.5349,-222.4318 80.5057,-204.4125"/>
<polygon fill="#000000" stroke="#000000" points="84.0144,-204.4538 81.3619,-194.1964 77.0388,-203.8691 84.0144,-204.4538"/>
<text text-anchor="middle" x="153.2368" y="-250.8" font-family="Times,serif" font-size="14.00" fill="#000000">If something == True</text>
</g>
<!-- L -->
<g id="node3" class="node">
<title>L</title>
<polygon fill="#666699" stroke="#666699" points="218.7194,-36 106.1116,-36 106.1116,0 218.7194,0 218.7194,-36"/>
<text text-anchor="middle" x="162.4155" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#ffffff">Are you a human</text>
</g>
<!-- A&#45;&gt;L -->
<g id="edge3" class="edge">
<title>A&#45;&gt;L</title>
<path fill="none" stroke="#000000" d="M239.9121,-315.702C238.2911,-274.3429 231.5128,-170.9534 203.4155,-90 197.8971,-74.1005 188.8589,-57.6949 180.6709,-44.5669"/>
<polygon fill="#000000" stroke="#000000" points="183.5451,-42.5656 175.1918,-36.0485 177.6578,-46.3523 183.5451,-42.5656"/>
<text text-anchor="middle" x="243.1914" y="-171.8" font-family="Times,serif" font-size="14.00" fill="#000000">False</text>
</g>
<!-- C -->
<g id="node4" class="node">
<title>C</title>
<polygon fill="#666699" stroke="#666699" points="398.5063,-194 306.3248,-194 306.3248,-158 398.5063,-158 398.5063,-194"/>
<text text-anchor="middle" x="352.4155" y="-171.8" font-family="Times,serif" font-size="14.00" fill="#ffffff">Are you a old</text>
</g>
<!-- A&#45;&gt;C -->
<g id="edge2" class="edge">
<title>A&#45;&gt;C</title>
<path fill="none" stroke="#000000" d="M253.2634,-315.8754C272.9061,-288.1651 310.5217,-235.1002 333.3524,-202.8926"/>
<polygon fill="#000000" stroke="#000000" points="336.4449,-204.5822 339.3726,-194.3999 330.7341,-200.5341 336.4449,-204.5822"/>
<text text-anchor="middle" x="318.4707" y="-250.8" font-family="Times,serif" font-size="14.00" fill="#000000">Dunno</text>
</g>
<!-- B&#45;&gt;L -->
<g id="edge4" class="edge">
<title>B&#45;&gt;L</title>
<path fill="none" stroke="#000000" d="M93.3631,-157.8754C106.926,-130.4019 132.7926,-78.0054 148.7295,-45.723"/>
<polygon fill="#000000" stroke="#000000" points="152.0437,-46.9161 153.332,-36.3999 145.7669,-43.8174 152.0437,-46.9161"/>
<text text-anchor="middle" x="160.2466" y="-92.8" font-family="Times,serif" font-size="14.00" fill="#000000">MYLABEL</text>
</g>
</g>
</svg>

%3
A.
它';It’你真讨厌
忍受';真烦人
B
你做了什么事吗
难道你不该这么做吗?
A-;B
如果某事=真
L
你是人类吗
A-;L
假的
C
你是老人吗
A-;C
不知道
B-;L
迈拉贝尔
返回一个XMLDocument,它是svg文档的根。不幸的是,我们对它的层次结构还不够深入。我们对孩子们很感兴趣。如果您添加一个.childNodes,您将得到节点列表——或多或少是一个数组——它包含两个元素——而我们对第二个感兴趣,因为它包含实际的svg数据。 我们可以通过以下方式访问它:

var svgObject = document.getElementById('flow').contentDocument.childNodes[1];
好了,就是这样-现在您可以使用以下方法获得对所需svg组的引用:

var node1 = svgObject.getElementById('node1');

文件://
协议提供的资源被视为跨来源。
这意味着您将无法访问这些资源的内容


改用本地服务器。

id
放在svg本身上,而不是放在
g
tag@meisam对不起,我不太明白。你是说在svg文件中?svg是自动生成的,因此无法真正编辑它。此外,我还试图让您只拥有svg可点击的一小部分,而不是svg标记所在的整个svgon第5行。只需向它添加
id-“someId”
,然后在js中使用它。如果您想在svg的一小部分上添加单击处理程序,请确保您正确地单击了它。此代码应该适用于您尝试执行的操作。您确定HTML页面的目录中有一个名为graph-test.svg的svg吗。我认为您在对象标记中引用它的方式可能有问题。SVG是如何生成的?他发布的代码应该适用于他正在尝试做的事情。我认为这会返回一个错误,因为找不到文件graph-test.svg,或者加载不正确。是文档接口的一种方法。从
.contentDocument
调用它是正确的。您好,您的代码看起来不错,但在加载整个页面时,在文件末尾定义脚本
var node1 = svgObject.getElementById('node1');