Cách kích hoạt ngClick theo lập trình


101

Tôi muốn kích hoạt ng-clickmột phần tử trong thời gian chạy như:

_ele.click();

HOẶC LÀ

_ele.trigger('click', function());

Điều này có thể giải quyết như thế nào?


4
Không, tôi muốn biết cơ chế mà qua đó tôi có thể kích hoạt ng-click theo cách thủ công.
mulla.azzi

Câu trả lời:


182

Cú pháp như sau:

function clickOnUpload() {
  $timeout(function() {
    angular.element('#myselector').triggerHandler('click');
  });
};

// Using Angular Extend
angular.extend($scope, {
  clickOnUpload: clickOnUpload
});

// OR Using scope directly
$scope.clickOnUpload = clickOnUpload;

Thông tin thêm về cách mở rộng Angular tại đây .

Nếu bạn đang sử dụng phiên bản cũ của angle , bạn nên sử dụng trigger thay vì triggerHandler .

Nếu cần áp dụng phương pháp ngừng truyền giống, bạn có thể sử dụng phương pháp này như sau:

<a id="myselector" ng-click="clickOnUpload(); $event.stopPropagation();">
  Something
</a>

4
bạn đang sử dụng phiên bản góc nào. triggerHandler dường như hoạt động tốt trong 1.2.1: jsfiddle.net/t34z7
Blago

13
vui lòng giải thích tại sao $ (elem) .click () không hoạt động với Angular?
Sergii Shevchyk

11
Nếu bạn bị giới hạn ở jqLite và không thể sử dụng bộ chọn, hãy thực hiện việc này thay thế: angle.element (document.querySelector ('# mySelector')). Trigger ('click');
Daniel Nalbach

3
@DanielNalbach trong các phiên bản hiện tại (và không quá hiện tại) góc 1.2+, bạn phải sử dụng triggerHandlerthay vìtrigger
yorch

1
Tôi không chắc điều này vẫn hoạt động ... anglejs 1.6 có vẻ như điều này không hoạt động với jquery đầy đủ
George Mauer

83
angular.element(domElement).triggerHandler('click');

CHỈNH SỬA: Có vẻ như bạn phải thoát ra khỏi chu kỳ $ apply () hiện tại. Một cách để làm điều này là sử dụng $ timeout ():

$timeout(function() {
    angular.element(domElement).triggerHandler('click');
}, 0);

Xem fiddle: http://jsfiddle.net/t34z7/


2
ngay cả khi điều này cũng không hoạt động, lỗi của nó xảy ra sau Lỗi: [$ rootScope: inprog] error.angularjs.org/1.2.14/$rootScope/inprog?p0=%24apply at Error (native)
mulla.azzi

8
Bạn có thể muốn sử dụng Angular's $timeouthơn setTimeout$timeoutnó sẽ chạy một $applychu trình cho bạn nếu cần thiết. Nó cũng làm cho mã của bạn dễ kiểm tra hơn vì ngMock cung cấp cho bạn toàn quyền kiểm soát khi $timeoutcác s được thực thi. docs.angularjs.org/api/ng/service/$timeout
WildlyInaccurate

2
Trên thực tế, điều này nên $timeout(fn, 0, false);để nó không gọi $ apply, phải không?
Martin Probst

2
Đây phải là câu trả lời được chấp nhận. triggerHandler hoạt động. kích hoạt không trong v1.2.25
Howie

4
@deadManN $timeoutlà một dịch vụ và nhu cầu như vậy là phụ thuộc tiêm trước khi bạn có thể sử dụng nó docs.angularjs.org/api/ng/service/$timeout
WildlyInaccurate

19

Giải pháp sau đây phù hợp với tôi:

angular.element(document.querySelector('#myselector')).click();

thay vì :

angular.element('#myselector').triggerHandler('click');

@DotKu Có thể bạn đã ở trong một hàm $ scope giống như khi bạn sử dụng trong một hàm $ timeout? Nói cách khác, bạn không thể gọi một $ scope. $ Apply () trong một $ scope. $ Apply () ... Tôi hy vọng điều này có thể giúp ích cho bạn.
jpmottin

@jpmottin Tôi đã tìm thấy nó, nó phải được đặt trong $ timeout. Cảm ơn
Weijing Jay Lin

1
OMG, Angular totallt đã phá hỏng nó. Tại sao họ không thể mimick jQuery$('#element').click()
Jhourlad Estrella

13

Đề phòng mọi người thấy vậy, tôi đã thêm câu trả lời trùng lặp bổ sung với một dòng quan trọng sẽ không phá vỡ sự truyền bá sự kiện

$scope.clickOnUpload = function ($event) {    
    $event.stopPropagation(); // <-- this is important

    $timeout(function() {
        angular.element(domElement).trigger('click');
    }, 0);
};

Cảm ơn! Điều này cuối cùng đã làm việc cho tôi trong 1.5.11 và phụ thuộc đầy đủ jquery. $ timeout (function () {var el = document.getElementsByClassName ('fa-chevron-up'); angle.element (el) .trigger ('click');}, 0);
Florida G.

9

Sử dụng JavaScript cũ đơn giản đã làm việc cho tôi:
document.querySelector('#elementName').click();


Vâng. Làm việc cho tôi. Cảm ơn.
ktaro

5

Giải pháp tốt nhất là sử dụng:

domElement.click()

Bởi vì các angular.element(domElement).triggerHandler('click')sự kiện nhấp chuột anglejs triggerHandler ( ) không nổi lên trong phân cấp DOM, nhưng sự kiện ở trên thì có - giống như nhấp chuột bình thường.

https://docs.angularjs.org/api/ng/osystem/angular.element

http://api.jquery.com/triggerhandler/

https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/click


4

Bạn có thể làm như

$timeout(function() {
   angular.element('#btn2').triggerHandler('click');
});

Tôi gặp lỗi này cho giải pháp này trong ứng dụng ng 1.5.3 của tôi: Tìm kiếm các phần tử qua bộ chọn không được jqLite hỗ trợ.
Todd Hale

1

Mẫu đơn giản:

HTML

<div id='player'>
    <div id="my-button" ng-click="someFuntion()">Someone</div>
</div>

JavaScript

$timeout(function() {
    angular.element('#my-button').triggerHandler('click');
}, 0);

Điều này làm là tìm kiếm nút idvà thực hiện hành động nhấp chuột. Thì đấy.

Nguồn: https://techiedan.com/angularjs-how-to-trigger-click/


0

Mã này sẽ không hoạt động (gây ra lỗi khi được nhấp vào):

$timeout(function() {
   angular.element('#btn2').triggerHandler('click');
});

Bạn cần sử dụng querySelector như sau:

$timeout(function() {
   angular.element(document.querySelector('#btn2')).triggerHandler('click');
});

0

Bao gồm dòng sau trong phương pháp của bạn ở đó bạn muốn kích hoạt sự kiện nhấp chuột

angular.element('#btn_you_want_to_click_progmaticallt').triggerHandler('click');
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.