2009年03月14日
textContentとinnerHTML
Google検索後のページで検索ワードをハイライト表示するGreasemonkeyスクリプトを作ってたときに引っかかったことのメモ。
element - MDN
- innerHTML
- 要素のマークアップと内容を取得・設定します。
- textContent
- 要素とそのすべての子孫要素のテキスト内容を取得・設定します。
HTMLElementから値を取得するときの両者の主な違いは内容にHTMLマークアップを含むかどうかという点ですが、もう一つ、取得内容にエンコードされた特殊文字が含まれる場合も両者に違いがでてきます。ソース上に書かれた「<b>foo</b>」というテキスト(画面上には「<b>foo</b>」と表示される)を取得するとき、innerHTMLはそのまま「<b>foo</b>」が取得されるのに対して、textContentは画面上に表示される「<b>foo</b>」が取得されてきます。なので、textContentで取得した値をinnerHTMLにそのまま設定するとエスケープされていたはずの特殊文字が元に戻ってしまいます。
<p id="input"><b>foo</b></p> <p id="output"></p> <script type="text/javascript"> var input = document.getElementById("input"); var output = document.getElementById("output"); var innerHTML = input.innerHTML; alert(innerHTML); // 「<b>foo</b>」 var textContent = input.textContent; alert(textContent); // 「<b>foo</b>」 output.innerHTML = textContent; // 太字の「foo」が画面に表示される! // ちなみに、テキストノードのnodeValueから取得する場合もtextContentと同じ挙動になります。 var nodeValue = input.firstChild.nodeValue; alert(nodeValue); // 「<b>foo</b>」 </script>
よくありそうな例としては、「画面のテキストの一部をtextContentやテキストノードのnodeValueから取得して、その内部や前後にタグを文字列で書き込んだあとに最後にinnerHTMLに渡してElementに変換する」という処理をすることがあります。このときに取得するテキストにエンコードされた「<」や「>」が含まれていた場合は、取得時に「<」や「>」に戻ってしまっているので再度エンコードし直してやる必要があります。これを忘れると場合によってはXSS脆弱性にもなりかねないので注意!
トラックバック - http://d.hatena.ne.jp/inamenai/20090314/p1
リンク元
- 244 http://www.google.co.jp/url?sa=t&rct=j&q=textcontent&source=web&cd=1&ved=0CCIQFjAA&url=http://d.hatena.ne.jp/inamenai/20090314/p1&ei=S1CETpiNNOv4mAWTyLgi&usg=AFQjCNENKr2X5k43soQgMN1w7o8SdDnFfg
- 221 http://www.google.co.jp/search?q=textContent&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a
- 109 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CC0QFjAA&url=http://d.hatena.ne.jp/inamenai/20090314/p1&ei=NnUqT-edDqWkmQWUidXmDw&usg=AFQjCNENKr2X5k43soQgMN1w7o8SdDnFfg&sig2=ttHP6AZ9mtWOn0rRRbgibA
- 93 http://www.google.co.jp/url?sa=t&rct=j&q=javascript textcontent&source=web&cd=1&ved=0CB4QFjAA&url=http://d.hatena.ne.jp/inamenai/20090314/p1&ei=hoOfTpzOFM_QrQf_0oyHAw&usg=AFQjCNENKr2X5k43soQgMN1w7o8SdDnFfg
- 75 http://www.google.co.jp/search?q=javascript+textcontent&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja-JP:unofficial&client=firefox-a
- 70 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&hs=DuP&q=textcontent+ie+nodevalue&btnG=検索&lr=lang_ja
- 69 http://www.google.co.jp/search?sourceid=chrome&ie=UTF-8&q=textContent
- 57 http://www.google.co.jp/search?q=innerHTML&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a
- 49 http://www.google.co.jp/search?q=textContent&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a
- 40 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4GGIH_jaJP282JP282&q=textContent
