次のようなアンカータグがあるとしましょう
<a href="#" ng-click="do()">Click</a>
ブラウザーがAngularJSの # に移動しないようにするにはどうすればよいですか?
次のようなアンカータグがあるとしましょう
<a href="#" ng-click="do()">Click</a>
ブラウザーがAngularJSの # に移動しないようにするにはどうすればよいですか?
更新:以来、私はこの解決策について考えを変えました。これにさらに開発と時間を費やした後、この問題に対するより良い解決策は、次のことを行うことだと思います。
<a ng-click="myFunction()">Click Here</a>
そしてcss
、追加のルールを持つように更新します。
a[ng-click]{
cursor: pointer;
}
はるかにシンプルで、まったく同じ機能を提供し、はるかに効率的です。将来、このソリューションを探している他の人に役立つことを願っています。
以下は私の以前のソリューションであり、レガシーな目的のためにここに残しておきます。
この問題が頻繁に発生する場合、この問題を解決する簡単なディレクティブは次のとおりです。
app.directive('a', function() {
return {
restrict: 'E',
link: function(scope, elem, attrs) {
if(attrs.ngClick || attrs.href === '' || attrs.href === '#'){
elem.on('click', function(e){
e.preventDefault();
});
}
}
};
});
すべてのアンカー タグ ( <a></a>
) をチェックして、それらのhref
属性が空の文字列 ( ""
) またはハッシュ ( '#'
) であるかどうか、またはng-click
割り当てがあるかどうかを確認します。これらの条件のいずれかが見つかった場合、イベントをキャッチしてデフォルトの動作を防ぎます。
唯一の欠点は、すべてのアンカー タグに対してこのディレクティブを実行することです。そのため、ページに多数のアンカー タグがあり、少数のアンカー タグに対してのみデフォルトの動作を防止したい場合、このディレクティブはあまり効率的ではありません。ただし、ほとんどの場合preventDefault
、このディレクティブを AngularJS アプリで使用します。
デフォルトの処理が行われないように、$event オブジェクトをメソッドに渡して呼び出す$event.preventDefault()
ことができます。
<a href="#" ng-click="do($event)">Click</a>
// then in your controller.do($event) method
$event.preventDefault()
私は、この種のディレクティブを使用することを好みます。これが例です
<a href="#" ng-click="do()" eat-click>Click Me</a>
そして、次のディレクティブ コードeat-click
:
module.directive('eatClick', function() {
return function(scope, element, attrs) {
$(element).click(function(event) {
event.preventDefault();
});
}
})
eat-click
これで、属性を任意の要素に追加できるようになり、preventDefault()
自動的に 'ed' が取得されます。
利点:
$event
醜いオブジェクトをdo()
関数に渡す必要はありません。$event
オブジェクトをスタブ化する必要がないため、コントローラーの単体テストが容易になります。ルノーは素晴らしい解決策を提供しましたが、
<a href="#" ng-click="do(); $event.preventDefault()">Click</a>
私は個人的に、いくつかの副作用を避けるために、場合によっては $event.stopPropagation() も必要であることを発見しました
<a href="#" ng-click="do(); $event.preventDefault(); $event.stopPropagation();">
Click</a>
私の解決策になります
私が見つけた最も簡単な解決策はこれです:
<a href="#" ng-click="do(); $event.preventDefault()">Click</a>
Web アプリを作成しているのに、なぜリンクが必要なのですか?
アンカーをボタンに交換してください!
<button ng-click="do()"></button>
私が見ることができるこのオプションを試してみてください。これはまだ上にリストされていません:
<a href="" ng-click="do()">Click</a>
href でのイベントを回避する最も安全な方法は、次のように定義することです。
<a href="javascript:void(0)" ....>
私は一緒に行きます:
<a ng-click="do()">Click</a>
これ全体が default を防ぐことが私を混乱させていたので 、Angular がいつどこで default を妨げているかを示すJSFiddleを作成しました。
JSFiddle は Angular の a ディレクティブを使用しているため、まったく同じである必要があります。ここでソースコードを見ることができます:タグのソースコード
これが一部の説明に役立つことを願っています。
ドキュメントを ngHref に投稿したかったのですが、私の評判のためにできません。
または、インラインが必要な場合は、これを行うことができます:
<a href="#" ng-click="show = !show; $event.preventDefault()">Click to show</a>
多くの答えはやり過ぎのようです。私にとって、これはうまくいきます
<a ng-href="#" ng-click="$event.preventDefault();vm.questionContainer($index)">{{question.Verbiage}}</a>
劣化のために href 属性の値が存在する必要があるため (js がオフになっている場合)、空の href 属性 (または "#") を使用することはできませんが、イベント ( e) 変数。私は自分のディレクティブを作成しました:
angular.module('MyApp').directive('clickPrevent', function() {
return function(scope, element, attrs) {
return element.on('click', function(e) {
return e.preventDefault();
});
};
});
HTML の場合:
<a data-click-prevent="true" href="/users/sign_up" ng-click="openSignUpModal()">Sign up</a>
href に移動したくない場合は...マークアップを変更し、アンカータグではなくボタンを使用する必要があります。意味的にはアンカーでもリンクでもないためです。逆に、いくつかのチェックを行ってからリダイレクトするボタンがある場合、それはボタンではなくリンク/アンカー タグにする必要があります... SEO の目的と [ここにテスト スイートを挿入] をテストするためです。
変更を保存するように促したり、ダーティな状態を確認したりするなど、条件付きでのみリダイレクトしたいリンクの場合... ng-click="someFunction($event)" を使用し、validationError preventDefault または stopPropagation の someFunction で使用する必要があります。
また、できるからといって、すべきであるとは限りません。javascript:void(0) は昔はうまく機能していました...しかし、悪意のあるハッカー/クラッカーのせいで、ブラウザーは、href 内で javascript を使用するアプリ/サイトにフラグを立てます...上記のダックタイプの理由を参照してください..
2010年はボタンのように機能するリンクを使用する理由はどこにもないはずなので、2016年です...それでもIE8以下をサポートする必要がある場合は、事業所を再評価する必要があります.
アンギュラー ブートストラップ ドロップダウンにアンカーを使用しているときに、この同じ問題に遭遇しました。望ましくない副作用 (つまり、 preventDefault() を使用しているためにドロップダウンが閉じない) を回避するために私が見つけた唯一の解決策は、次を使用することでした。
<a href="javascript:;" ng-click="do()">Click</a>
あなたがすべきことは、href
属性を完全に省略することです。
element ディレクティブ (Angular コアの一部)のソース コードを見ると、 29 ~ 31 行目に次のように記述されています。a
if (!element.attr(href)) {
event.preventDefault();
}
これは、Angular がすでに href なしのリンクの問題を解決していることを意味します。まだ残っている唯一の問題はcssの問題です。ng-clicks を持つアンカーにポインター スタイルを適用することもできます。
a[ng-click] {
/* Styles for anchors without href but WITH ng-click */
cursor: pointer;
}
したがって、機能を実行するリンクとは微妙に異なるスタイルで実際のリンクをマークすることで、サイトをよりアクセスしやすくすることもできます.
ハッピーコーディング!
代替案は次のとおりです。
<span ng-click="do()">Click</span>