【问题标题】:Mozilla Firefox doesn't load SVG objects in addEventListener('load'Mozilla Firefox 不会在 addEventListener('load'
【发布时间】:2015-12-10 20:13:35
【问题描述】:

我不知道为什么,但它适用于 Chrome 和 Safari,而不是 Mozilla。 我有 object 加载 svg 文件的 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);
            }
        });
});

【问题讨论】:

    标签: javascript jquery html svg jquery-svg


    【解决方案1】:

    我解决了这个问题:

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

    它适用于 Chrome、Firefox 和 IE9+。

    【讨论】:

      【解决方案2】:

      最好使用&lt;svg&gt; 标签,而不是&lt;object&gt;。无论如何,Firefox 与&lt;embed&gt; 一起工作得更好。如果您可以将 svg 代码放在标签内,一切正常。

      你可以试试&lt;embed&gt;标签:

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

      我推荐你使用&lt;svg&gt;标签,因为你可以用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 代码。

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

      祝你好运。

      【讨论】:

        【解决方案3】:

        主要你需要决定是否使用 jquery,并且不要将 jquery-code 与本机 javascript-code 混合。

        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

        【讨论】:

        • 感谢您的回答。我发现了奇怪的事情:如果您将 v2.1.4 更改为 v1,您的 jquery 版本中的代码是否有效?例如:&lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"&gt;&lt;/script&gt;。我不知道为什么,但是对于 v1 它不起作用。
        • 确认在旧版本中不起作用(不知道为什么),但您可以使用原生事件:$obj.get(0).onload = function () { console.log('OK'); };
        猜你喜欢
        • 2012-01-02
        • 1970-01-01
        • 1970-01-01
        • 2020-06-06
        • 2016-01-05
        • 1970-01-01
        • 2011-08-08
        • 2016-08-09
        • 1970-01-01
        相关资源
        最近更新 更多