ここでは、異なるソリューション セットで 2 つの問題が発生する可能性があります。
- リスナーは、本来あるべきものとは逆に、さまざまな要素にアタッチされています
- リスナーは同じ要素にアタッチされています
さまざまな要素
ハンドラーが順不同です。e.stopPropogation() が内側 (子) 要素にあり、$.post() 呼び出しが外側 (親) 要素にあるように交換してください。
同じ要素
リスナーが同じ要素にある場合、e.stopPropogation() も e.preventDefault() も、イベント リスナーが同じ要素で引き続き起動するため、希望どおりに動作しません。
ストッププロポゲーション()
説明: イベントが DOM ツリーをバブリングしないようにして、親ハンドラーにイベントが通知されないようにします。
DOM レベル 2 仕様に従った伝播では、同じ要素のすべてのリスナーが引き続き実行されますが、親に関連付けられたイベントは実行されません。
キャプチャーする EventListener が、イベントのそれ以上の処理が発生するのを防ぎたい場合は、Event インターフェースの stopProgagation メソッドを呼び出すことができます。これにより、イベントのそれ以上のディスパッチが防止されますが、同じ階層レベルで登録された追加の EventListeners は引き続きイベントを受け取ります。
preventDefault()
説明: このメソッドが呼び出された場合、イベントのデフォルト アクションはトリガーされません。
デフォルトのアクションは、どの要素が処理されているか ( W3C )に基づいています。リンクの場合、これは href="" 値へのリダイレクト、それにフォーカスする入力要素などになります。「デフォルトの動作」ではない可能性が高いため、これはあなたが望むものではありません。
1 つのオプションは、$.post を呼び出すハンドラーを DOM の上位にある要素にアタッチすることです。
$('.follow').parent().click(function(e){e.stopPropogation()})
イベントをアタッチするための内部 (子) 要素と外部 (親) 要素を持つように、ターゲット HTML を変更する必要がある場合があります。目標は、$.post ハンドラーをアウター (親) として、インナー (子) ハンドラーでイベントをキャンセルすることです。
別のオプションは、要素に他のクラスが存在するかどうかを確認するチェックを追加することです。
$('.follow').click(function(){
var myself = $(this);
if(!$(this).hasClass('.auth')){
var data = {
id: this.getAttribute('data-id')
}
$.post('/users/setFriend', data, function(msg){
myself.text(msg);
myself.attr('data-status-friends', (myself.attr('data-status- friends').toLowerCase() == 'follow') ? 'following' : 'follow');
});
}
});