如何以编程方式触发ngClick


Answers:


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;

有关Angular Extend方式的更多信息,请点击此处

如果使用的是旧版本的angular,则应使用trigger而不是triggerHandler

如果需要应用停止传播,则可以按以下方式使用此方法:

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

4
您使用的是哪个版本的angular。triggerHandler在1.2.1中似乎工作正常:jsfiddle.net/t34z7
Blago

13
请解释为什么$(elem).click()无法与Angular一起使用?
谢尔盖·舍甫克

11
如果您仅限于jqLit​​e并且不能使用选择器,请改为执行以下操作:angular.element(document.querySelector('#mySelector'))。trigger('click');
丹尼尔·纳尔巴赫

3
@DanielNalbach当前(不是当前)Angular 1.2+版本中,您必须使用triggerHandler而不是trigger
yorch 2015年

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] errors.angularjs.org/1.2.14/$rootScope/inprog?p0=%24apply 的错误(本机)
mulla.azzi

8
您可能希望使用Angular $timeout而不是setTimeout,因为如有必要,$timeout它将$apply为您运行一个循环。ngMock使您可以完全控制$timeout执行s的时间,这也使您的代码更具可测试性。docs.angularjs.org/api/ng/service/$timeout
WildlyInaccurate 2014年

2
实际上应该是$timeout(fn, 0, false);这样,它才不会调用$ apply,不是吗?
Martin Probst 2014年

2
这应该是公认的答案。triggerHandler有效。触发不会在v1.2.25
豪伊

4
@deadManN $timeout是一项服务,因此需要先注入依赖项,然后才能使用它docs.angularjs.org/api/ng/service/$timeout
WildlyInaccurate 2015年

19

以下解决方案对我有用:

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

代替 :

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

@DotKu也许您已经在$ scope函数中,就像在$ timeout函数中使用时一样?换句话说,您不能在$ scope。$ apply()中调用$ scope。$ apply()...希望对您有所帮助。
jpmottin

我找到了@jpmottin,它必须放在$ timeout中。谢谢
林伟京,

1
天哪,Angular Totallt毁了它。他们为什么不能模仿jQuery$('#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.17年

9

使用普通的旧JavaScript对我有用:
document.querySelector('#elementName').click();


是的 为我工作。谢谢。
卡塔罗


4

你可以喜欢

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

我在ng 1.5.3应用程序中收到此解决方案的错误消息:jqLit​​e不支持通过选择器查找元素。
托德·黑尔


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');
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.