Я хочу запустити 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 Extend тут .
Якщо ви використовуєте старі версії angular , вам слід використовувати тригер замість тригерHandler .
Якщо вам потрібно застосувати зупинку розповсюдження, ви можете скористатися цим методом наступним чином:
<a id="myselector" ng-click="clickOnUpload(); $event.stopPropagation();">
Something
</a>
triggerHandler
замістьtrigger
angular.element(domElement).triggerHandler('click');
EDIT: Схоже, вам доведеться вийти з поточного циклу $ 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()
Через те, що події клацання angularjs тригерHandler ( 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
Простий зразок:
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');
});