मान लीजिए कि मेरे पास एक एंकर टैग है जैसे कि
<a href="#" ng-click="do()">Click</a>
मैं AngularJS में ब्राउज़र को # नेविगेट करने से कैसे रोक सकता हूं ?
href=''
माउस पॉइंटर व्यवहार रखने के लिए उपयोग करें।
मान लीजिए कि मेरे पास एक एंकर टैग है जैसे कि
<a href="#" ng-click="do()">Click</a>
मैं AngularJS में ब्राउज़र को # नेविगेट करने से कैसे रोक सकता हूं ?
href=''
माउस पॉइंटर व्यवहार रखने के लिए उपयोग करें।
जवाबों:
अद्यतन : मैंने इस समाधान पर अपना विचार बदल दिया है। इस पर काम करने में अधिक विकास और समय बीतने के बाद, मेरा मानना है कि इस समस्या का एक बेहतर समाधान निम्नलिखित है:
<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 ऐप्स में इस निर्देश का उपयोग करता हूँ।
href
विशेषता रखने से विभिन्न ब्राउज़रों में अलग-अलग व्यवहार होता है। हालांकि मैं मानता हूं कि यह अब तक सबसे साफ और सबसे कुशल समाधान है, इसमें कुछ क्रॉस-ब्राउज़र समस्याएँ हैं। निर्देशात्मक दृष्टिकोण का उपयोग करके ब्राउज़र को <a>
टैग को सामान्य रूप से संभालने की अनुमति देता है , लेकिन फिर भी ओपी को वह उत्तर मिल रहा है जिसकी उन्हें तलाश थी।
डॉक्स के लिए ngHref के अनुसार आपको href छोड़ना चाहिए या href = "" करना चाहिए।
<input ng-model="value" /><br />
<a id="link-1" href ng-click="value = 1">link 1</a> (link, don't reload)<br />
<a id="link-2" href="" ng-click="value = 2">link 2</a> (link, don't reload)<br />
<a id="link-4" href="" name="xx" ng-click="value = 4">anchor</a> (link, don't reload)<br />
<a id="link-5" name="xxx" ng-click="value = 5">anchor</a> (no link)<br />
आप अपने ईवेंट में $ ईवेंट ऑब्जेक्ट को पास कर सकते हैं, और $event.preventDefault()
उस पर कॉल कर सकते हैं, ताकि डिफ़ॉल्ट प्रोसेसिंग न हो:
<a href="#" ng-click="do($event)">Click</a>
// then in your controller.do($event) method
$event.preventDefault()
$event.preventDefault()
... IE कर की आवश्यकता है ।
ng-click="do(); $event.preventDefault()
उदाहरण के लिए ... हालांकि, यह आवश्यक नहीं है क्योंकि @ क्रिस का जवाब नीचे सही है। इससे लोगों को उन स्थितियों में मदद मिल सकती है, जहां उनके पास नेक्स्टिक्स हैं और वे कॉल करना चाहते हैं $event.stopPropagation()
, हालांकि।
मैं इस तरह की चीजों के लिए निर्देश का उपयोग करना पसंद करता हूं । यहाँ एक उदाहरण है
<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()
स्वतः ही एड हो जाएगा।
लाभ:
$event
अपने do()
कार्य में बदसूरत वस्तु को पास नहीं करना है ।$event
ऑब्जेक्ट को स्टब करने की आवश्यकता नहीं हैError: $ is not defined
। मैं क्या खो रहा हूँ?
angular.element(element).bind('click', function(event){...});
। इसने काम कर दिया। Ref: jQLite
यद्यपि रेनॉड ने एक महान समाधान दिया
<a href="#" ng-click="do(); $event.preventDefault()">Click</a>
मैंने व्यक्तिगत रूप से पाया है कि कुछ मामलों में कुछ दुष्प्रभावों से बचने के लिए आपको $ event.stopPropagation () की आवश्यकता है
<a href="#" ng-click="do(); $event.preventDefault(); $event.stopPropagation();">
Click</a>
मेरा समाधान होगा
ng-click="$event.preventDefault()"
सबसे आसान समाधान जो मैंने पाया है वह यह है:
<a href="#" ng-click="do(); $event.preventDefault()">Click</a>
इसलिए इन उत्तरों को पढ़ते हुए, @ क्रिस के पास अभी भी सबसे "सही" उत्तर है, मुझे लगता है, लेकिन इसकी एक समस्या है, यह "पॉइंटर" नहीं दिखाता है ...।
तो यहाँ एक कर्सर जोड़ने की आवश्यकता के बिना इस समस्या को हल करने के दो तरीके हैं: सूचक शैली:
javascript:void(0)
इसके बजाय का उपयोग करें #
:
<a href="javascript:void(0)" ng-click="doSomething()">Do Something</a>
निर्देश $event.preventDefault()
में उपयोग करें ng-click
(ताकि आप डोम-संबंधित संदर्भों के साथ अपने नियंत्रक को रद्दी न करें):
<a href="#dontGoHere" ng-click="doSomething(); $event.preventDefault()">Do Something</a>
व्यक्तिगत रूप से मैं पहले वाले को पसंद करता हूं। javascript:void(0)
अन्य लाभ हैं जिनकी चर्चा यहाँ की गई है । उस लिंक में "विनीत जावास्क्रिप्ट" की भी चर्चा है, जो हाल ही में भयावह है, और जरूरी नहीं कि यह सीधे एक एंग्री एप्लिकेशन पर लागू हो।
javascript:;
एचटीएमएल
यहाँ शुद्ध कोणीयज: एनसी-क्लिक फ़ंक्शन के पास आप सेम्पोलोन को अलग करके रोका डिफॉल्ट () फ़ंक्शन लिख सकते हैं
<a href="#" ng-click="do(); $event.preventDefault(); $event.stopPropagation();">Click me</a>
जे एस
$scope.do = function() {
alert("do here anything..");
}
(या)
आप इस तरह से आगे बढ़ सकते हैं, यह पहले से ही यहां पर चर्चा कर रहा है।
एचटीएमएल
<a href="#" ng-click="do()">Click me</a>
जे एस
$scope.do = function(event) {
event.preventDefault();
event.stopPropagation()
}
चूंकि आप एक वेब ऐप बना रहे हैं, इसलिए आपको लिंक की आवश्यकता क्यों है?
बटन के लिए अपने एंकर स्वैप!
<button ng-click="do()"></button>
एक href पर घटनाओं से बचने का सबसे सुरक्षित तरीका इसे परिभाषित करना होगा
<a href="javascript:void(0)" ....>
मैं साथ जाऊंगा:
<a ng-click="do()">Click</a>
यह पूरी तरह से डिफ़ॉल्ट बात मेरे लिए भ्रामक रही है, इसलिए मैंने एक जेएसफिल्ड बनाया है, जिसमें स्पष्ट है कि कब और कहां कोणीय डिफ़ॉल्ट को रोक सकता है ।
JSFiddle एंगुलर के एक निर्देश का उपयोग कर रही है - इसलिए यह बिल्कुल समान होना चाहिए। आप यहाँ स्रोत कोड देख सकते हैं: एक टैग स्रोत कोड
मुझे उम्मीद है कि यह कुछ के लिए स्पष्टीकरण में मदद करेगा।
मैं doc को ngHref पर पोस्ट करना पसंद करता लेकिन मैं अपनी प्रतिष्ठा के कारण नहीं कर सकता।
जवाब के बहुत सारे overkill लग रहे हैं। मेरे लिए, यह काम करता है
<a ng-href="#" ng-click="$event.preventDefault();vm.questionContainer($index)">{{question.Verbiage}}</a>
मुझे गिरावट (जब js बंद है) के लिए href विशेषता के मान की उपस्थिति की आवश्यकता है, इसलिए मैं खाली href विशेषता (या "#") का उपयोग नहीं कर सकता, लेकिन ऊपर दिए गए कोड ने मेरे लिए काम नहीं किया, क्योंकि मुझे एक घटना की आवश्यकता है ( ई) चर। मैंने अपना स्वयं का निर्देश बनाया:
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>
टेनिस के जवाब से उधार लेना। मुझे पसंद है कि आपको सभी लिंक को जोड़ने के लिए एक कस्टम निर्देश बनाने की आवश्यकता नहीं है। हालाँकि, मैं अपने IE8 में काम नहीं कर सका। यहाँ आखिरकार मेरे लिए क्या काम किया (कोणीय 1.0.6 का उपयोग करके)।
ध्यान दें कि 'बाइंड' आपको कोणीय द्वारा प्रदान किए गए jqLite का उपयोग करने की अनुमति देता है ताकि पूर्ण jQuery के साथ लपेटने की आवश्यकता न हो। स्टॉपप्रोपोगेशन विधि की भी आवश्यकता है।
.directive('a', [
function() {
return {
restrict: 'E',
link: function(scope, elem, attrs) {
elem.bind('click', function(e){
if (attrs.ngClick || attrs.href === '' || attrs.href == '#'){
e.preventDefault();
e.stopPropagation();
}
})
}
};
}
])
dropdown
प्रचार चाहता हूं लेकिन डिफ़ॉल्ट व्यवहार नहीं। यह स्निपेट अनुशंसित नहीं है ।
यदि आप कभी भी href पर नहीं जाना चाहते हैं ... तो आपको अपना मार्कअप बदलना चाहिए और एक बटन का प्रयोग करना चाहिए न कि एंकर टैग का क्योंकि शब्दार्थ यह एंकर या लिंक नहीं है। इसके विपरीत यदि आपके पास एक बटन है जो कुछ जांच करता है और फिर इसे पुनर्निर्देशित करता है तो यह एक लिंक / एंकर टैग होना चाहिए और एक बटन नहीं होना चाहिए ... एसईओ प्रयोजनों के लिए [यहां टेस्ट सूट सम्मिलित करें]।
उन लिंक्स के लिए जिन्हें आप केवल परिवर्तनों को सहेजने के लिए सशर्त रूप से पुनर्निर्देशित करना चाहते हैं, या गंदे राज्य को स्वीकार करना चाहते हैं ... आपको एनजी-क्लिक = "someFunction ($ घटना)" का उपयोग करना चाहिए और कुछ में अपने सत्यापन पर रोकेंDefault या रोकें।
यह भी सिर्फ इसलिए कि आप मतलब यह नहीं है कर सकते हैं करना चाहिए । जावास्क्रिप्ट: शून्य (0) दिन में अच्छी तरह से वापस काम किया ... लेकिन दकियानूसी हैकर्स / पटाखे ब्राउज़रों के फ्लैग एप्स / साइट्स के कारण जो जावास्क्रिप्ट के माध्यम से जावास्क्रिप्ट का उपयोग करते हैं ... ऊपर बत्तख का कोई कारण नहीं देखते हैं।
यह २०१६ से २०१० के बाद से बटन की तरह काम करने वाले लिंक का उपयोग करने का कोई कारण नहीं होना चाहिए ... यदि आपको अभी भी IE8 का समर्थन करना है और नीचे आपको अपने व्यवसाय के स्थान का पुनर्मूल्यांकन करने की आवश्यकता है।
/* NG CLICK PREVENT DEFAULT */
app.directive('ngClick', function () {
return {
link: function (scope, element, attributes) {
element.click(function (event) {
event.preventDefault();
event.stopPropagation();
});
}
};
});
आपको क्या करना चाहिए, यह href
पूरी तरह से विशेषता है।
यदि आप तत्व निर्देश के लिए स्रोत कोड को देखते हैं a
(जो कोणीय कोर का एक हिस्सा है), तो यह लाइन 29 पर स्थित है -
if (!element.attr(href)) {
event.preventDefault();
}
जिसका मतलब है कि कोणीय पहले ही बिना किसी href के लिंक के मुद्दे को हल कर रहा है। आपके पास अभी भी एकमात्र समस्या सीएसएस समस्या है। आप एंकर को पॉइंटर स्टाइल लागू कर सकते हैं, जिसमें एनजी-क्लिक हैं, जैसे:
a[ng-click] {
/* Styles for anchors without href but WITH ng-click */
cursor: pointer;
}
तो, आप अपनी साइट को सूक्ष्म, विभिन्न स्टाइल के साथ वास्तविक लिंक को चिह्नित करके और अधिक सुलभ बना सकते हैं, फिर लिंक जो कार्य करते हैं।
हैप्पी कोडिंग!
आप उद्देश्य को प्राप्त करने के लिए $ स्थान के Html5Mode के अंदर url पुनर्निर्देशन को अक्षम कर सकते हैं। आप इसे पृष्ठ के लिए उपयोग किए गए विशिष्ट नियंत्रक के अंदर परिभाषित कर सकते हैं। कुछ इस तरह:
app.config(['$locationProvider', function ($locationProvider) {
$locationProvider.html5Mode({
enabled: true,
rewriteLinks: false,
requireBase: false
});
}]);
यदि आप कोणीय 8 या अधिक का उपयोग कर रहे हैं तो आप एक निर्देश बना सकते हैं:
import { Directive, HostListener } from '@angular/core';
@Directive({
selector: '[preventDefault]'
})
export class PreventDefaultDirective {
@HostListener("click", ["$event"])
public onClick(event: any): void
{
console.log('click');
debugger;
event.preventDefault();
}
}
घटक पर अपने एंकर टैग पर आप इसे इस तरह से तार कर सकते हैं:
<a ngbDropdownToggle preventDefault class="nav-link dropdown-toggle" href="#" aria-expanded="false" aria-haspopup="true" id="nav-dropdown-2">Pages</a>
ऐप मॉड्यूल में इसकी घोषणा होनी चाहिए:
import { PreventDefaultDirective } from './shared/directives/preventdefault.directive';
@NgModule({
declarations: [
AppComponent,
PreventDefaultDirective
एक विकल्प हो सकता है:
<span ng-click="do()">Click</span>
span
उद्देश्यों को क्लिक करने के लिए दुर्व्यवहार करना भयानक अभ्यास है। बस href
परिभाषित किए बिना @ टेनिस के जवाब - एंकर के लिए जाएं ।
href
।