Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.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 如何调用<;的onerror()回调;对象>;仅Chome中的SVG标记_Javascript_Jquery_Html_Svg_Callback - Fatal编程技术网

Javascript 如何调用<;的onerror()回调;对象>;仅Chome中的SVG标记

Javascript 如何调用<;的onerror()回调;对象>;仅Chome中的SVG标记,javascript,jquery,html,svg,callback,Javascript,Jquery,Html,Svg,Callback,在chrome和Firefox中,以下问题不起作用。它在IE中工作 我有一个使用JS动态创建的元素对象: svg = document.createElement("object"); svg.setAttribute("type","image/svg+xml"); svg.setAttribute("data",url); mycanvas.appendChild(svg); 当我加载一个实际存在的文件时,这成功地创建了一个包含svg的对象元素: 但当文件不存在时,我会

在chrome和Firefox中,以下问题不起作用。它在IE中工作

我有一个使用JS动态创建的元素对象:

svg = document.createElement("object");
    svg.setAttribute("type","image/svg+xml");
    svg.setAttribute("data",url);

mycanvas.appendChild(svg);
当我加载一个实际存在的文件时,这成功地创建了一个包含svg的对象元素:

但当文件不存在时,我会得到:

在这种情况下,我想调用我创建的onerror()回调

目前看来:

    svg.onerror = function() {
            alert("not found");
    };
但是这个onerror()没有被调用,因为它查找svg,svg是不管svg如何创建的对象标记(上图2)

如何检查图像是否为空或不存在(上图2),然后调用onerror

我相信我需要这样做:

var callback = document.getElementsByTagName("object")[0].contentDocument;
callback.onerror = function() {
    alert("not found");
};
上述方法失败了,但这只是我的一次快速尝试

有什么想法吗?
提前感谢。

我使用了这个帮助函数,它使我们能够检测404错误(错误的svg url):

看看演示:它将Chrome徽标加载为SVG,并将其绘制在第一个画布上,相同的代码带有错误的url,警告“error2”

//首先是一对助手函数
函数$(id){
return!id | | id.nodeType==1?id:document.getElementById(id);
}
函数isType(o,t){return(typeof o).indexOf(t.charAt(0).toLowerCase())==0;}
//这是肉和土豆
函数映像(src,cfg){var img,prop,target;
cfg=cfg | |(isType(src,'o')?src:{});
img=$(src);
如果(img){
src=cfg.src | | img.src;
}否则{
img=document.createElement('img');
src=src | | cfg.src;
}
如果(!src){
返回null;
}
prop=isType(如自然宽度,'u')?'width':'naturalWidth';
img.alt=cfg.alt | | img.alt;
//添加图像并在需要时插入(必须在DOM上才能加载或
//从缓存中提取)
img.src=src;
target=$(cfg.target);
如果(目标){
target.insertBefore(img,$(cfg.insertBefore)| | null);
}
//装载的?
如果(图像完成){
if(img[prop]){
if(isType(cfg.success,'f')){
cfg.success.call(img);
}
}否则{
if(isType(cfg.failure,'f')){
故障呼叫(img);
}
}
}否则{
if(isType(cfg.success,'f')){
img.onload=cfg.success;
}
if(isType(cfg.failure,'f')){
img.onerror=cfg.failure;
}
}
返回img;
}
//下面是它的使用方法:
url=”https://images3.wikia.nocookie.net/__cb20120330024139/logopedia/images/d/d7/Google_Chrome_logo_2011.svg";
//第一个显示图像的:
var mycanvas=document.getElementById(“c”);
var ctx=mycanvas.getContext('2d');
var img=图像(url{
成功:函数(){ctx.drawImage(img,0,0);},
失败:函数(){alert(“error1”);}
});
//第二个有404错误:
var mycanvas2=document.getElementById(“d”);
var ctx2=mycanvas2.getContext('2d');
var img2=图像(“http://example.com/a.svg", {
成功:函数(imga){ctx2.drawImage(img2,0,0);},
失败:函数(){alert(“error2”);}
});
canvas{border:1px solid#f00}
c:

d:
Hi Gavriel,我现在尝试了这个方法。但由于某些原因,它从未进入OneError(),它总是尝试加载图像,当无法加载图像时,我会在控制台中获得404,但没有警报。它跳过onerror()并转到svg.setAttribute(“数据”,url);只有在chrome和firefox中它才不起作用。它在IEso中工作,我在追加时不能使用它?因为它在IE中工作,但在chrome和firefox中不工作。这不是我的意思。我在a)使用img而不是object,b)使用ctx.drawImage而不是canvas.appendChild中更改了您的代码,因此在我的代码中您不会追加。视觉上,无论效果如何,你都会在画布上看到图像。测试我的代码,看看它是否适合您的需要。我只在Chrome上测试了我的代码,但我看不出它在其他浏览器中不起作用的原因。不幸的是,我必须使用一个类型为image/svg+xml的svg对象。我不能使用图像。我可以用图像来做,效果很好。但是谢谢:)