作ったもの
- 16 :l ★:2006/11/10(金) 21:42:32 ID:???
- ・Sleipnir用辞書スクリプト、フレーム内のページでも動作するように修正
選択範囲の文字列を処理するスクリプトが、フレームページ中ではうまく動かない。
_documentと選択範囲を含むドキュメントが違うのだから当たり前か。
フレームをたどって、選択範囲を含むドキュメントを取得する関数を作ることに。
とりあえず、フレーム内のドキュメントを選択している場合、_document.activeElement.tagNameはFRAMEかIFRAMEになるようなので、そのときにアクティブなフレームをたどることに。
各フレームのwindowオブジェクトにアクセスするにはdocument.framesを使う必要があるらしいが、activeElementとの対応が分からない。
各windowオブジェクトのdocument.hasFocus()でアクティブかどうかを調べようかと思ったが、アクティブでないフレームでもtrueになってしまう。
仕方ないので、別途フレーム要素の一覧を取得して、アクティブ要素と一致するものを調べ、対応するframesのアイテムをアクティブフレームとみなすことに。
なぜかdocument.all.tags(tagName)だとうまく一覧が取得できないときがあったが、getElementsByTagName()を使ったらうまくいったりした。
また、document.framesなどのコレクションに[i]のようなインデックスでアクセスしようとするとおかしくなることがあったが、item(i)のようにメソッド経由でアクセスしたらうまくいった。
フレーム内で別ドメインのページを表示しているような場合は、「アクセスが拒否されました」というようなエラーになってframesの要素にアクセスできない。クロスサイトスクリプティング的なものへの対策だったか。とりあえず、今回の所はあきらめることに。
そんな感じで、アクティブなフレームを割り出し、frames.item(i).documentを渡して再帰呼び出しし、アクティブな要素がフレームではなくなるまで潜っていくようにしたが、なぜかうまく結果が取得できない。
再帰呼び出しした先でdocumentオブジェクトのメンバにアクセスできなくなっているようだ。
なぜか、documentではなくその親のwindowオブジェクトを渡すようになおしたらまともになった。
まあ、ドキュメントを引数にアクティブなドキュメントを受け取るよりは、ウィンドウを引数にした方が感覚的には自然だからいいか。
投稿ファイル名: gooDictionary.zip
http://lukewarm.s151.xrea.com/b/file/1149783578_16.zip
サイズ: 834 bytes
28KB
0ch BBS 2005-10-08