ধরা যাক আমার কাছে একটি অ্যাঙ্কর ট্যাগ রয়েছে
<a href="#" ng-click="do()">Click</a>
অ্যাঙ্গুলারজেএস- এ ব্রাউজারটিকে # এ যাওয়াতে কীভাবে আমি আটকাতে পারি ?
href=''
মাউস পয়েন্টার আচরণ রাখতে ব্যবহার করে।
ধরা যাক আমার কাছে একটি অ্যাঙ্কর ট্যাগ রয়েছে
<a href="#" ng-click="do()">Click</a>
অ্যাঙ্গুলারজেএস- এ ব্রাউজারটিকে # এ যাওয়াতে কীভাবে আমি আটকাতে পারি ?
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
কার্যনির্বাহী রয়েছে কিনা to যদি এটি এর মধ্যে কোনও শর্তাদি খুঁজে পায় তবে এটি ইভেন্টটি ধরে এবং ডিফল্ট আচরণকে বাধা দেয়।
একমাত্র নীচের দিকটি হ'ল এটি সমস্ত অ্যাঙ্কর ট্যাগের জন্য এই নির্দেশকে চালিত করে। সুতরাং পৃষ্ঠাটিতে যদি আপনার কাছে অনেকগুলি অ্যাঙ্কর ট্যাগ থাকে এবং আপনি কেবলমাত্র তাদের মধ্যে অল্প সংখ্যক জন্যই ডিফল্ট আচরণ রোধ করতে চান, তবে এই নির্দেশটি খুব কার্যকর নয়। যাইহোক, আমি প্রায় সবসময়ই চাই preventDefault
, তাই আমি আমার অ্যাংুলারজেএস অ্যাপ্লিকেশনগুলিতে এই নির্দেশটি ব্যবহার করি।
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()
আইই 8 এবং নীচে এখনও আইই ট্যাক্স প্রয়োজন।
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){...});
। এটা কাজ করেছে. রেফ: জেকিউএলাইট
যদিও রেনেউদ দুর্দান্ত সমাধান দিয়েছিলেন
<a href="#" ng-click="do(); $event.preventDefault()">Click</a>
কিছুটা পার্শ্ব প্রতিক্রিয়া এড়াতে আপনার ব্যক্তিগতভাবে আমারও দরকার $ ইভেন্ট.স্টপপ্রপাগেশন ()
<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
ডিরেক্টিভের (তাই আপনি DOM সংক্রান্ত রেফারেন্স সঙ্গে আপনার নিয়ামক আপ আবর্জনা না):
<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>
পুরো এই প্রতিরোধ ডিফল্ট জিনিসটি আমার কাছে বিভ্রান্তিকর হয়ে পড়েছে, তাই আমি একটি জেএসফিটাল তৈরি করেছি যেখানে চিত্রিত হয়েছে কখন এবং কোথায় অ্যাংুলার ডিফল্টকে আটকাচ্ছে ।
জেএসফিডাল অ্যাংুলারকে একটি নির্দেশিকা ব্যবহার করছে - সুতরাং এটি অবশ্যই একই রকম হওয়া উচিত। আপনি এখানে সোর্স কোড দেখতে পারেন: একটি ট্যাগ উত্স কোড
আমি আশা করি এটি কারওর জন্য স্পষ্ট করতে সহায়তা করবে।
আমি এনজিআরএফের কাছে ডকটি পোস্ট করতে পছন্দ করতাম তবে আমার খ্যাতির কারণে আমি তা করতে পারি না।
প্রচুর উত্তর ওভারকিল বলে মনে হচ্ছে। আমার জন্য, এটি কাজ করে
<a ng-href="#" ng-click="$event.preventDefault();vm.questionContainer($index)">{{question.Verbiage}}</a>
অবক্ষয়ের জন্য আমার href অ্যাট্রিবিউটর মানটির উপস্থিতি প্রয়োজন (যখন জেএস বন্ধ করা থাকে), তাই আমি খালি href অ্যাট্রিবিউট (বা "#") ব্যবহার করতে পারি না, তবে উপরের কোডটি আমার পক্ষে কাজ করে না, কারণ আমার একটি ইভেন্টের প্রয়োজন ( e) পরিবর্তনশীল। আমি আমার নিজস্ব নির্দেশ তৈরি করেছি:
angular.module('MyApp').directive('clickPrevent', function() {
return function(scope, element, attrs) {
return element.on('click', function(e) {
return e.preventDefault();
});
};
});
এইচটিএমএলে:
<a data-click-prevent="true" href="/users/sign_up" ng-click="openSignUpModal()">Sign up</a>
টেনিসেন্টের উত্তর থেকে .ণ নেওয়া। আমি পছন্দ করি যে আপনাকে সমস্ত লিঙ্কে যুক্ত করার জন্য কাস্টম নির্দেশিকা তৈরি করতে হবে না। তবে আমি তাকে আইই 8 তে কাজ করতে পারি না get অবশেষে আমার জন্য কী কাজ করেছে তা এখানে রয়েছে (কৌনিক 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
প্রচারটি চাই তবে ডিফল্ট আচরণ নয়। এই স্নিপেট সুপারিশ করা হয় না ।
কৌণিক বুটস্ট্র্যাপ ড্রপ ডাউনের জন্য অ্যাঙ্কারগুলি ব্যবহার করার সময় আমি এই একই সমস্যার মধ্যে পড়েছিলাম। আমি একমাত্র সমাধানের মধ্যে দেখতে পেলাম যে অযাচিত পার্শ্ব প্রতিক্রিয়াগুলি এড়ানো হয়েছে (যেমন, প্রতিরোধক ডিফল্ট () ব্যবহারের কারণে ড্রপ ডাউন বন্ধ হচ্ছে না) নিম্নলিখিতটি ব্যবহার করা ছিল:
<a href="javascript:;" ng-click="do()">Click</a>
আপনি যদি কখনও হেরেফে যেতে না চান ... আপনার মার্কআপটি পরিবর্তন করা উচিত এবং অ্যাঙ্কর ট্যাগ নয় এমন একটি বোতাম ব্যবহার করা উচিত কারণ শব্দার্থগতভাবে এটি কোনও অ্যাঙ্কর বা কোনও লিঙ্ক নয়। বিপরীতভাবে যদি আপনার কাছে এমন কিছু বোতাম থাকে যা কিছু পরীক্ষা করে থাকে এবং তারপরে পুনঃনির্দেশ করে তবে এটি SEO এর উদ্দেশ্যে পরীক্ষার জন্য এখানে পরীক্ষার স্যুট প্রবেশ করুন] লিংক / অ্যাঙ্কর ট্যাগ এবং একটি বোতাম নয়।
যে লিঙ্কগুলির জন্য আপনি কেবল শর্তাধীনভাবে পরিবর্তনগুলি সংরক্ষণ করার অনুরোধ জানাতে বা নোংরা অবস্থা স্বীকার করার মতো পুনঃনির্দেশ করতে চান ... আপনার এনজি-ক্লিক = "কিছু ফাংশন ($ ইভেন্ট)" ব্যবহার করা উচিত এবং আপনার বৈধতার কিছুটা ফাংশনে অরর রোধক ডিফল্ট এবং বা স্টপপ্রোপেশন।
এছাড়াও কেবল কারণ আপনার অর্থ হওয়া উচিত নয় । জাভাস্ক্রিপ্ট: অকার্যকর (0) দিনের খুব ভাল কাজ করেছিল ... তবে নেফেরিয়াস হ্যাকার / ক্র্যাকার্স ব্রাউজারগুলি ফ্ল্যাশ অ্যাপস / সাইটগুলির জন্য যা একটি href এর মধ্যে জাভাস্ক্রিপ্ট ব্যবহার করে ... উপরের হাঁস টাইপ করার কোনও কারণ দেখুন না ..
২০১০ এর পর থেকে ২০১০ এর বোতামগুলির মতো কাজ করে এমন লিঙ্কগুলি ব্যবহার করার কোনও কারণ নেই ... যদি আপনার এখনও আইই 8 সমর্থন করতে হয় এবং নীচে আপনার ব্যবসায়ের স্থানটি পুনরায় মূল্যায়ন করতে হবে।
/* 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 - 31 রেখায় উল্লেখ করেছে:
if (!element.attr(href)) {
event.preventDefault();
}
যার অর্থ অ্যাংুলার ইতিমধ্যে কোনও href ছাড়াই লিঙ্কগুলির সমস্যা সমাধান করছে। আপনার কাছে এখনও একমাত্র সমস্যা হ'ল সিএসএস সমস্যা। আপনি এখনও এনজি-ক্লিক রয়েছে এমন অ্যাঙ্করগুলিতে পয়েন্টার স্টাইল প্রয়োগ করতে পারেন, যেমন:
a[ng-click] {
/* Styles for anchors without href but WITH ng-click */
cursor: pointer;
}
সুতরাং, আপনি সূক্ষ্ম, বিভিন্ন স্টাইলিং এর সাথে ফাংশন সম্পাদনকারী লিঙ্কগুলির সাথে বাস্তব লিঙ্কগুলি চিহ্নিত করে এমনকি আপনার সাইটটিকে আরও অ্যাক্সেসযোগ্য করে তুলতে পারেন।
শুভ কোডিং!
আপনি উদ্দেশ্যটি অর্জন করতে $ অবস্থানের এইচটিএমএল 5 মডেলের ভিতরে 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
।