Hãy nói rằng tôi có một thẻ neo như
<a href="#" ng-click="do()">Click</a>
Làm cách nào tôi có thể ngăn trình duyệt điều hướng đến # trong AngularJS ?
href=''
để giữ hành vi con trỏ chuột.
Hãy nói rằng tôi có một thẻ neo như
<a href="#" ng-click="do()">Click</a>
Làm cách nào tôi có thể ngăn trình duyệt điều hướng đến # trong AngularJS ?
href=''
để giữ hành vi con trỏ chuột.
Câu trả lời:
CẬP NHẬT : Tôi đã thay đổi suy nghĩ về giải pháp này. Sau khi phát triển hơn và dành thời gian cho việc này, tôi tin rằng một giải pháp tốt hơn cho vấn đề này là làm như sau:
<a ng-click="myFunction()">Click Here</a>
Và sau đó cập nhật của bạn css
để có một quy tắc bổ sung:
a[ng-click]{
cursor: pointer;
}
Nó đơn giản hơn nhiều và cung cấp chính xác cùng chức năng và hiệu quả hơn nhiều. Hy vọng rằng có thể hữu ích cho bất cứ ai khác tìm kiếm giải pháp này trong tương lai.
Sau đây là giải pháp trước đây của tôi, mà tôi sẽ rời khỏi đây chỉ với mục đích kế thừa:
Nếu bạn đang gặp vấn đề này rất nhiều, một chỉ thị đơn giản sẽ khắc phục vấn đề này là:
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();
});
}
}
};
});
Nó kiểm tra tất cả các thẻ neo ( <a></a>
) để xem liệu href
thuộc tính của chúng là một chuỗi rỗng ( ""
) hay hàm băm ( '#'
) hoặc có một ng-click
phép gán. Nếu nó tìm thấy bất kỳ điều kiện nào trong số này, nó sẽ bắt sự kiện và ngăn hành vi mặc định.
Mặt trái duy nhất là nó chạy lệnh này cho tất cả các thẻ neo. Vì vậy, nếu bạn có nhiều thẻ neo trên trang và bạn chỉ muốn ngăn chặn hành vi mặc định cho một số ít trong số chúng, thì lệnh này không hiệu quả lắm. Tuy nhiên, tôi hầu như luôn muốn preventDefault
, vì vậy tôi sử dụng chỉ thị này trong các ứng dụng AngularJS của mình.
href
thuộc tính trống có hành vi khác nhau trong các trình duyệt khác nhau. Mặc dù tôi đồng ý rằng đây là giải pháp sạch nhất và hiệu quả nhất, nhưng nó có một số vấn đề về trình duyệt chéo. Sử dụng phương pháp chỉ thị cho phép trình duyệt xử lý <a>
thẻ như bình thường, nhưng vẫn nhận được câu trả lời cho OP mà họ đang tìm kiếm.
Theo các tài liệu cho ngHref, bạn sẽ có thể rời khỏi href hoặc do 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 />
Bạn có thể truyền đối tượng $ event cho phương thức của mình và gọi $event.preventDefault()
nó để việc xử lý mặc định sẽ không xảy ra:
<a href="#" ng-click="do($event)">Click</a>
// then in your controller.do($event) method
$event.preventDefault()
$event.preventDefault()
... thuế IE.
ng-click="do(); $event.preventDefault()
ví dụ ... mặc dù vậy, không cần thiết vì câu trả lời của @ Chris dưới đây là phương thức đúng. Điều này có thể giúp mọi người trong tình huống họ đã lồng ngClicks và họ muốn gọi $event.stopPropagation()
, tuy nhiên.
Tôi thích sử dụng các chỉ thị cho loại điều này. Đây là một ví dụ
<a href="#" ng-click="do()" eat-click>Click Me</a>
Và mã lệnh cho eat-click
:
module.directive('eatClick', function() {
return function(scope, element, attrs) {
$(element).click(function(event) {
event.preventDefault();
});
}
})
Bây giờ bạn có thể thêm eat-click
thuộc tính cho bất kỳ phần tử nào và nó sẽ preventDefault()
tự động được chỉnh sửa.
Những lợi ích:
$event
đối tượng xấu xí vào do()
chức năng của mình .$event
đối tượngError: $ is not defined
. Tôi đang thiếu gì?
angular.element(element).bind('click', function(event){...});
. Nó đã làm việc. Tham chiếu: jQLite
Mặc dù Renaud đã đưa ra một giải pháp tuyệt vời
<a href="#" ng-click="do(); $event.preventDefault()">Click</a>
Cá nhân tôi thấy bạn cũng cần $ event.stopPropagation () trong một số trường hợp để tránh một số tác dụng phụ
<a href="#" ng-click="do(); $event.preventDefault(); $event.stopPropagation();">
Click</a>
sẽ là giải pháp của tôi
ng-click="$event.preventDefault()"
Giải pháp đơn giản nhất tôi đã tìm thấy là giải pháp này:
<a href="#" ng-click="do(); $event.preventDefault()">Click</a>
Vì vậy, đọc qua những câu trả lời này, @Chris vẫn có câu trả lời "đúng" nhất, tôi cho rằng, nhưng nó có một vấn đề, nó không hiển thị "con trỏ" ....
Vì vậy, đây là hai cách để giải quyết vấn đề này mà không cần thêm con trỏ: kiểu con trỏ:
Sử dụng javascript:void(0)
thay vì #
:
<a href="javascript:void(0)" ng-click="doSomething()">Do Something</a>
Sử dụng $event.preventDefault()
trong ng-click
chỉ thị (để bạn không bỏ qua bộ điều khiển của mình với các tham chiếu liên quan đến DOM):
<a href="#dontGoHere" ng-click="doSomething(); $event.preventDefault()">Do Something</a>
Cá nhân tôi thích cái trước hơn cái sau. javascript:void(0)
có những lợi ích khác được thảo luận ở đây . Ngoài ra còn có cuộc thảo luận về "JavaScript không phô trương" trong liên kết gần đây đáng sợ và không nhất thiết phải áp dụng trực tiếp cho một ứng dụng góc cạnh.
javascript:;
Bạn có thể làm như sau
1.Remove href
thuộc tính từ neo (a
thẻ )
2. Đặt con trỏ con trỏ trong css để ng nhấp vào phần tử
[ng-click],
[data-ng-click],
[x-ng-click] {
cursor: pointer;
}
HTML
Ở đây, angularjs thuần túy: gần chức năng ng-click, bạn có thể viết hàm ngăn chặnDefDef () bằng cách tách dấu chấm phẩy
<a href="#" ng-click="do(); $event.preventDefault(); $event.stopPropagation();">Click me</a>
Mã não
$scope.do = function() {
alert("do here anything..");
}
(hoặc là)
bạn có thể tiến hành theo cách này, điều này đã được thảo luận ở đây.
HTML
<a href="#" ng-click="do()">Click me</a>
Mã não
$scope.do = function(event) {
event.preventDefault();
event.stopPropagation()
}
Vì bạn đang làm một ứng dụng web tại sao bạn cần liên kết?
Trao đổi neo của bạn để các nút!
<button ng-click="do()"></button>
Cách an toàn nhất để tránh các sự kiện trên an href sẽ là xác định nó là
<a href="javascript:void(0)" ....>
Tôi sẽ đi với:
<a ng-click="do()">Click</a>
Toàn bộ điều này ngăn chặn điều mặc định đã gây nhầm lẫn cho tôi, vì vậy tôi đã tạo ra một JSFiddle ở đó minh họa khi nào và nơi Angular đang ngăn chặn mặc định .
JSFiddle đang sử dụng một lệnh của Angular - vì vậy nó phải chính xác như vậy. Bạn có thể xem mã nguồn ở đây: mã nguồn thẻ
Tôi hy vọng điều này sẽ giúp làm rõ cho một số.
Tôi muốn đăng tài liệu lên ngHref nhưng tôi không thể vì danh tiếng của mình.
Rất nhiều câu trả lời dường như là quá mức cần thiết. CHO TÔI, công việc này
<a ng-href="#" ng-click="$event.preventDefault();vm.questionContainer($index)">{{question.Verbiage}}</a>
Tôi cần sự hiện diện của giá trị thuộc tính href cho sự xuống cấp (khi tắt js), vì vậy tôi không thể sử dụng thuộc tính blank href (hoặc "#"), nhưng mã ở trên không hoạt động với tôi, vì tôi cần một sự kiện ( e) biến. Tôi đã tạo ra chỉ thị của riêng mình:
angular.module('MyApp').directive('clickPrevent', function() {
return function(scope, element, attrs) {
return element.on('click', function(e) {
return e.preventDefault();
});
};
});
Trong HTML:
<a data-click-prevent="true" href="/users/sign_up" ng-click="openSignUpModal()">Sign up</a>
Mượn từ câu trả lời của tennisgent. Tôi thích rằng bạn không phải tạo một chỉ thị tùy chỉnh để thêm vào tất cả các liên kết. Tuy nhiên, tôi không thể khiến anh ấy làm việc trong IE8. Đây là những gì cuối cùng đã làm việc cho tôi (sử dụng góc 1.0.6).
Lưu ý rằng 'bind' cho phép bạn sử dụng jqLite được cung cấp bởi angular nên không cần phải bọc với jQuery đầy đủ. Cũng yêu cầu phương pháp stopPropogation.
.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
, tôi muốn tuyên truyền nhưng không phải là hành vi mặc định. Đoạn trích này KHÔNG được khuyến khích.
Tôi gặp vấn đề tương tự khi sử dụng neo cho một bootstrap góc cạnh thả xuống. Giải pháp duy nhất tôi thấy rằng đã tránh được các tác dụng phụ không mong muốn (ví dụ: thả xuống không đóng vì sử dụng ngăn chặnDefault ()) là sử dụng như sau:
<a href="javascript:;" ng-click="do()">Click</a>
nếu bạn không bao giờ muốn truy cập ... bạn nên thay đổi đánh dấu của mình và sử dụng nút không phải là thẻ neo vì về mặt ngữ nghĩa, đó không phải là neo hoặc liên kết. Ngược lại, nếu bạn có một nút thực hiện một số kiểm tra và sau đó chuyển hướng thì đó phải là một thẻ liên kết / neo và không phải là nút ... cho mục đích SEO cũng như thử nghiệm [chèn bộ kiểm tra tại đây].
đối với các liên kết mà bạn chỉ muốn chuyển hướng có điều kiện như nhắc nhở để lưu các thay đổi hoặc thừa nhận trạng thái bẩn ... bạn nên sử dụng ng-click = "someFunction ($ event)" và trong một số chức năng trên xác thực của bạnError ngăn chặn Lỗi và hoặc dừng hoạt động.
cũng chỉ vì bạn không có nghĩa là bạn nên . javascript: void (0) hoạt động tốt trở lại trong ngày ... nhưng vì các tin tặc / cracker bất hợp pháp trình duyệt các ứng dụng / trang web sử dụng javascript trong an href ... không thấy lý do gì để vịt ở trên ..
Đó là năm 2016 kể từ năm 2010, không có lý do gì để sử dụng các liên kết hoạt động như các nút ... nếu bạn vẫn phải hỗ trợ IE8 và bên dưới, bạn cần đánh giá lại địa điểm kinh doanh của mình.
/* NG CLICK PREVENT DEFAULT */
app.directive('ngClick', function () {
return {
link: function (scope, element, attributes) {
element.click(function (event) {
event.preventDefault();
event.stopPropagation();
});
}
};
});
Những gì bạn nên làm, là bỏ href
hoàn toàn thuộc tính.
Nếu bạn xem mã nguồn của a
chỉ thị phần tử (là một phần của lõi Angular), thì nó nêu ở dòng 29 - 31:
if (!element.attr(href)) {
event.preventDefault();
}
Điều đó có nghĩa là Angular đã giải quyết vấn đề liên kết mà không có a href. Vấn đề duy nhất bạn vẫn có là vấn đề css. Bạn vẫn có thể áp dụng kiểu con trỏ cho các neo có ng-click, ví dụ:
a[ng-click] {
/* Styles for anchors without href but WITH ng-click */
cursor: pointer;
}
Vì vậy, bạn thậm chí có thể làm cho trang web của mình dễ truy cập hơn bằng cách đánh dấu các liên kết thực với kiểu dáng tinh tế, khác biệt sau đó liên kết thực hiện các chức năng.
Chúc mừng mã hóa!
Bạn có thể vô hiệu hóa chuyển hướng url bên trong Html5Mode của $ location để đạt được mục tiêu. Bạn có thể xác định nó bên trong bộ điều khiển cụ thể được sử dụng cho trang. Một cái gì đó như thế này:
app.config(['$locationProvider', function ($locationProvider) {
$locationProvider.html5Mode({
enabled: true,
rewriteLinks: false,
requireBase: false
});
}]);
Nếu bạn đang sử dụng Angular 8 trở lên, bạn có thể tạo một lệnh:
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();
}
}
Trên thẻ neo của bạn trên thành phần, bạn có thể nối nó như thế này:
<a ngbDropdownToggle preventDefault class="nav-link dropdown-toggle" href="#" aria-expanded="false" aria-haspopup="true" id="nav-dropdown-2">Pages</a>
Mô-đun ứng dụng nên có tuyên bố của nó:
import { PreventDefaultDirective } from './shared/directives/preventdefault.directive';
@NgModule({
declarations: [
AppComponent,
PreventDefaultDirective
Một sự thay thế có thể là:
<span ng-click="do()">Click</span>
span
mục đích nhấp chuột. Chỉ cần đi tới câu trả lời của @ tennisgent - neo mà không href
được xác định.
href
.