- ベストアンサー
Ajax(XMLHttpRequest)で取得したHTMLをDOMにし
- Ajax(XMLHttpRequest)を使用してHTMLを取得し、DOMとして利用する方法について調査しました。XMLHttpRequestのoverrideMimeType()メソッドを使用すれば、responseXMLでエラーにならないことがわかりました。現在は一時的なdiv要素を作成し、responseTextを書き込んでからdocumentから操作していますが、非同期にする方法はないか検討中です。
- Ajax(XMLHttpRequest)を使用してHTMLを取得し、DOMとして利用する方法について調査しました。具体的には、responseTextを処理する際に一時的なdiv要素を作成し、それにHTMLを書き込んでからdocumentから操作しています。しかし、非同期にする方法やより効率的な方法についても検討しています。
- Firefox 3.xとgreasemonkeyで動作するJavascriptを使用して、Ajax(XMLHttpRequest)で取得したHTMLをDOMとして利用したいと考えています。現在はresponseTextを一時的なdiv要素に書き込んでからdocumentから操作していますが、非同期にする方法や他の方法があるか調査しています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#1の補足より。 > 今回質問したのは調べている時に、FirefoxはXMLにパースしていると記述があったので、 MDCの解説を読みましたが、私は別の解釈をしました。 ----- overrideMimeType() このメソッドを使うことでドキュメントを強制的に特定のコンテンツタイプとして扱うことができます。サーバは XML を送信してくるものの正しい Content-Type ヘッダを送信してこないが responseXML を使いたいという場合に有用です。 https://developer.mozilla.org/ja/XMLHttpRequest ----- サーバが正しいXMLで応答していることが前提なので、HTMLが返ってきたらXMLとしてパース出来ないのではないでしょうか? > なにか良い方法はないでしょうか? とりあえず、非同期通信を活用しているAutopagerizeのコードを読んでみると参考になると思います。 http://userscripts.org/scripts/review/8551 ざっと読んだところでは、new DOMParser().parseFromString(str, 'application/xhtml+xml') か document.implementation.createHTMLDocument で新しいdocumentを生成していますね。 以下、簡略化したコードです。未検証。(全角空白は半角空白に置換してください) -------------- var doc; try { doc = new DOMParser().parseFromString(res.responseText, 'application/xhtml+xml'); } catch (e) { doc = document.implementation.createHTMLDocument ? document.implementation.createHTMLDocument('apfc') : document.implementation.createDocument(null, 'html', null); // 以下略 } -------------- DOMParser - MDC https://developer.mozilla.org/ja/DOMParser 3 Semantics, structure, and APIs of HTML documents ? HTML 5 http://www.w3.org/TR/html5/dom.html#dom-domhtmlimplementation-createhtmldocument ついでに、xAutopagerize.js のソースも見てみましたが、こちらは document.implementation.createHTMLDocument だけで DOMParser の文字列はHITしませんでした。(クロスブラウザのためかもしれません) http://d.hatena.ne.jp/os0x/20080327/1206613170
その他の回答 (1)
- SAYKA
- ベストアンサー率34% (944/2776)
responseTextをinnerHTMLでelementに放り込んじゃだめなの? 非同期にしずらいっていうけど 結局responseTextが得られないと動かせないわけだし。。。
お礼
確かに普通はそれしか方法が無いと思っています。 非同期の件は、idが一意になるように付けることで対処しました。 今回質問したのは調べている時に、FirefoxはXMLにパースしていると記述があったので、 そのパースされたデータを何で取得出来ないのか判らないので、何か方法が無いかお聞きしました。
お礼
期待通り動きました。 簡略化されたコードだけでも、XMLDocumentには変換されてました。 なぜかevaluateで正しく取得出来ないため(第二引数をXMLDocumentにしても)、Autopagerizeのコードを参考に createHTMLDocumentByString/strip_html_tag/createDocumentFragmentByStringの 3つのメソッドをとりあえず実装してみた所、新しいHTMLDocumentになり無事期待通りの動きが実現できました。 AutopagerizeはGPLとのことですし、greasemonkeyのコードですので元からコード配布ですので、 このまま行きたいと思います。 ありがとうございました。