Skip to main content

Bug Tracker

Side navigation

#14309 closed bug (notabug)

Opened August 27, 2013 10:37AM UTC

Closed August 27, 2013 01:15PM UTC

chrome 29 slows jquery extension

Reported by: ouiliam <lhahne@gmail.com> Owned by:
Priority: undecided Milestone: None
Component: unfiled Version: 1.10.2
Keywords: Cc:
Blocked by: Blocking:
Description

https://chrome.google.com/webstore/detail/cantonese-romanizer/ippbggfdamglbjjhahfjljnolkigphdl

this extension was instant in chrome version 28, but now takes forever in version 29

i tried using jquery 1.10.2 and 2.0.3 without success

any ideas?

main script below:

Get all the text nodes in the document, and replace any Chinese characters found with Jyutping.

$(getTextNodesIn(document)).each(function(index, el) {

var $el, text, chars, i, len, c, jyutping, frag, match, phonetic, tone;

$el = $(el), text = $el.text(), chars = [], frag = document.createDocumentFragment();

Walk through the text in this node one character at a time.

for (i = 0, len = text.length; i < len; i++) {

c = text[i], jyutping = _charmap[c];

// If the char was in our map (i.e. it's a Chinese char), replace it with Jyutping.

if (jyutping) {

if (chars.length) {

frag.appendChild(document.createTextNode(chars.join('')));

chars = [];

}

match = jyutping.match(/^(\\w+)(\\d)$/);

if (match && match.length == 3) {

phonetic = document.createTextNode(match[1]);

tone = document.createElement('sup');

tone.appendChild(document.createTextNode(match[2]));

frag.appendChild(phonetic);

frag.appendChild(tone);

}

else

chars.push(jyutping);

}

else

chars.push(c);

}

Add any remaining chars to the document fragment.

if (chars.length)

frag.appendChild(document.createTextNode(chars.join('')));

Replace the text node with the fragment we've assembled.

$el.replaceWith(frag);

});

Selects all decendent text nodes of an element.

http://stackoverflow.com/questions/298750/how-do-i-select-text-nodes-with-jquery

function getTextNodesIn(node, includeWhitespaceNodes) {

var textNodes = [], whitespace = /^\\s*$/;

function getTextNodes(node) {

if (node.nodeType == 3) {

if (includeWhitespaceNodes || !whitespace.test(node.nodeValue)) {

textNodes.push(node);

}

} else {

for (var i = 0, len = node.childNodes.length; i < len; ++i) {

getTextNodes(node.childNodes[i]);

}

}

}

getTextNodes(node);

return textNodes;

}

Attachments (0)
Change History (2)

Changed August 27, 2013 01:09PM UTC by ajpiano comment:1

#14308 is a duplicate of this ticket.

Changed August 27, 2013 01:15PM UTC by ajpiano comment:2

resolution: → notabug
status: newclosed

Thanks for taking the time to report a ticket, The jQuery Core bug tracker is only for reporting and identifying bugs directly in jQuery core, not in Chrome or any other web browser, nor is it a general programming support forum. It sounds like this should be taken up either with the extension's developers or the Chrome team.

Worth noting, however, is that a documentFragment is not a valid input to replaceWith or any other jQuery method.