Skip to content

Instantly share code, notes, and snippets.

@wlt
Last active December 16, 2015 05:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wlt/5385224 to your computer and use it in GitHub Desktop.
Save wlt/5385224 to your computer and use it in GitHub Desktop.
メソッドutil.xmlToDomForTemplateが常に、2n+1番目のノードのみを返す問題の修正
# HG changeset patch
# User wlt_lain <wltlain@gmail.com>
# Date 1366000762 25200
# Node ID b39b4cdbf57003cfb730f1722ebe9e18f7d33375
# Parent cc470b88dfb692ca10dcb33fe3c4c7d3978dc2db
fix: util.xmlToDomForTemplate
diff -r cc470b88dfb6 -r b39b4cdbf570 common/content/util.js
--- a/common/content/util.js Sat Apr 13 19:34:16 2013 +0900
+++ b/common/content/util.js Sun Apr 14 21:39:22 2013 -0700
@@ -786,8 +786,8 @@
var range = doc.createRange();
var fragment = range.createContextualFragment(
xml`<div xmlns:ns=${NS} xmlns:xul=${XUL} xmlns=${XHTML}>${node}</div>`.toString());
- for (let node of fragment.firstChild.childNodes)
- dom.appendChild(node);
+ while (fragment.firstChild.childNodes.length > 0)
+ dom.appendChild(fragment.firstChild.firstChild)
range.detach();
@wlt
Copy link
Author

wlt commented Apr 15, 2013

[問題について]
第1引数がXMLListのように
util.xmlToDomForTemplate(xml<p>A</p><p>B</p>, document)
な時に発生する問題です。
この場合は<p>A</p>のノードだけが返って来ます。
本来、期待される戻り値は<p>A</p><p>B</p>を内包したDocumentFragmentだと思われます。
(このメソッドのjavadocには@returns {Node|DocumentFragment}とあります。)

@wlt
Copy link
Author

wlt commented Apr 15, 2013

原因は @teramako さんによると
「appendChildで追加される要素が元親からリムーブされるんです。あとはiteratorの実装依存ですけどFirefoxはindex値で回しているっぽい感じでした。リムーブされてshiftしているのにindex++でアクセスするのでひとつ飛ばしになります」

https://twitter.com/teramako/status/323641070653145088

@teramako
Copy link

var fragment = document.createDocumentFragment()
for (var i = 0; i < 10; ++i){
  var elm = document.createElement("b");
  elm.textContent = i;
  fragment.appendChild(elm);
}
for (var node of fragment.childNodes){
  document.body.appendChild(node);
}

というコードを書いてみると 02468 という結果になり、分かりやすいと思います。

@wlt
Copy link
Author

wlt commented Apr 15, 2013

これは分かりやすい!ありがとうございます。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment