Greasemonkeyで、すべてのページのbodyタグのすぐ後ろにタグを挿入するスクリプトを書いたのですが、FRAMEやIFRAMEが使われているページではフレーム内のbodyにも適用されてしまいます。一番外のフレームにだけ適用させる方法はあるのでしょうか?

具体的なコードはこちらです。
http://blog61.fc2.com/w/worris/file/hbmview.user.js
Javascriptのwindow.top.documentでは駄目なようですね。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2006/07/23 00:13:00
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:kidd-number5 No.1

回答回数117ベストアンサー獲得回数15

ポイント20pt

http://f32.aaa.livedoor.jp/~azusa/index.php?t=js&p=28#8

親フレームの場合はparentプロパティ、フレームトップの場合はtopプロパティ、現在のフレームの場合はselfプロパティを使用します。 

これを使えば、現在自分がtopなのか、などが判断できるようになります。

IFRAMEの場合、親フレームを置き換えでいいと思いますが、

FRAMEの場合は最上位の親フレームのbodyはnoscript用になってしまうと思うので、あまり意味はないかもしれませんが。

id:kidd-number5 No.2

回答回数117ベストアンサー獲得回数15

ポイント20pt

ごめんなさい、topは試されているのですね。parentで再帰的にってのも試してみてはどうでしょうか?と思って書いたつもりだったのですが、topの方で、と答えた書き方になってしまいました。

http://espion.just-size.jp/archives/06/094171639.html

ではtopで処理がうまくいっているようなのですけどね・・・

id:worris

top.document.location.hrefで取得されるのは、親フレームの場合も子フレームの場合も一番外のフレームのURLなのです。

しかしtop.document.evaluate("//body", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;を子フレームに対して行う時には、子フレームのbodyが取得されているようなのです。(という推測をしています。)

2006/07/22 15:55:49
id:ardarim No.3

回答回数897ベストアンサー獲得回数145

ポイント40pt

GreaseMonkeyは使ったことがないので(というかFireFox使っていないので)的外れだったらすみません。

問題の処理は、GM_xmlhttpRequest()の引数として渡した関数の中で実行されますが、GreaseMonkeyがonload関数を呼び出す際のDOM空間がページ全体ではない(フレーム単位?)のではないでしょうか?

GM_xmlhttpRequest()で取得した結果を一旦変数などに保存して、GM_xmlhttpRequest()を抜けた後で挿入処理をしてみてはどうでしょうか。

こんな感じでしょうか。

function showhatena() {
    var uri=escape(top.document.location.href);
    var spl_link = null;
    GM_xmlhttpRequest({
        ... 省略
         onload:function(response) {
            if(...){
                ... 省略
                  spl_link = document.createElement('iframe');
                ... 省略
              }
        }
    });
    if(spl_link){
        var header = top.document.evaluate(...);
        header.parentNode.insertBefore(spl_link, header.nextSibling);
    }
}

フレームごとに同じ処理が呼ばれているともしかしたらダブって挿入されるかもしれません。その場合は挿入するエレメントに名前をつけてダブらないようにチェックしたほうが良いと思います。

id:worris

なぜかうまく行きません。

spl_linkがnullのままになるようです。

GM_xmlhttpRequestは読み込みが終わるのを待たないのでしょうか?(そのためにonload: で読み込み完了後の処理を記述する?)

2006/07/22 23:20:54
  • id:worris
    結局、次の一行を加えることで対処できました。
    if (self.location.href!=top.location.href) return;
    ありがとうございました。
  • id:worris
    ardarimさんの回答については、XMLHttpRequestではopen("GET", url, true)で読み込み完了を待たない(非同期)、falseにすると読み込み完了を待つ(同期)、のいずれかが選択できるのですが、 GM_xmlhttpRequestでは非同期にしかできないようです。
    読み込んでいる間に次の処理に移り、読み込み完了時にonload: の処理がされるわけですね。

この質問への反応(ブックマークコメント)

トラックバック

  • Yakalikeが、日本人ユーザーが少ないせいなのか一向に使えないので、代わりにといっては何だがこういうものを作ってみた。 Hatena Bookmark Comments Viewer 今現在表示しているページに対し
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません