搜索 | 用户支持

防范以用户支持为名的诈骗。我们绝对不会要求您拨打电话或发送短信,及提供任何个人信息。请使用“举报滥用”选项报告涉及违规的行为。

详细了解

Firefox 20.0 jquery TypeError: a.style is undefined when loading svg

  • 6 个回答
  • 8 人有此问题
  • 1 次查看
  • 最后回复者为 Ron2013

more options

I work with SVG file. SVG file has xlink-ed jquery. When opening svg file in Firefox 20.0 I get error TypeError: a.style is undefined. If I open svg file in Firefox 19 and older versions, no errors appears.

Any ideas why jqery with svg is not working in FF20.0?

My SVG demo file

"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg xmlns="http://www.w3.org/2000/svg"

   xmlns:xlink="http://www.w3.org/1999/xlink"
    width="467" height="462">
 <rect x="80" y="60" width="250" height="250" rx="20"
     style="fill:#ff0000; stroke:#000000;stroke-width:2px;" />
 <rect x="140" y="120" width="250" height="250" rx="40"
     style="fill:#0000ff; stroke:#000000; stroke-width:2px;
     fill-opacity:0.7;" />
 <script
    xlink:href="http://code.jquery.com/jquery-1.9.1.js"
    id="script10"
    type="text/javascript" />

</svg>

I work with SVG file. SVG file has xlink-ed jquery. When opening svg file in Firefox 20.0 I get error TypeError: a.style is undefined. If I open svg file in Firefox 19 and older versions, no errors appears. Any ideas why jqery with svg is not working in FF20.0? My SVG demo file <?xml version="1.0"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="467" height="462"> <rect x="80" y="60" width="250" height="250" rx="20" style="fill:#ff0000; stroke:#000000;stroke-width:2px;" /> <rect x="140" y="120" width="250" height="250" rx="40" style="fill:#0000ff; stroke:#000000; stroke-width:2px; fill-opacity:0.7;" /> <script xlink:href="http://code.jquery.com/jquery-1.9.1.js" id="script10" type="text/javascript" /> </svg>

被采纳的解决方案

The problem seems to be that jQuery is creating a "div" element, then using div.innerHTML to fill it with children: "link", "table", and "a" tags.

Since this is within an SVG file, "div", "table", and "link" tags don't really exist.

In Firefox 19 (and Chrome 26.0.1410.43 m, and IE 9.0.8112.16421) trying to do div.innerHTML resulted in "undefined" children. In Firefox 20, it's actually making the "link", "table", and "a" children. This fools jQuery into thinking setting innerHTML inside the document.createElement("div") actually worked, until it tries to access "a.style", which is undefined. (The "a" tag has no attributes, not even "a.href".)

I'm not sure if the bug is that setting innerHTML on a javascript-created "div" inside an SVG file doesn't set the elements up the right way, or if it shouldn't be creating these elements in the first place! :s

But I was able to reproduce this behavior in Firefox 20, and in mozilla-central (I checked it out and built Firefox last night), and verified the old functionality in Firefox 19. This certainly seems to be behavior unique to Firefox 20.

定位到答案原位置 👍 3

所有回复 (6)

more options

选择的解决方案

The problem seems to be that jQuery is creating a "div" element, then using div.innerHTML to fill it with children: "link", "table", and "a" tags.

Since this is within an SVG file, "div", "table", and "link" tags don't really exist.

In Firefox 19 (and Chrome 26.0.1410.43 m, and IE 9.0.8112.16421) trying to do div.innerHTML resulted in "undefined" children. In Firefox 20, it's actually making the "link", "table", and "a" children. This fools jQuery into thinking setting innerHTML inside the document.createElement("div") actually worked, until it tries to access "a.style", which is undefined. (The "a" tag has no attributes, not even "a.href".)

I'm not sure if the bug is that setting innerHTML on a javascript-created "div" inside an SVG file doesn't set the elements up the right way, or if it shouldn't be creating these elements in the first place! :s

But I was able to reproduce this behavior in Firefox 20, and in mozilla-central (I checked it out and built Firefox last night), and verified the old functionality in Firefox 19. This certainly seems to be behavior unique to Firefox 20.

more options

As a work-around for your problem (and it may be a pain to download, modify, and host jQuery yourself, but whatever's the issue with Firefox 20 may also take effort to resolve):

In http://code.jquery.com/jquery-1.9.1.js change line 1321:

From: if ( !all || !a || !all.length ) { To: if ( !all || !a || !all.length || !a.style ) {

This should cause the jQuery.support function to return {} (an empty object), as it seems to do on other browsers. In FF19, "!a" evaluates to true. In FF20 "!a" evaluates to false, but a.style is undefined. So checking for !a.style should avoid the error here.

Not sure if other areas of jQuery are affected, or what jQuery even supports when jQuery.support returns emptiness. Hope That Helps; I'm very new to the project.

more options

Thanks for the advice. It works.

more options

Probably worth creating a bugzilla bug (https://bugzilla.mozilla.org/) so we can decide whether the innerHTML change is by design or accidental.

more options

Actually this is a bug in jquery http://bugs.jquery.com/ticket/13754 which has been fixed.

more options

One of the replies posted suggested that this error was caused by a Firefox "add-on." The problem add-on in that case was "Shop-at-Home.Com Toolbar 6.0.6.0. I followed the directions--easy fix--and it solved the problem:

1. Open Firefox in "Safe Mode" and see if you get the same error message (I didn't). 2. Open Firefox in normal mode. 3. Go to "Tools," and click on "Add-Ons." 4. All the add-ons will come up. You can then click on Disable ALL, restart the computer and see if this solves the problem. If it does, you can restore one add-on at a time until you get the error message back and disable or remove that add-on. I took a chance and disabled only the add-on that this particular post recommended (i.e. Shop-at Home) and it worked perfectly so I disabled it and am no longer getting this message. It took all of 1-2 minutes to do.

Hope this helps.

Ron2013