Mozilla Firefox在addEventListener('load')中无法加载SVG对象

11

我不知道为什么,但在Chrome和Safari上可以运行,在Mozilla上却不行。 我有一个加载svg文件的object html标签。 文件包含.s0类。 我想在单击该类时处理事件。

谁知道出了什么问题?抱歉,当我尝试将代码粘贴到jsfiddle中时,它不显示object

<object data="jo.svg" type="image/svg+xml" id="obj"></object>

代码

$(function() {
    var a = document.getElementById('obj');
        a.addEventListener("load", function() {

            // !!!
            console.log('this line is not reachable in Mozilla or reached before svg loaded');

            var svgDoc = a.contentDocument;
            var els = svgDoc.querySelectorAll(".s0");
            for (var i = 0, length = els.length; i < length; i++) {
                els[i].addEventListener("click", function() {
                    alert('clicked');
                }, false);
            }
        });
});
3个回答

10

首先您需要决定是否使用jQuery,并且不要将jQuery代码与本地JavaScript代码混合使用。

JavaScript版本:

<!doctype html>
<html lang="en-US">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<object data="http://gbip.ru/poselki/genplan/5/full/gp.svg" type="image/svg+xml" id="obj"></object>
<script type="text/javascript">
    window.addEventListener('DOMContentLoaded', function() {
        var obj = document.getElementById('obj');
        obj.addEventListener('load', function(){
            console.log('loaded');
        });
    });
</script>
</body>
</html>

jQuery版本

<!doctype html>
<html lang="en-US">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<object data="http://gbip.ru/poselki/genplan/5/full/gp.svg" type="image/svg+xml" id="obj"></object>
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
<script type="text/javascript">
    $(document).ready(function(){
        var $obj = $('#obj');
        $obj.on('load', function () {
            console.log('loaded');
        })
    });
</script>
</body>
</html>

Ubuntu 14.04.3 LTS,Firefox 40.0.3


谢谢你的回答。我发现一个奇怪的事情:如果你把jquery版本从v2.1.4改为v1,那么你的代码是否还能工作?例如:<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>。我不知道为什么,但是在v1上它并不能工作。 - sirjay
确认在旧版本中不起作用(不知道为什么),但您可以使用本地事件:$obj.get(0).onload = function () { console.log('OK'); }; - cetver

3

我用以下方式解决了这个问题:

$('#svg').load('"image/svg+xml"', function () {
    alert('svg loaded');
});

它可以在Chrome、Firefox和IE9+上运行。

0
最好使用``标签,而不是``。Firefox与``标记配合得更好。如果您可以将SVG代码放入``标记内,所有内容都能正常工作。
您可以尝试使用``标签:

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/embed

我建议你使用<svg>标签,因为你可以通过CSS和Javascript轻松地控制其中的所有元素:

https://developer.mozilla.org/en-US/docs/SVG_In_HTML_Introduction

也许,Raphaël JS 是一个适合您的好库。它允许使用JavaScript控制所有SVG元素,并完成许多任务而不会增加复杂性:

http://raphaeljs.com/

如果您能使用 Modernizr.js 库,它可以帮助您检测浏览器是否支持。

 if (!Modernizr.svg) {
    $(".logo img").attr("src", "images/logo.png");
 }

要包含modernizr:https://modernizr.com/

您可以阅读这篇有趣而完整的文章,了解如何在所有变体中使用SVG:

https://css-tricks.com/using-svg/

然而,你应该按照@cetver在他的回答中建议的方式去做,不要混合使用jQuery和本地js代码。

通过所有的建议,你可以简单地实现内容的加载。

祝你好运。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接