Je veux déclencher ng-click
un élément au moment de l'exécution comme:
_ele.click();
OU
_ele.trigger('click', function());
Comment cela peut-il être fait?
Je veux déclencher ng-click
un élément au moment de l'exécution comme:
_ele.click();
OU
_ele.trigger('click', function());
Comment cela peut-il être fait?
Réponses:
La syntaxe est la suivante:
function clickOnUpload() {
$timeout(function() {
angular.element('#myselector').triggerHandler('click');
});
};
// Using Angular Extend
angular.extend($scope, {
clickOnUpload: clickOnUpload
});
// OR Using scope directly
$scope.clickOnUpload = clickOnUpload;
Plus d'informations sur la manière Angular Extend ici .
Si vous utilisez d' anciennes versions d'angular , vous devez utiliser trigger au lieu de triggerHandler .
Si vous devez appliquer l'arrêt de la propagation, vous pouvez utiliser cette méthode comme suit:
<a id="myselector" ng-click="clickOnUpload(); $event.stopPropagation();">
Something
</a>
triggerHandler
place detrigger
angular.element(domElement).triggerHandler('click');
EDIT: Il semble que vous deviez sortir du cycle $ apply () actuel. Une façon de faire est d'utiliser $ timeout ():
$timeout(function() {
angular.element(domElement).triggerHandler('click');
}, 0);
Voir violon: http://jsfiddle.net/t34z7/
$timeout
plutôt que setTimeout
, car $timeout
cela exécutera un $apply
cycle pour vous si nécessaire. Cela rend également votre code plus testable car ngMock vous donne un contrôle total sur l' $timeout
exécution des s. docs.angularjs.org/api/ng/service/$timeout
$timeout(fn, 0, false);
pour qu'il n'invoque pas $ apply, n'est-ce pas?
$timeout
est un service et, en tant que tel, doit être injecté de dépendances avant de pouvoir l'utiliser docs.angularjs.org/api/ng/service/$timeout
Cette solution suivante fonctionne pour moi:
angular.element(document.querySelector('#myselector')).click();
au lieu de :
angular.element('#myselector').triggerHandler('click');
$('#element').click()
Juste au cas où tout le monde le verrait, j'ai ajouté une réponse de duplication supplémentaire avec une ligne importante qui ne rompra pas la propagation des événements
$scope.clickOnUpload = function ($event) {
$event.stopPropagation(); // <-- this is important
$timeout(function() {
angular.element(domElement).trigger('click');
}, 0);
};
La meilleure solution est d'utiliser:
domElement.click()
Parce que les événements de clic triggerHandler ( angular.element(domElement).triggerHandler('click')
) angularjs ne bouillonnent pas dans la hiérarchie DOM, mais celui ci-dessus le fait - tout comme un clic de souris normal.
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
Tu peux faire comme
$timeout(function() {
angular.element('#btn2').triggerHandler('click');
});
Échantillon simple:
HTML
<div id='player'>
<div id="my-button" ng-click="someFuntion()">Someone</div>
</div>
JavaScript
$timeout(function() {
angular.element('#my-button').triggerHandler('click');
}, 0);
Ce que cela fait, c'est rechercher le bouton id
et d'effectuer une action de clic. Voila.
Source: https://techiedan.com/angularjs-how-to-trigger-click/
Ce code ne fonctionnera pas (génère une erreur lorsque vous cliquez dessus):
$timeout(function() {
angular.element('#btn2').triggerHandler('click');
});
Vous devez utiliser le querySelector comme suit:
$timeout(function() {
angular.element(document.querySelector('#btn2')).triggerHandler('click');
});
Incluez la ligne suivante dans votre méthode là où vous souhaitez déclencher l'événement de clic
angular.element('#btn_you_want_to_click_progmaticallt').triggerHandler('click');
});