Bug Tracker

Modify

Ticket #5706 (closed bug: duplicate)

Opened 3 years ago

Last modified 15 months ago

.attr() fails with TypeError when used on foreign elements, such as SVG

Reported by: rdworth Owned by:
Priority: high Milestone: 1.5
Component: core Version: 1.4a2
Keywords: attr attribute TypeError foreign svg getAttribute setAttribute Cc:
Blocking: Blocked by:

Description

For foreign elements in an HTML document, the .attr() method fails for getting and setting values, as it attempts to use

//DOM HTML
var value = elem[name];
elem[name] = value;

instead of

//DOM Core
var value = elem.getAttribute(name);
elem.setAttribute(name, value);

A simple test of this, in a browser that supports foreign elements in HTML documents (must implement document.createElementNS):

var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
rect.setAttribute('width', 100);
jQuery(rect).attr('width', 200);

In jQuery 1.4a2, this fails with TypeError: setting a property that has only a getter.

References:

Change History

comment:1 Changed 3 years ago by rdworth

There is a current check in .attr() for isXMLDoc, but we need a fix that works for foreign elements in HTML documents, meaning the fix needed here cannot be based on the type of document the element is from or in, but based on whether the element is from a namespace other than HTML. Patches (including tests):

This fixes .attr() by not using the DOM HTML method of getting and setting attributes if the element is detected to be foreign. In this case, it falls back to DOM Core's .getAttribute() and .setAttribute(). Tests included.

This adds a new function, isForeignElement. This is similar to isXML (isXMLDoc in jQuery), except that it's based on the namespace of the element itself, rather than the type of document it's in/from, or the way it's parsed (text/html vs. application/xhtml+xml). In the case of IE, we'll get nothing from .namespaceURI, but IE doesn't support foreign elements anyway. So in this case we fall back to using isXML. This means the function isn't defined as detecting whether an element is foreign to the document it's in, but whether the element is foreign to the HTML namespace. See tests in above commit.

References:

comment:2 Changed 3 years ago by john

  • Component changed from unfilled to core
  • Milestone changed from 1.4 to 1.5

Richard - We're going to tackle this, and a number of other XML/XHTML/XUL/SVG related issues post-1.4. Thanks for the patch!

comment:3 Changed 3 years ago by rdworth

Moved jQuery patch to a feature branch:  http://github.com/rdworth/jquery/commits/svgfriendly

comment:4 Changed 3 years ago by snover

  • Priority changed from major to high
  • Status changed from new to open
  • Milestone changed from 1.4.4 to 1.5

comment:5 Changed 2 years ago by snover

  • Status changed from open to closed
  • Resolution set to duplicate

comment:6 Changed 2 years ago by snover

Duplicate of #3116.

Please follow the  bug reporting guidlines and use  jsFiddle when providing test cases and demonstrations instead of pasting the code in the ticket.

View

Add a comment

Modify Ticket

Action
as closed
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.