2017-01-10 12 views
0

後、私はそれに2つのクリックハンドラを持つボタンがあります。JavaScriptのクリックイベントの確認ダイアログ

  1. は、アクションを確認するために、ユーザーにネイティブJavaScriptの確認ダイアログを表示します。
  2. 一部の属性を別のフォーム要素に設定し、そのフォームを送信します。

彼らはjQueryのベースだと次のようになります。

$('[data-confirm]').on('click', function (e) { 
    if (! confirm($(this).data('confirm')) { 
    e.preventDefault(); 
    e.stopImmediatePropagation(); 
    } 
}); 

$('.js-remove-item').on('click', function (e) { 
    e.preventDefault(); 

    console.log('clicked'); 

    var $form = $('#remove-item-form'); 

    $form.attr('action', $(this).data('url')); 
    $form.submit(); 
}); 

ボタンHTMLは次のようになります。

<button type="button" 
     class="btn btn-primary js-remove-item" 
     data-confirm="Are you sure you want to remove this item?"> 

しかし、コンソールログを確認するダイアログとして「クリック」表示されています。ユーザーがの場合は、そのイベントリスナーが起動するのは、のアクションを確認するだけです。

どうすればいいですか?

+1

なぜ2つの異なるクリックハンドラーで確認とコードがありますか? 2回のクリックで問題が発生するのは、送信者が送信前に登録する必要があるということです。 – epascarello

+0

'[data-confirm]'クリックハンドラが '.js-remove-item'クリックハンドラの前に定義されている限り、あなたのコードは[ここ](https://jsfiddle.net/6hs9nd50/)で動作しています。 –

+0

idkなぜあなたのコードはうまくいかないのですが、私は確認の要素にフラグを追加します: 'if(確認)$(this).data("確認済み "、true)'そして、彼らは別のコンポーネントなので、ハンドラ –

答えて

0

これを解決する方法を見つけました。

「アイテムを削除」ロジックでは、クラスをボタン自体に追加するのではなく、親エレメントに追加しました。バブリングを使用すると、ボタン自体のすべてのリスナーがトリガーされることを意味します(確認ダイアログ)。そのイベントが伝播すると、それは "remove item"クラス名とロジックがバインドされている親クラスに通知されます。

関連する問題