IE7 + Turnabout で AutoPagerize を動かす試み

観測気球

収集物の記録書庫 a data archive of collection -- collectible toys

[要旨] IE7 + Turnabout で、AutoPagerize を動かそうと、あれこれしてみています。まだまだこれからなんだけど、とりあえず、今までやったことを「作業メモ」として、残しておきます。
[キーワード] JavaScript,IE7,Firefox,DOM

« Turnabout に関するメモ | トップページ | IE7 + Turnabout で AutoPagerize を動かす試み(つづき) »

2008.03.27

IE7 + Turnabout で AutoPagerize を動かす試み

とりあえず、autopagerize (8551.user.js) はそのままでは動かない(Javascript のエラーが出る)ことはわかった。どこをどういじればいいかは、これから調べてみる

Turnabout に関するメモ

IE7 + Turnabout でいろいろやってみようとしている件のつづき。当面の目標というか、最低限、AutoPagerize は動かしたいと思ってます。

以下、2008年3月25日、26日にやった作業の記録。あとで読み返しても意味不明かもしれないけど、いちおう残しとく。

作業開始

とりあえず、8551.user.js から、(IE にとっては)余分な , を削除し、必要な ; を追加したら、エラーは出なくなったんだけど、まったく機能していません。どこまで動いてて、どこでおかしくなっているのかを追いかける。

結局、document.evaluate が未定義なことが判明。Turnabout が XPath サポート済みというのはうそだったみたいです ><

GM 互換機能は window.external.なんとか を用意することで実現していることはわかりました(私が WebBrowser コントロールでやろうとしているのと同じやり方ですね)。

XPath サポートは、とりあえず、amachang のを使えば、何とかなるのかなぁ? XPath 以外にも何か足りないものがありそう。Firefox 互換ライブラリは window.addEventListener を追加するだけの手抜きだし。少なくとも DOM 関係の差異を吸収するための諸々は別途用意する必要がありそう。

via はらへた - Autopagerize を IE7 + Turnabout で動かす件

とりあえず、window 以外にも addEventListener を追加しておかないと。

XPath

amachang の XPath 導入 (mozcompat.lib.js の中につっこんだ) で document.evaluate の件は解決。

forEach

でもまだ動かない。原因は forEach が使えないから。IE でも forEach を使えるようにするの、誰か作ってないかなぁ?

via はらへた - IE7 + Turnabout で AutoPagerize (つづき)

forEach は ECMA-262 標準に対する JavaScript 拡張なので、ECMA-262 標準の他の実装では存在しない場合があります。次のコードをスクリプトの先頭に挿入すると、forEach がネイティブでサポートされていない ECMA-262 実装でも forEach を使用できるようになります。これは Firefox および SpiderMonkey で使われているアルゴリズムとまったく同じものです。

Core JavaScript 1.5 Reference:Global Objects:Array:forEach - MDC

上記 Webページのコードをそのまま流用。mozcompat.lib.js の中につっこんでおく。

via はらへた

document.implementation.createDocument()

次は、function createHTMLDocumentByString(str) の

var htmlDoc  = document.implementation.createDocument(null, ‘html’, null);

で、「そんなの実装されてないよ」エラー。document.implementation が使えないみたいですね。

まだまだ先は長そう。

via はらへた - IE7 + Turnabout で AutoPagerize (さらにつづき)

本来はMSIE/Mozilla いずれでも document.implementation.createDocument が使えるようにすれば良いのですが、 イベント定義の時と同様の方法は使えないため、ここでは、次善策として、 document.Implementation.createDocument() メソッドが使えるようにしたいと思います。

DOM Level 2/3 標準技術をMSIEで使う(XML読み込みとXPath) @ ぽかぽかWeb研究室

上記、「DOM Level 2/3 標準技術をMSIEで使う(XML読み込みとXPath) @ ぽかぽかWeb研究室」の「実際の記述」で示されているコードは一箇所開き括弧 “(” が抜けているので注意 (そのままではエラーになる)

via はらへた

具体的には

 // DOM3 XPath の evaluate()メソッドの定義
 this.evaluate=function(reg,ob,n1,n2,n3) {
  if document.all &&  document.attachEvent) { // MSIE 用

 // DOM3 XPath の evaluate()メソッドの定義
 this.evaluate=function(reg,ob,n1,n2,n3) {
  if (document.all &&  document.attachEvent) { // MSIE 用

に直せば OK

DOM 2 Range

そして今度は、 function createDocumentFragmentByString(str) の

var range = document.createRange();

でエラー。

そういえば、IE と Firefox の range は全然別物なのでした。

via はらへた - そして次は

DOM 2 Range (IE 7 は非対応) および Mozilla 独自拡張の createContextualFragment メソッド (SafariおよびOpera 9以降でも対応) を使っているのに、なぜ IE でも動くのかと思ったら、2445 行目以降で要素オブジェクトが outerHTML プロパティを持つ場合 (IE、Opera、Safari が該当) はメソッドの内容を書き換えていた。

Kanasan.JS CodeReading #3: Days on the Moon

via はらへた

「prototype.js のソースが何かのヒントになるかもなぁ」と、ほのかに期待。あとでソースを読んでみる。

ちなみに、IE8 では DOM 2 Range に対応するようですね。

toSource

createRange() はいったん後回しにして次。次に引っ掛かっているところは toSource() なんだけど、ググったら、あっさりそのものずばりがヒット。ダンコーガイだった!!

ってなことで、.toSource() は 「404 Blog Not Found:javascript - Object.toSource() for non-FireFox!」で解決(と言っていいのかどうか、微妙なんだけど、その辺はあとまわしでもいいや。とりあえず、これで先に進める)。

参考までに「AutoPagerize for IE7Pro - alpha version - くええ。おるぐ」 ではどうしているかを見てみると、上記 toSource() の代わりに「404 Blog Not Found:javascript - uneval() for the rest of us!」の uneval() を使ってますね。こっちの方がいいのかなぁ?

getComputedStyle

先に進む。今度は、document.defaultView が IE では未定義、というところで引っ掛かってる。

via はらへた - まだまだ続く

document.defaultView というか、document.defaultView.getComputedStyle を何とかしないと先に進めない。

IE では
そもそも getComputedStyle という関数自体が存在しない
その代わり、 IE ではすべての HTMLElement が currentStyle というプロパティを持っていて、これが getComputedStyle で取得できるオブジェクトとほぼ同じ役割をする。

getComputedStyle について調べてたら深みにハマったのでメモ - IT戦記

via はらへた

c_style.getPropertyValue()

今度は c_style.getPropertyValue() で引っ掛かった。 とりあえず、エラーが出ながらも、ある程度は動き始めてるっぽい。

IE7 で動き始めた AutoPagerize
IE7 で動き始めた AutoPagerize

ブラウザの右上じゃなくて、左下に出ちゃうのが変だけど。 あと、toSource という文字列が表示されてしまう原因が不明。

via はらへた

(つづく)

投稿者: tsupo 2008.03.27 午前 03:43 | 固定リンク | このエントリーをはてなブックマークに追加 | このエントリを del.icio.us に登録 このエントリの del.icio.us での登録状況 | このエントリを Buzzurl に追加このエントリの Buzzurl での登録状況 | このエントリをlivedoorクリップに登録 このエントリのlivedoorクリップでの登録状況 このエントリをlivedoorクリップに登録している人の数 | 酢鶏巡回中

楽天市場


プログラミング」カテゴリ内の最近の記事

品揃え豊富で安い!NTT-X Store


アマゾンわくわく探検隊

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/6737/40648650

この記事へのトラックバック一覧です: IE7 + Turnabout で AutoPagerize を動かす試み:

コメント


私も似たようなことをやっているので、気付いた点など。

document.implementation.createDocument()
の代替としては、"Microsoft.XMLDOM"よりも"htmlfile"を使う方がよいかと。
XML Documentとして作ってしまうと、文法を厳密に問われるため、通常の(X)HTMLをXHRで取得したresponseTextをそのまま突っ込んだ場合、解釈に失敗するケースが多いです。

createHTMLDocumentByString()は、結局、
function createHTMLDocumentByString(str) {
var htmlDoc = new ActiveXObject('htmlfile');
htmlDoc.designMode = 'on'; // これがないとセキュリティ警告が出ることがある
htmlDoc.open('text/html');
htmlDoc.write(str);
htmlDoc.close();
return htmlDoc;
}
のように置換してしまうのが一番てっとり早いです。
これで返した htmlDoc には、そのまま(JavaScript XPathの) document.evaluate()も適用できますし、createDocumentFragmentByString()を呼ぶ必要もなくなるので、document.createRange()とそれに付随するメソッドも使わなくて済みます。
#といっても、AutoPagerizeの方をいじることになるため、主旨からは外れてしまうかも知れませんが。

投稿者: 風柳 (2008.03.27 午前 07:28)


使っていただきありがとうございます!

投稿者: amachang (2008.03.27 午後 07:43)


toSource()が出るのは、ステータス(okとかterminatedとか)を定義しているオブジェクトをfor inでまわしてステータス一覧を作っているからです。Object#toSourceを追加した結果for inでtoSource()が出てくるせいなのでtoSourceだけifで外すしかなさそう。

投稿者: ku (2008.03.27 午後 07:46)


すみません。

> 「ちなみに、IE8 では DOM 2 Range に対応する」

これって本当ですか??
今のところそういう情報は確認できていないのですが。。。><

ちなみに、 IE8 Beta 1 では DOM 2 Range は動いていません><

投稿者: amachang (2008.03.27 午後 07:48)


みなさん、コメントありがとうございます。

(1) createHTMLDocumentByString() の件
・Microsoft.XMLDOM を使う版 (via ぽかぽかWeb研究室)
・いったん removeChild してから addChild し直す版 (via IE7pro 版 AutoPagerize)
・風柳さんの案
の3つを試してみているところです。

(2) toSource() の件
kuさん、そういうことですか。とりあえず、いまは toSource() の代わりに uneval() を使うやり方で逃げてます。あとでtoSource() に戻すかもしれません。

(3) DOM 2 Range の件
これは IE8 が Acid2 完全合格を目指すと IEBlog の人が言っていることから、そう判断しました。Acid2 に合格するには、DOM 2 Range をサポートする必要があるはずです。

…… と思ってたんですが、いま調べ直したら、DOM 2 Range は Acid3 ですね。IE8 が Acid3 合格を目指しているのかどうか、ですね。期待しない方がいいのかもしれません ><

投稿者: tsupo (2008.03.27 午後 09:06)


実は、僕もいろいろと DOM 2 Range のブラウザ間相互利用を考えていまして、
もし、いい方法を発見したら教えて欲しいです><

僕もその辺の情報があったら共有します!

投稿者: amachang (2008.03.27 午後 09:31)


(1) createHTMLDocumentByString() の件

あ、そうそう文字化けのことを忘れていました。
UTF-8以外のページだと文字化けしちゃいます(たぶん、3案とも)。

なので、当方の前の版では、document.charsetがUTF-8以外の場合、XHRの代わりにiframeを使用していました。
http://furyu.tea-nifty.com/script/autopagerlike.user.js

多分、os0x さん作のものがiframeを使用しているのも、その辺りが理由のひとつではないかと。

#ちなみに、当方の現版では'ADODB.Stream'を使って文字コード変換しています。ただ、素のIE7だとActiveXObject('ADODB.Stream')はセキュリティで引っかかってしまうのでダメかも。

投稿者: 風柳 (2008.03.27 午後 10:33)


> UTF-8以外のページだと文字化けしちゃいます

確かに http://plusd.itmedia.co.jp/lifestyle/articles/0803/31/news007.html に対して、AutoPagerize を適用しようとしたら文字化けしました。対策が必要ですね ><

投稿者: tsupo (2008.03.31 午後 06:38)


Shift_jis でも文字化けしない場合 (例えば、http://codezine.jp/a/article/aid/1015.aspx ) もあるんですね。http://nurucom-archives.hp.infoseek.co.jp/digital/ を参考に、文字コード変換関数を用意しようかと思ったけど、とりあえず挫折。

投稿者: tsupo (2008.03.31 午後 11:28)


同じ Shift_jis でも ITmedia では化けて、CodeZine では化けないのは、charSet の宣言より先に漢字を使っているかどうか、の違いが、もろに出ているんですね。charSet の宣言をしてから漢字を使ってる分には化けない。

投稿者: tsupo (2008.04.01 午前 12:23)


私がAutoPagerlike作成時に2ページ目以降の文字化けに気付いたサイトは
http://www5e.biglobe.ne.jp/~aji/3min/0.html
だったんですが、ここではちゃんとcharsetを設定してから漢字を使っているように見えるのですよね…(?_?)。

投稿者: 風柳 (2008.04.03 午後 11:14)

コメントを書く




※イタズラ防止のため、メールアドレスを入力しないと投稿できません。

次からのコメント入力の手間を省くために、名前やメールアドレスをcookieに記憶しますか?


URL を入力すると、その URL にリンクがはられます。
なお、メールアドレスは公開されません。ご安心ください。


ワード

ニッセン

fujisan.co.jp

楽天市場