gpt4 book ai didi

javascript - 从 Javascript 访问 SVG 对象时收到 Uncaught SecurityError

转载 作者:太空狗 更新时间:2023-10-29 15:11:17 25 4
gpt4 key购买 nike

今天我花了一些时间尝试使用 D3(和 jQuery)操作 SVG。 我的目标 是能够通过 JavaScript 访问/修改本地 SVG。如果它是为 D3 量身定制的,那将是加分项。

似乎适用于其他人的解决方案不适用于我,它具有以下 JavaScript:

window.onload=function() {
// Get the Object by ID
var a = document.getElementById("svgObject");
// Get the SVG document inside the Object tag
var svgDoc = a.contentDocument;
// Get one of the SVG items by ID;
var svgItem = svgDoc.getElementById("svgItem");
// Set the colour to something else
svgItem.setAttribute("fill", "lime");
};

使用这个 HTML 对象

<object id="svgObject" data="img/svgfile.svg" type="image/svg+xml" height="50" width="50"></object>

和单独的 SVG 文件

<svg height="40px" width="40px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 800">
<rect id="svgItem" width="800" height="800" fill="red"></rect>
<circle cx="400" cy="400" r="400" fill="blue"></circle>
</svg>

全部找到 here .它是 this example 中代码的简化版本.我的 JavaScript 代码如下所示,直接来 self 的编辑器:

window.onload = function() {
var checkObject = document.getElementById("checkers");
var checkDoc = checkObject.contentDocument;

var cheese = checkDoc.getElementById('layer1');
console.log(cheese);
};

万一它改变了什么,我的脚本加载在 HTML 正文的底部。下面是我唯一的 HTML 元素。

<object data="check.svg" type="image/svg+xml" width="100" id="checkers"></object>

和我的 SVG 文件(只是一个灰色勾选,请随意使用)。

<svg id="svg2" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<g id="layer1" transform="translate(0,-952.36217)">
<path id="rawCheck" fill="#dbdbdb" d="m18.75,1004.5,21.607,21.607,40.893-40.893-7.8571-7.8572-33.036,33.036-13.75-14.107z" stroke-opacity="0"/>
</g>
</svg>

我的问题是在 checkObject 上调用 .contentDocument应该只是调用 .contentDocument object 元素,但我弄得一团糟:

Uncaught SecurityError: Failed to read the 'contentDocument' property from 'HTMLObjectElement': Blocked a frame with origin "null" from accessing a frame with origin "null". Protocols, domains, and ports must match.

除了它都是愤怒的红色。这让我感到困惑,因为据我所知,我的代码非常接近工作示例的副本,但我在这里。

我也试过在this question 中看到的d3.xml()的回答并收到以下错误

XMLHttpRequest cannot load file:///home/user/Documents/examples/d3/check.svg. Cross origin requests are only supported for HTTP.

还有

Uncaught NetworkError: Failed to execute 'send' on 'XMLHttpRequest': Failed to load 'file:///home/user/Documents/examples/d3/check.svg'

如果您想查看有关我的 d3.xml() 尝试的更多详细信息,我很乐意更新这个问题,我只是认为已经有很多代码块了。

最佳答案

在 Chrome 中,当通过文件系统(即 URL 具有 file:// 协议(protocol))打开页面时,无法通过 JavaScript 访问外部 SVG 的内容。

要解决这个问题,您可以通过本地服务器打开它。或者,您可以 disable the Same-Origin Policy web security feature使用 --disable-web-security 命令行参数进行测试。 Firefox 也没有这个限制,所以也有这个选项。

关于javascript - 从 Javascript 访问 SVG 对象时收到 Uncaught SecurityError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24644657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com