0

jQuery を使用する Greasemonkey スクリプトを作成しましたappendTo('body')
すべて正常に動作していますが、igoogle ページの Google 広告やガジェットなどの他の DOM 要素にも HTML が追加されています。

これを修正するものはありますか?この問題にサンプルコードは必要ないと思います。代わりに、私の問題を示す写真をアップロードしました。

私のiGoogleページ


ご覧のとおり、追加した HTML はさまざまな場所に表示されます。

4

2 に答える 2

2

frameはい、これは、Greasemonkey がとをそれぞれiframe独自のページとして扱い (ある意味ではそうです)、@include@exclude、および/または@matchディレクティブが示すように実行されるという事実によって引き起こされます。
(属性のない iframesrcは、ベース ページと同じ URL からのものと見なされることに注意してください。)

スクリプトが iframe でトリガーされないようにするには、次のコードをスクリプトの先頭近くに配置します。

if (window.top != window.self)  //-- Don't run on frames or iframes.
    return;


実際に一部の iframe で実行し、他の iframe で実行したくない場合は、可能であれば、、、および/またはディレクティブを調整する@include@exclude@matchターゲット ページにリンクして、iframe を選択的にブロックする方法を選択する方法を選択してください。

于 2012-05-12T23:09:31.673 に答える
2

HTML が複数の項目に追加されているのは、処理しているマークアップに iframe が存在するためである可能性が最も高いです。

<html></html>各 iFrame (ガジェット、広告は iFrame であると思われます) には、と<body></body>タグを備えた独自の完全な HTML 構造があります。すると、スクリプトはセレクター.appendTo('body')に一致するすべての要素にコンテンツを追加します。'body'

よりもユニークなセレクターを提供する必要があります$('body')


やりたいことは$('body:first')、ジェネリックセレクターに加えて、ある種の他のユニークなセレクターを使用してみることbodyです。コントロールできないHTMLに依存しているため、これを少しいじる必要があるかもしれません-GMスクリプトを任意のページで実行したいと思うので、そのページの構造に制限されます。たとえば、:first <body>タグが正しいものであるという保証はありません。

あなたが私に尋ねると、これを行う確実な方法の1つは、返されるすべての<body>要素を反復処理し$('body')、それぞれにIframeである親要素があるかどうかを確認することです.

このようなもの -

var selectedElement = '';
$('body').each(function(index,elem){
  if ($(elem).closest('iframe').length){
    selectedElement = $(elem);
  }
});

if (selectedElement){
  // appendTo(selectedElement);
}

  • .each()この関数を使用して、指定されたセレクターに一致するすべての要素 (この場合は - ) を反復処理していますbody

  • .closest()ここで関数を使用して、すべての親要素をナビゲートし、指定されたセレクター (この場合は - ) に一致する祖先を見つけますiframe

于 2012-05-12T14:02:20.037 に答える