Я хочу вызвать ng-click
элемент во время выполнения, например:
_ele.click();
ИЛИ
_ele.trigger('click', function());
Как это может быть сделано?
Я хочу вызвать ng-click
элемент во время выполнения, например:
_ele.click();
ИЛИ
_ele.trigger('click', function());
Как это может быть сделано?
Ответы:
Синтаксис следующий:
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 здесь .
Если вы используете старые версии angular , вам следует использовать trigger вместо triggerHandler .
Если вам нужно применить остановку распространения, вы можете использовать этот метод следующим образом:
<a id="myselector" ng-click="clickOnUpload(); $event.stopPropagation();">
Something
</a>
triggerHandler
вместоtrigger
angular.element(domElement).triggerHandler('click');
РЕДАКТИРОВАТЬ: Похоже, вам нужно выйти из текущего цикла $ apply (). Один из способов сделать это - использовать $ timeout ():
$timeout(function() {
angular.element(domElement).triggerHandler('click');
}, 0);
См. Скрипку: http://jsfiddle.net/t34z7/
$timeout
а не setTimeout
, поскольку $timeout
при необходимости запустит $apply
цикл за вас. Это также делает ваш код более тестируемым, поскольку ngMock дает вам полный контроль над выполнением $timeout
s. docs.angularjs.org/api/ng/service/$timeout
$timeout(fn, 0, false);
так, чтобы не вызывать $ apply, не так ли?
$timeout
- это сервис, и поэтому его необходимо внедрить в зависимости, прежде чем вы сможете его использовать docs.angularjs.org/api/ng/service/$timeout
Для меня работает следующее решение:
angular.element(document.querySelector('#myselector')).click();
вместо того :
angular.element('#myselector').triggerHandler('click');
$('#element').click()
На всякий случай, если все это видят, я добавил дополнительный дублирующий ответ с важной строкой, которая не нарушит распространение события.
$scope.clickOnUpload = function ($event) {
$event.stopPropagation(); // <-- this is important
$timeout(function() {
angular.element(domElement).trigger('click');
}, 0);
};
Лучшее решение - использовать:
domElement.click()
Потому что события click angularjs triggerHandler ( angular.element(domElement).triggerHandler('click')
) не всплывают в иерархии 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
Вы можете сделать как
$timeout(function() {
angular.element('#btn2').triggerHandler('click');
});
Простой образец:
HTML
<div id='player'>
<div id="my-button" ng-click="someFuntion()">Someone</div>
</div>
JavaScript
$timeout(function() {
angular.element('#my-button').triggerHandler('click');
}, 0);
Это ищет кнопку id
и выполняет действие щелчка. Вуаля.
Источник: https://techiedan.com/angularjs-how-to-trigger-click/
Этот код не будет работать (выдает ошибку при нажатии):
$timeout(function() {
angular.element('#btn2').triggerHandler('click');
});
Вам нужно использовать querySelector следующим образом:
$timeout(function() {
angular.element(document.querySelector('#btn2')).triggerHandler('click');
});
Включите следующую строку в свой метод там, где вы хотите вызвать событие щелчка
angular.element('#btn_you_want_to_click_progmaticallt').triggerHandler('click');
});