Mozilla Firefox不会在addEventListener中加载SVG对象('load'

时间:2015-09-14 18:19:24

标签: javascript jquery html svg jquery-svg

我不知道为什么,但它适用于Chrome和Safari,而不适用于Mozilla。 我有加载svg文件的object html标记。文件包含.s0个类。我想在你点击那个课时处理事件。

谁知道出了什么问题? sry,当我尝试在那里粘贴代码时,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 个答案:

答案 0 :(得分:8)

主要是你需要决定是否使用jquery,不要将jquery-code与原生的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

答案 1 :(得分:0)

最好使用<svg>代码,而不是<object>。无论如何,Firefox与<embed>的效果更好。如果你可以将svg代码放在标签内,一切正常。

您可以尝试<embed>代码:

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ëlJS对你来说是一个很好的图书馆。它允许使用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代码。

通过所有建议,您可以以简单的方式实现加载内容。

祝你好运。

答案 2 :(得分:0)

我通过使用:

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

适用于Chrome,Firefox和IE9 +。