2017-12-22 34 views
0

に私は、これはHTMLボタンに結び付け機能をJS持っonclick属性:Javascriptを/ jQueryのコードは、第二に二回、最初のイベントに一度実行され、その

function AddFbLikes() { 
$('#fbform').on('submit', function(e) { 
    e.preventDefault(); // prevent form submission 
    $("input:checkbox:checked").each(function(idx, val){ 
     callResult(val.value); 
    }); 
})} 

私は条件に一致する4つのinputの要素を持っていると仮定すると、 HTMLに4つの要素が追加されます(これはcallResult()の機能です)。しかし、私がもう一度ボタンをクリックすると、私は8回以上を取得し、3回クリックすると12回以上を取得します。

これをデバッグしようとしましたが、それは分かりません。私はPython/Djangoから来ているので、Javascriptで取得できないものがあるはずです。

+0

? – jeff

+0

@jeffなし。 JavascriptやPythonではありません。ボタンを含むHTMLを追加します。 – zerohedge

答えて

4

あなたの関数AddFbLikesは、呼び出されるたびに$('#fbform')で見つかったすべての要素に対して別のイベントリスナーを追加します。だからこそ、それが見つけた4つの要素に対して4つの要素から始まり、毎回4つずつ成長します。そこにコードを構造化するためのより良い方法は、おそらくですが、あなたが私たちに与えてくれたものを考慮すると、(http://api.jquery.com/one/)の代わりにononeを試してみてください。

function AddFbLikes() { 
    $('#fbform').one('submit', function(e) { 
     e.preventDefault(); // prevent form submission 
     $("input:checkbox:checked").each(function(idx, val){ 
      callResult(val.value); 
     }); 
    } 
)} 
+0

いくつかの実行は、これが完全に動作することを示しています。ありがとうジョージ。私はupvoteし、おそらく何かがより良い(私が知っているではない!)に沿って来ていない限り、これを正しい答えとしてマークします。なぜあなたは私のコードを書いた方がより良い構造になるかもしれないかについて詳しく説明できますか?さらに重要なのは、addFbLikesが別のイベントリスナーを「追加」している理由とその理由を説明することです。なぜ他のリスナーは2回トリガをトリガしますか? – zerohedge

+0

さて、 'AddFbLikes'の外のどこかでは、' $( '#fbform')を呼び出すはずだと言います。(submit、function(e){'、何度も繰り返すことができます。また、「one」のドキュメントに加えて、私は既にhttp://api.jquery.com/on/をチェックアウトしています。 –

+1

詳細については、要素が同一であるかそうでないかに関わらず、任意の数のリスナーを持つことができます。あなたのケースでは、 'AddFbLikes'が呼び出されるたびに、見つかった各要素に別のイベントリスナーを追加していました。 –

2

ユーザーがクリックしたときにあなたは、イベントハンドラをバインドするべきではありませんボタン。そのたびに追加のハンドラが追加され、イベントが発生するとカスケードされます。ボックスにチェックを入れてください。あなたがボタンをクリックすると、(デフォルトはtype="submit"ある)type="button"に変更し提出されることからフォームを防止するために

function AddFbLikes() { 
    $("input:checkbox:checked").each(function(idx, val){ 
     callResult(val.value); 
    }); 
} 

<button type="button" id="submit_facebook" onclick="AddFbLikes()" class="btn-primary img-rounded">add selected artists</button> 

通常、あるイベントハンドラを別のイベントハンドラにバインドすることは稀です。最初のイベントが発生したときに2番目のイベントハンドラが条件付きであっても、それに対処するより良い方法は、最初のイベントハンドラに2番目のハンドラがチェックする変数を設定させることです。

+0

OPよりも、私よりも良い答えが出ています。関数呼び出しの中で 'on 'を見ただけで、それ以上は見えず、' one'がそれを解決すると知っていました。 –

+0

@Barmarありがとう。私はあなたの答えを理解していますが、私が得ないものは次のとおりです。私は何度も 'on'を複数回呼び出すと複数のハンドラをアタッチする理由を理解していますが、バインドの中でバインディングを実行するのはどこですか? – zerohedge

+0

'onclick'から呼び出される関数は、イベントハンドラです。 – Barmar

1

ボタンのインラインJavaScriptを取り除き、邪魔にならないようにします。これにより、フォーム送信ハンドラが一度だけ追加されるようになります。

$('#submit_facebook').on('click', function({ 
    //Attach the handler for form submit 
    $('#fbform').on('submit', function(e) { 
     e.preventDefault(); // prevent form submission 
     $("input:checkbox:checked").each(function(idx, val){ 
      callResult(val.value); 
     }); 
    })}  
    //Detatch the event handler for the button click 
    $('#submit_facebook').off('click'); 
}); 

ボタンのHTMLは以下のようになります。AddFbLikes関数を呼び出すために使用されている他のどのようなコード

<button id="submit_facebook" class="btn-primary img-rounded">add selected artists</button> 
+0

私は同意して投票しましたが、上記のブロックをどこに置くことができるのかを言及することを考えてみたいと思います(htmlの後、 'document.ready'ブロックなど)。OPは特にjQueryに精通していません(DjangoはPythonのWebフレームワークですが) –

関連する問題