วิธีทริกเกอร์ ngClick โดยทางโปรแกรม


101

ฉันต้องการทริกเกอร์ng-clickองค์ประกอบที่รันไทม์เช่น:

_ele.click();

หรือ

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

จะทำได้อย่างไร?


4
ไม่ฉันต้องการทราบกลไกที่ฉันสามารถทริกเกอร์ ng-click ด้วยตนเองได้
mulla.azzi

คำตอบ:


182

ไวยากรณ์มีดังต่อไปนี้:

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

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

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

ข้อมูลเพิ่มเติมเกี่ยวกับวิธีการขยายเชิงมุมที่นี่

หากคุณกำลังใช้รุ่นเก่าของเชิงมุมคุณควรใช้ทริกเกอร์แทนtriggerHandler

หากคุณต้องการใช้การหยุดการแพร่กระจายคุณสามารถใช้วิธีนี้ได้ดังนี้:

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

4
คุณใช้เชิงมุมรุ่นใด triggerHandler ดูเหมือนจะทำงานได้ดีใน 1.2.1: jsfiddle.net/t34z7
Blago

13
โปรดอธิบายว่าทำไม $ (elem) .click () ไม่ทำงานกับ Angular?
Sergii Shevchyk

11
หากคุณถูก จำกัด ไว้ที่ jqLite และไม่สามารถใช้ตัวเลือกได้ให้ทำสิ่งนี้แทน: angular.element (document.querySelector ('# mySelector')). trigger ('click');
Daniel Nalbach

3
@DanielNalbach ในปัจจุบัน (และไม่เป็นปัจจุบัน) Angular เวอร์ชัน 1.2+ คุณต้องใช้triggerHandlerแทนtrigger

1
ฉันไม่แน่ใจว่ามันยังใช้งานได้ ... angularjs 1.6 ดูเหมือนว่าจะไม่ทำงานกับ jquery เต็มรูปแบบ
George Mauer

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

แก้ไข: ดูเหมือนว่าคุณต้องแยกออกจากวงจร $ apply () ปัจจุบัน วิธีหนึ่งที่ทำได้คือใช้ $ timeout ():

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

ดูซอ: http://jsfiddle.net/t34z7/


2
แม้ว่าสิ่งนี้จะไม่ทำงาน แต่ก็มีข้อผิดพลาดเกิดขึ้นตามข้อผิดพลาด: [$ rootScope: inprog] error.angularjs.org/1.2.14/$rootScope/inprog?p0=%24 ใช้ ที่ข้อผิดพลาด (เนทีฟ)
mulla.azzi

8
คุณอาจต้องการใช้ Angular $timeoutมากกว่าsetTimeoutเนื่องจาก$timeoutจะเรียกใช้$applyวงจรให้คุณหากจำเป็น นอกจากนี้ยังทำให้โค้ดของคุณสามารถทดสอบได้มากขึ้นเนื่องจาก ngMock ช่วยให้คุณควบคุมได้เต็มที่ว่า$timeoutจะดำเนินการเมื่อใด docs.angularjs.org/api/ng/service/$timeout
WildlyInaccurate

2
อันที่จริงมันควรจะ$timeout(fn, 0, false);ไม่เรียกใช้ $ ใช่ไหม
Martin Probst

2
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ triggerHandler ใช้งานได้ ทริกเกอร์ไม่อยู่ใน v1.2.25
Howie

4
@deadManN $timeoutเป็นบริการและด้วยเหตุนี้จึงจำเป็นต้องมีการฉีดพึ่งพาก่อนจึงจะใช้งานได้docs.angularjs.org/api/ng/service/$timeout
WildlyInaccurate

19

วิธีแก้ปัญหาต่อไปนี้ใช้ได้กับฉัน:

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

แทน :

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

@DotKu บางทีคุณอาจอยู่ในฟังก์ชัน $ ขอบเขตเช่นเมื่อคุณใช้ในฟังก์ชัน $ timeout? กล่าวอีกนัยหนึ่งคุณไม่สามารถเรียก $ ขอบเขต $ ใช้ () ใน $ ขอบเขต $ ใช้ () ... ฉันหวังว่านี่อาจช่วยคุณได้
jpmottin

@jpmottin เจอแล้วต้องใส่ $ timeout ขอบคุณ
Weijing Jay Lin

1
OMG, Angular totallt ทำลายมัน ทำไมพวกเขาไม่สามารถเลียนแบบ jQuery's$('#element').click()
Jhourlad Estrella

13

ในกรณีที่ทุกคนเห็นฉันได้เพิ่มคำตอบที่ซ้ำกันเพิ่มเติมด้วยบรรทัดสำคัญซึ่งจะไม่ทำลายการเผยแพร่เหตุการณ์

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

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

ขอบคุณ! ในที่สุดสิ่งนี้ก็ใช้ได้ผลสำหรับฉันใน 1.5.11 และการพึ่งพา jquery แบบเต็ม $ timeout (function () {var el = document.getElementsByClassName ('fa-chevron-up'); angular.element (el) .trigger ('click');}, 0);
Florida G.

9

การใช้ JavaScript แบบเก่าธรรมดาสำหรับฉัน:
document.querySelector('#elementName').click();


ใช่. ใช้ได้ผลสำหรับฉัน ขอบคุณ.
ktaro

5

ทางออกที่ดีที่สุดคือใช้:

domElement.click()

เนื่องจากangular.element(domElement).triggerHandler('click')เหตุการณ์การคลิกangularjs triggerHandler ( ) ไม่ปรากฏขึ้นในลำดับชั้นของ DOM แต่เหตุการณ์ข้างต้นทำเช่นเดียวกับการคลิกเมาส์ปกติ

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

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

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


4

คุณสามารถทำเช่น

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

ฉันได้รับข้อผิดพลาดนี้สำหรับโซลูชันนี้ในแอป ng 1.5.3 ของฉัน: jqLite ไม่รองรับการค้นหาองค์ประกอบผ่านตัวเลือก
Todd Hale


0

รหัสนี้จะไม่ทำงาน (เกิดข้อผิดพลาดเมื่อคลิก):

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

คุณต้องใช้querySelectorดังนี้:

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

0

รวมบรรทัดต่อไปนี้ไว้ในวิธีการของคุณที่คุณต้องการทริกเกอร์เหตุการณ์คลิก

angular.element('#btn_you_want_to_click_progmaticallt').triggerHandler('click');
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.