« 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 について調べてたら深みにハマったのでメモ - IT戦記
そもそも getComputedStyle という関数自体が存在しない
その代わり、 IE ではすべての HTMLElement が currentStyle というプロパティを持っていて、これが getComputedStyle で取得できるオブジェクトとほぼ同じ役割をする。
via はらへた
c_style.getPropertyValue()
今度は c_style.getPropertyValue() で引っ掛かった。 とりあえず、エラーが出ながらも、ある程度は動き始めてるっぽい。
IE7 で動き始めた AutoPagerize
ブラウザの右上じゃなくて、左下に出ちゃうのが変だけど。 あと、toSource という文字列が表示されてしまう原因が不明。
via はらへた
(つづく)
投稿者: tsupo 2008.03.27 午前 03:43
| 固定リンク
|
|
| ![]()
|
|
アマゾンわくわく探検隊
トラックバック
この記事のトラックバックURL:
この記事へのトラックバック一覧です: 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)



