2012-03-19 22 views
7

自分が所有していないか制御していないページでカスタムスクリプトを実行するのが楽しいです。多くの場合、これらのページには、機能を適用したいコンテンツが動的に作成されています。動的に作成されたDOMノードが挿入されたときのハンドラ

これは可能ですか?もしそうなら、どうしたらいいですか?理想的には、私は何かのライブのjQueryのliveメソッドを探していますが、clickのようなイベントをバインドする代わりに、要素がDOMにロードされたときに起こるイベントのようになります。 loadイベントは一部の要素では機能しますが、私はすべてとは思えません。

この質問では、DOMノードを挿入しているコードを見たり変更したりすることはできません。私は、関連のない複数のサイトにまたがって使用されるユーザースクリプトやブックマークレットで使用できるテクニックを望んでいます。

編集:私は私の反転色のブックマークレットで使用するために何かを探しています:DOMの変化に反応のための実行可能なイベントがありませんのでJavaScript: Invert color on all elements of a page

+0

どのような機能を適用したいですか?あなたは 'DOMNodeInsertedIntoDocument'イベントを聞くことができますが、これは興味のない多くの挿入されたノードに当てはまるでしょう。 – nrabinowitz

+0

私は実際にすべてのノードに興味があります。私はページ上のすべての色を変更しています。 – Muhd

答えて

6

jQueryののようなライブラリへのアクセス、ここでは、オンリーはJavaScriptで構文です:

document.addEventListener('DOMNodeInserted', nodeInsert) 

function nodeInsert() { 
    event.srcElement.style.color = '#ffffff' 
} 

私はそれがほとんどのブラウザで動作するはずだと思います。

+1

ランダムな読者のために注意したいのは、それを避けることができれば突然変異イベントを使わないでください。詳細:http://lists.w3.org/Archives/Public/public-webapps/2011JulSep/0779.html – Nickolay

+1

@Nickolay - 参考に感謝します。私は一般的にこれらを使うのは良い考えではないことを知っていますが、OPのユースケースでは合理的です(とりわけ、ユーザースクリプトに関する議論は遅いかクラッシュの影響を受ける唯一のものです)。 – nrabinowitz

1

これは、達成することはかなり困難です。むしろ、代わりにイベント委任に固執したいと思います。

しかし、あなたが役に立つか面白いかもしれないいくつかの出来事があります。 Mozilla Developer Network's list of DOM eventsにあなたが例えば見ることができます。:

  • DOMNodeInserted
  • DOMNodeInsertedIntoDocument
  • DOMNodeRemoved
  • DOMElementNameChanged

それらのすべては、しかし、W3Cドラフトとしてマークされています。

+0

これはどのブラウザに実装されていますか?理想的には、Chromeで動作するものが好きです。 – Muhd

+0

「ドラフト」マーカーは、MDCエディターの一部の見落としです。これらのイベントはDOML2イベントにもありました。これは「勧告」です。事実、これらのイベントのほとんどはIE以外のすべてで動作します。可能であれば、大きな欠点があるので(詳細はhttp://lists.w3.org/Archives/Public/public-webapps/2011JulSep/0779.html) – Nickolay

1

ノードの挿入を検出する一般的な方法は、DOMNodeInserted突然変異イベントを使用することです。

私はすべてのノードに実際に興味があります。私はページ上のすべての色を変更しています。

この目的のために、より良い解決策は、!importantフラグで十分である動的スタイルシートを挿入することです。色のみを変更したい場合は、GreaseMonkeyの代わりにStylish拡張子(Stylish for Chrome)をお勧めします。

$(document).on('DOMNodeInserted', function(e) { 
    $(e.target).css({ color : '#c00' }); 
}); 

$('body').append('<div>test</div>');​ 

フィドル:http://jsfiddle.net/VeF6g/(おそらくIEで失敗した)

+0

ですが、使用することは避けてください。重要なフラグは多くのページを破壊するでしょう。私は、多くの異なるページで機能し、よく見えるインテリジェントなスクリプトを作成しようとしています。 – Muhd

+0

@Muhdスマートセレクタを選択して、特定の要素のみを選択することができます。スタイリッシュは '@ -moz-document regexp()'を介してRegExesを使ってドメイン選択をサポートしています - ['@ document'](https://developer.mozilla.org/ja/CSS/@document)も参照してください。 –

1

をあなたは持っていない場合は、FirefoxやChromeなどのブラウザを実行している、あなたはDOMNodeInsertedイベントをリッスンしたと仮定すると

3

ここでは、ノード挿入イベントを処理する優れた方法の1つです。 cssを使用して追加する要素のアニメーションを設定します。

<style type="text/css"> 

/* set up the keyframes; remember to create prefixed keyframes too! */ 

@keyframes nodeInserted { 
from { opacity: 0.99; } 
to { opacity: 1; } 
} 

#parent > button { 
animation-duration: 0.001s; 
animation-name: nodeInserted; 
} 

</style> 

#parentは私が動的にボタンの を追加しようと思っているのdivのためのIDです。

<script type="text/javascript"> 

    var insertListener = function(event){ 
     if (event.animationName == "nodeInserted") { 
      // This is the debug for knowing our listener worked! 
      // event.target is the new node! 
      console.warn("Another node has been inserted! ", event, event.target); 
     } 
    } 

    document.addEventListener("animationstart", insertListener, false); // standard + firefox 
    document.addEventListener("MSAnimationStart", insertListener, false); // IE 
    document.addEventListener("webkitAnimationStart", insertListener, false); // Chrome + Safari 

    setInterval(function(){ 

     var btn = document.createElement("BUTTON"); 

     var t = document.createTextNode("CLICK ME");  // Create a text node 

     btn.appendChild(t);   

     document.getElementById("parent").appendChild(btn); 

    }, 2000); 

</script> 
+0

私はこのメソッドを実装し、 'insertListener'メソッドの中で' iframe'の応答のあるサイズ変更をプログラムしました。奇妙なことは、カスタムリサイズの振る舞いは、前にではなく、 'iframe'までスクロールした後にのみ起こるということです。何がここで起こっているかもしれない考えですか? –

関連する問題