JavaScript類総合
- 1 :l ★:2007/02/19(月) 04:41:21 ID:???
- WSH、Sleipnir2のやつ、Ajaxとかいう奴など、JavaScript関係のメモ。
Sleipnir2スレをあんまり関係ないスクリプトの断片で埋めないために。
DMonkey?何それ?
- 2 :l ★:2007/02/19(月) 05:25:01 ID:???
- 最速インターフェース研究会 :: ページレンダリングを妨げないdocument.writeの実装
http://la.ma.la/blog/diary_200612061928.htm
本来のdocument.write()を、描画先にしたいdiv要素内を書き換えるような関数にすり替え、読み込み・実行に時間のかかるscript要素をページの一番最後に書くことで、ページの表示をスムーズにするらしい。
他所が用意したスクリプトを組み込まなきゃならないときなどに使うのだろう。
自分で作ったスクリプトなら、window.onloadでも使って重い処理がページ読み込み完了後に行われるようにすればいい。
IT戦記 - [JavaScript] とてもシンプルに自分自身が属する script 要素を取得
http://d.hatena.ne.jp/amachang/20061201/1164986067
- 3 :l ★:2007/02/19(月) 05:50:55 ID:???
- プロセスの一覧取得とかが出来たりするWMIという奴のリファレンス
http://msdn2.microsoft.com/en-us/library/aa394372.aspx
- 4 :l ★:2007/02/19(月) 08:14:54 ID:???
- Microsoft.XMLHTTPでは、302 Foundのリダイレクトを勝手に追跡しやがる。
さらに、別ドメインにリダイレクトされると警告ダイアログが表示される。
全自動実行したいときなどには迷惑極まりない。死ね。
onreadystatechangeでstatusが302だったときabort()してやればいいかと思ったが、なぜかリダイレクト前にイベントが発生しないので止めようがない。
ServerXMLHTTPという、いくらかましな動作をするオブジェクトがあるらしいことを知る。
http://support.microsoft.com/kb/290761/ja
http://msdn2.microsoft.com/en-us/library/ms754586.aspx
こちらのonreadystatechangeは、ちゃんと最初のリクエストがINTERACTIVEになったときに呼ばれる。
クロスドメインでリダイレクトされても黙って追跡してくれるし、abort()で止めることも出来た。
その他、プロキシやタイムアウトが設定できるなど、色々とまともになっている。
- 5 :l ★:2007/03/02(金) 18:07:17 ID:???
- そう言えばJavaScriptの正規表現には先読み(?=と否定先読み(?!がある。
戻り読みとか再帰とかは無いらしい。
http://developer.mozilla.org/ja/docs/Core_JavaScript_1.5_Guide:Writing_a_Regular_Expression_Pattern
WSHのリファレンスにもあったし、かなり標準的な仕様らしい。
以下のような感じで、リンク一つと次のリンクまでの内容に繰り返しマッチするような正規表現が作れる。
'<a href="abc.html">link</a>aaaaa<a href="def.hmtml">link2</a>ddddd'.match(/<a[^>]*href="([^"]*)"[^>]*>(.*?)<\/a>(.*?)(?=(<a |$))/g)
あと、[]の中などでも全角文字はちゃんと動作する。たぶん、UTF-8として処理される。
String.prototype.toHankaku=function(){
return(this.replace(/[!-〜]/g,function($1){return(String.fromCharCode($1.charCodeAt(0)-0xFEE0));}));
}
- 6 :l ★:2007/03/08(木) 02:39:45 ID:???
- DMonkey風HTTPライブラリ
いちいちActiveXObjectを作ったりするのが面倒なので、HTTPライブラリを作成することに。
以前よく使っていたDMonkeyのHTTPクラスに似た仕様を目指す。
とりあえずMSXML2.ServerXMLHTTP.4.0を使うことにしたが、なぜか以前試したリダイレクト阻止が動作しない。3.0にしたら動作する。仕様が変更されてるのか。余計なことしやがって。
3.0を使うようにすると、setProxyなどが動作しなくなる。ふざけやがって。
WinHTTPRequestという、より細かい設定が可能なコンポーネントがあるらしいが、なぜか各種イベントが動作しない。onreadystatechangeがないし、ドキュメントに載っているOnResponseFinishなども動作しない。舐めんな。
とりあえず、この辺りは後回しにすることに。
テキストをGETしたとき自動的に文字コードを変換する機能とかを付けてみる。
とりあえず動作したが、Content-Typeとかの認識などは後回し。
XMLHTTPで非同期リクエストの実行中に次のリクエストが行われたら、リクエストをキューに保存しておいて、完了後に連続して実行するという機能を付ける。
個々のリクエストに完了時コールバック関数を指定することも可能に。
getFileメソッドでは、ファイル保存をコールバックで行うことで、非同期でリクエストをまとめて登録出来るようになった。これで、通信を行いながら他の処理をするといったことが可能になるような気がする。
投稿ファイル名: HTTP.zip
http://lukewarm.s151.xrea.com/b/file/1171809116_6.zip
サイズ: 3176 bytes
- 7 :l ★:2007/05/14(月) 11:43:04 ID:???
- InternetExplorer.Applicationを使わなくても、HTMLドキュメントのパースは出来るらしい。
html=new ActiveXObject('htmlfile');
html.write('<div id="main"><p align="center">aaaaa</div>');
XHTMLではないHTMLから特定の要素を取り出したいときなどに使えるかも。
- 8 :l ★:2007/06/02(土) 03:48:07 ID:???
- XPath
http://www.infoteria.com/jp/contents/xml-data/REC-xpath-19991116-jpn.htm
仕様書があったので適当にJavaScriptのライブラリを作ってみた。
実行にはScrapBookのStd.jsが読み込まれている必要がある。パクリ元のprototype.jsとかいう奴でも動くかも知れないが。
XPath式を元に、与えられたノードに式を適用して結果を返す関数を生成する。
例えば、「XPath('count(//div[@class="Navi"])')」は、以下のような関数を返す。
function(c){
var ct=(c.constructor==XPath.Context)?c:(new XPath.Context(c));
return(ct["count"]((new XPath.NodeSet(ct.Node.ownerDocument)).Step("descendant-or-self").Step("child","div",0)));
}
[@class="Navi"]のような述語の中の式は、別の関数に分割され、XPath.ExprFuncsという配列に格納される。中の処理は以下のような感じ。
return(ct.eq((new XPath.NodeSet(ct.Node)).Step("attribute","class"),"Navi"));
XPath.ContextやXPath.NodeSetというクラスに、実際の処理を行うメソッドが定義されている。
count()のような関数や、「=」のような一部の演算子は、Contextのプロトタイプメソッドとして用意してある。
パスの処理では、「.Step("child","div",0)」という部分が「div[@class="Navi"]」に対応している。第3引数以降の数値は、述語の式に対応した関数のID。
なお、「and」のような一部の演算子は、そのまま「&&」のようなJavaScriptの演算子に変換される。
なにやら凄く冗長になっているような気がするが、割と仕様書の通りになっているはず。
しかし、未実装や適当な実装が多数。
まず、字句解析では、NCNameとかQNameというのがよく分からなかったので、正規表現が適当。
HTMLのタグ名には正しくマッチすると思うが。
構文解析は、構文解析器の書き方がよく分からなかったので適当。
演算子の優先順位とか結合規則が正しく働くのか怪しいが、そっくりそのままJavaScriptの式にしてしまうのだから大丈夫なはず。
「a<b<c」→「ct.lt(ct.lt(a,b),c)」のような変換は正しく行われているような気がする。
コア関数は、name、local-name、translateがよく分からないので未実装。まあ、HTMLでは使うまい。
その他、演算子や関数での型の変換とかがよく分からないので適当。
Step()では、preceding、following、namespace基準点が面倒くさいので未実装。何に使うんだか。
NodeSetは、重複チェックや並び順の処理を真面目にやっていないので、基準点によってはおかしくなるはず。
子孫要素を選択するだけなら大丈夫だと思うが。
その他、実行速度も全体的に駄目そうだ。
「//div」とかやると、ドキュメント内の全ての要素をチェックするので、もの凄く遅い。
コード生成の途中でgetElementsByTagName('div')にでも変換してやればましになるだろうか。
とりあえず、AutoPagerizeのページ(http://swdyh.infogami.com/autopagerize)に有ったXPathをいくつか試してみたところ、それなりに動作しているような気がする。
作ってみたものの、使い道は未定。
ScrapBook.user.jsでは、HTMLを作る際に必要な要素にはあらかじめidを振ってあるので、XPathで選択する必要はない。
AddScrap.jsでは、スクラップ対象のページの構造が分からないので、XPath式の作りようがない。
投稿ファイル名: XPath.zip
http://lukewarm.s151.xrea.com/b/file/1171809116_8.zip
サイズ: 5196 bytes
- 9 :l ★:2007/06/02(土) 04:00:36 ID:???
- ブラウザを使わずにHTMLドキュメントを処理できる>>7のテクニックだが、
imgとかを含むHTMLをロードすると、srcとかでリンクされたファイルをダウンロードしやがる。
バックグラウンドで行われるので、ハングアップするようなことはないが、勝手に変なものをダウンロードしようとするのは気にくわない。
とりあえず、「(src="?)http:」を「$1ttp:」にでも置換してやれば阻止できるが、出来ることなら使わないようにしたい。
innerHTMLとかもひどいコードに変換されるし。
- 10 :l ★:2007/06/02(土) 05:05:09 ID:???
- >>8
字句解析の正規表現が適当すぎて、textarea要素を選択できないことに気付いた。
適当に前後に\\bを付けてやれば直るはず。
8KB
0ch BBS 2005-10-08