Bug Tracker


Ticket #12523 (closed bug: fixed)

Opened 19 months ago

Last modified 19 months ago

JQuery renders line breaks as text nodes

Reported by: pbcomm Owned by: gibson042
Priority: blocker Milestone: 1.8.2
Component: selector Version: 1.8.1
Keywords: Cc:
Blocking: Blocked by:


Line breaks are rendered as text nodes which also breaks closest selector:

$('<p id="test">test</p>' + "\n" + '<p id="text">text</p>').length === 3 should be 2

$('<p id="test">test</p>' + "\n" + '<p id="text">text</p>').closest('#text') result in: Uncaught TypeError: Object #<Text> has no method 'getAttribute' jquery-1.8.1.js:4206

Change History

comment:1 Changed 19 months ago by dmethvin

  • Owner set to pbcomm
  • Status changed from new to pending

We're not creating those text nodes, the browser that is converting the text to HTML does that. Since we've been passing through text nodes created like that since jQuery 1.0 I don't think we'd want to change it.

$('<p id="test">test</p>' + "\n" + '<p id="text">text</p>').closest('#text')

That doesn't make sense to do, so if it results in an error I am okay with it. Element selection won't return text nodes, only creating HTML from text. If you need to ensure that the top-level result of an HTML conversion only contains element nodes, you can use $(html).filter("*"). That is essentially what I think you're advocating anyway, so you'll only need to pay the performance price when you really need it.  http://jsfiddle.net/dmethvin/VwFUk/

What is the situation where you're encountering this?

comment:2 Changed 19 months ago by anonymous

The closest() selector does work in 1.7.2 and breaks in 1.8.1 because it selects the text node instead of the element with the id of the selection.

comment:3 Changed 19 months ago by dmethvin

What I'm wondering is if there is reasonable code that might do this. That's why I asked about the situation where you're using this. Are you really creating HTML via $() and then using .closest() in your real code?

comment:4 Changed 19 months ago by pbcomm

  • Status changed from pending to new

I am. I'm using jsRender to render the template into a jQuery object and then looking up the closest element to do further modifications before injecting all of it into the dom. jsRender templates come back formatted which creates multiple text nodes in between elements because of line breaks.

comment:5 Changed 19 months ago by dmethvin

  • Owner changed from pbcomm to dmethvin
  • Status changed from new to assigned

I'll take a look. It's strange that nodeType 11 is compared when we wouldn't expect anything but 1.

comment:6 Changed 19 months ago by dmethvin

  • Owner changed from dmethvin to gibson042

comment:7 Changed 19 months ago by gibson042

  • Priority changed from undecided to blocker
  • Component changed from unfiled to selector
  • Milestone changed from None to 1.8.2

comment:9 Changed 19 months ago by Timmy Willison

  • Status changed from assigned to closed
  • Resolution set to fixed

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


Add a comment

Modify Ticket

as closed

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

Note: See TracTickets for help on using tickets.