具体的なコードはこちらです。
http://blog61.fc2.com/w/worris/file/hbmview.user.js
Javascriptのwindow.top.documentでは駄目なようですね。
http://f32.aaa.livedoor.jp/~azusa/index.php?t=js&p=28#8
親フレームの場合はparentプロパティ、フレームトップの場合はtopプロパティ、現在のフレームの場合はselfプロパティを使用します。
これを使えば、現在自分がtopなのか、などが判断できるようになります。
IFRAMEの場合、親フレームを置き換えでいいと思いますが、
FRAMEの場合は最上位の親フレームのbodyはnoscript用になってしまうと思うので、あまり意味はないかもしれませんが。
ごめんなさい、topは試されているのですね。parentで再帰的にってのも試してみてはどうでしょうか?と思って書いたつもりだったのですが、topの方で、と答えた書き方になってしまいました。
http://espion.just-size.jp/archives/06/094171639.html
ではtopで処理がうまくいっているようなのですけどね・・・
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); } }
フレームごとに同じ処理が呼ばれているともしかしたらダブって挿入されるかもしれません。その場合は挿入するエレメントに名前をつけてダブらないようにチェックしたほうが良いと思います。
なぜかうまく行きません。
spl_linkがnullのままになるようです。
GM_xmlhttpRequestは読み込みが終わるのを待たないのでしょうか?(そのためにonload: で読み込み完了後の処理を記述する?)
top.document.location.hrefで取得されるのは、親フレームの場合も子フレームの場合も一番外のフレームのURLなのです。
しかしtop.document.evaluate("//body", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;を子フレームに対して行う時には、子フレームのbodyが取得されているようなのです。(という推測をしています。)