2012-03-04 3 views
0

私たちはすべて、ajaxの更新イベントで新しいdom要素にリバウンドする必要があることを知っています。はいデリゲートはオプションですが、デリゲートはすべてのシナリオで機能しません。たとえば、デリゲートはクリックイベントではなくロード時に簡単に行う必要のあるイベントに対しては役に立ちません。JQuery Ajax - デリゲートではなくコンテキストパラメタで要素をリバックする?

ではなく更新にリバウンドする必要があるデリゲートハンドラとハンドラの中に私のコードを分割し、私はむしろそのようなページが変更されるたびに呼び出されるコンテキストパラメータを持つ単一のメソッドを定義します

function onPageUpdate(context) { 
    $('a', context).click(...); // event handlers 
    $('.chart', context).addClass(...); // load handlers 

} 

DOM準備ができたら、これはcontextパラメータnullで呼び出されます。 ajaxの更新では、コンテキストは新しいdom要素を格納します。このようにして、委任またはajaxの更新をもう一度心配する必要はありません。

しかし、これを動作させるのに問題があります。与えられたajaxコールバック:

function onSuccess(data) { 
    // data contains new dom elements like: <div><a>Click</a><span>chart<span></div> 
    // replace old elements with new ones 
    $('a').replaceWith('a', data); 
    $('span').replaceWith('span', data); 

    // call pageUpdate with the new context 
    onPageUpdate(data); 
} 

私は期待どおりこの仕事をすることは可能ですか?置換はうまく動作しますが、onPageUpdateはこれらの新しい要素に何もバインドしていません。コンテキストが単なる文字列オブジェクトなので、私はそれを知りません。誰もこの仕事をする方法を考えることができますか?

これは、すべてのハンドラのためのメソッドとバインディングを必要とする要素だけがそれを所有するため、デリゲートより優れたソリューションです。

答えて

0

jQuery() - jQuery API

からjQueryの(セレクタ[コンテキスト])

セレクタセレクタ式を含む文字列

A DOM要素は、ドキュメント、またはjQueryのコンテキスト

として使用する

コンテキスト

文字列を渡すなど、コンテキストが正しいタイプでない場合は、単純にi淋しい。

var $context = $(data); 
$('a').replaceWith('a', $context); 
$('span').replaceWith('span', $context); 

// call pageUpdate with the new context 
onPageUpdate($context); 
+0

私はこれを試しましたが、バインディングは固執していませんでした。これは、シーンの背後にあるオブジェクト参照の問題の一部である可能性があります。私がそれが動作することを発見した1つの方法は、それが遅く感じるが、onPageUpdate($( 'a'))のような新しい要素で置き換えられるたびにページメソッドを個別に呼び出すことです – user842800

0

私は、あなたの質問に答えていますアンソニーグリストの答えは全く正しいですが、いくつかがあります:あなたのセレクタのコンテキストとして、そのようにすることを使用し、その後、jQueryオブジェクトであなたのHTML文字列をラップしてみてくださいあなたは私が理解していないと言ったこと。それらを私に説明できますか?単に負荷にではなく、クリックイベント

申し訳ありませんが、私はそれを取得しないで行われる必要がある何かのために助けにはなりませんインスタンスデリゲートについては

、あなたは例がありますか?私の心の中で

これは、すべてのハンドラのtheresの 唯一の方法と、それを所有する結合 を必要とするだけの要素ので、デリゲートよりも優れたソリューションです。

は、私もそれを得ることはありません。

  • only one method:どの方法あなたが話しているの?
  • only the elements ... will own it:あなたがしているonPageUpdateそれはあなたの方法でも、デリゲートの場合だと、より多くの、あなたがのは10アンカー要素を言わせている場合、唯一ONEハンドラが拘束されるだろう、代わりのソリューションで10

イベントの処理($("a").click(...))とDOMの変更($(".char").addClass(...))の2つのことが混在しています。おそらく、あなたが問題を解決する代理人の能力を混乱させているのかもしれません。

+0

私の例では、 。これらの両方は、イベントのメソッドと負荷の別のメソッド(これはajaxの更新でも呼び出される必要があります)ではなく、単一のメソッドで処理したいと思っていました。私はそれを処理するためにコンテキストパラメータで1つのメソッドを呼び出そうとしていました。私は、デリゲートが個々にバインドされるハンドラよりもバインドされたハンドラが少ないというあなたの要点を見ています – user842800

+0

そしてロードのイベントを委任できないので、domの変更は、delegate cant handleのための私の例です。そのコードは、新しいDOM要素で再度呼び出す必要があります。 – user842800

+0

私はあなたのポイントを参照して、私は負荷/代理人の問題について知りませんでした。まず、イベントデリゲーション(一度だけ呼び出される)とイベントデリゲーションで動作しない現在のシステム(ページロード時と各リクエスト後に呼び出される)を使用する2つの部分にコードを分割しないでください。イベントの委任は本当に強力です。このソリューションでは、アプリケーションの処理速度が速くなります(最初に、要求があった後に実行されるコードが少なく、ハンドラの束縛が少なくなります)。それはコールする2つの機能ですが、ゲインは大きくなります:)あなたはどう思いますか? – pomeh

関連する問題