2012-02-20 11 views
0

jqueryのreplaceWithにonclickイベントを設定する際に問題があります。 2回目のonclickイベントの私の機能は機能していません。これは私のサンプルコードです。jqueryで置き換えたときにonclickイベントを追加する

sample.html

<div id = "first_div" onClick = "replace()">First</div> 

my.js

function replace() { 
    $('#first_div').replaceWith("<div id = 'sec_div' onclick='flyout('fb')'>Second</div>"); 
} 

私はそれが動作first_divをクリックします。 2nd_divが表示されますが、2番目のdivをクリックすると何もしません。

function flyout(data){ 
    if (data == "fb") $('#sec_div').replaceWith("<div>Last</div>"); 
} 
+0

どちらの答えをチェックアウトし、次のようにそれをエスケープしてみ '.live()'関数を示唆しています。より最近のバージョンのjQueryでは、 '.live()'を置き換えた '.on()'関数を使いたいかもしれません。 http://api.jquery.com/on/ –

答えて

1

コードが機能しないのは、#sec_div要素の 'onclick'に関数を渡していないということです。 onclick="flyout('fb');"と定義されていますが、フライアウト関数は何も返しません。以下のコードを変更してflyoutが関数を返し、dataパラメータに同じ値のこの同じ関数を使用する場合は、dataの値をそのクロージャにカプセル化します。

また、私はあなたのHTMLとあなたのJavascriptを分離するのに役立つ解決策を提供しています。 jqueryを使用すると、delegateメソッドを使用して、関数を任意のイベントにバインドすることで実現できます。

HTML:

<div id="first_div">First</div> 

JS:

$("body").delegate('#first_div', 'click', replace); 
$("body").delegate('#sec_div', 'click', flyout("fb")); 

// change replace to: 
function replace() { 
    $(this).replaceWith("<div id='sec_div'>Second</div>"); 
} 
// change flyout to: 
function flyout(data){ 
    return (function(){ 
     if (data == "fb") { 
      $(this).replaceWith("<div>Last</div>"); 
     } 
    }); 
} 

EDIT: live方法の最新のjQueryのドキュメントの使用によるが廃止されて、代わりにdelegateを使用しています。

+0

ありがとうございます、これを試してみました。 –

+0

@ggreiner '.live()'関数は推奨されていません。 jqueryのドキュメントから '.lve()'は '.delegate()'メソッドに取って代わります.jQuery 1.7+を使用する場合は '.on()'関数を使うことをお勧めします。 – Vivek

+0

ありがとう、それは動作します。 –

1

新しいdivにバインドされたクリックイベントはありません。

replaceWith()コールの後に新しいリスナーを追加するか、live()を使用してドキュメントレベルでリッスンします。

+0

Ha?どういう意味ですか?私はsec_div上でclickイベントを持っており、これが問題の場所です。 sec_divをクリックすると、最後のdivは表示されません。 –

+0

コードにonclickを入れても、DOMはそれを認識しません。それは新しい要素に束縛されていません。ページはすでに作成されているため、新しいイベントを別のメソッドにバインドする必要があります。 –

+0

ああ、そうだね。新しい学習:)感謝します。 –

1

関数replaceで正しくエスケープしていません。

onclick='flyout('fb')' 

部分には3つの4重引用符があります。 2番目の引用符は最初の引用符を閉じ、3番目の引用符は新しい文字列を開始します。

element="<div id = 'sec_div' onclick='flyout(\"fb\")'>Second</div>" 
$('#first_div').replaceWith(element); 

はまた、以下のhttp://jsfiddle.net/5Stuh/