Як запустити ngClick програмно


101

Я хочу запустити ng-clickелемент під час виконання на зразок:

_ele.click();

АБО

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

Як це можна зробити?


4
Ні, я хочу знати механізм, за допомогою якого я можу викликати натискання ng вручну.
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;

Більше інформації про Angular Extend тут .

Якщо ви використовуєте старі версії angular , вам слід використовувати тригер замість тригерHandler .

Якщо вам потрібно застосувати зупинку розповсюдження, ви можете скористатися цим методом наступним чином:

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

4
яку версію кутового ви використовуєте. ТригерHandler, здається, працює добре в 1.2.1: jsfiddle.net/t34z7
Благо

13
поясніть, будь ласка, чому $ (elem) .click () не працює з Angular?
Сергій Шевчик

11
Якщо ви обмежені jqLite і не можете використовувати селектор, зробіть це замість цього: angular.element (document.querySelector ('# mySelector')). Тригер ('click');
Даніель Налбах

3
@DanielNalbach в поточній (і не настільки актуальній) кутовій версії 1.2+, вам доведеться використовувати triggerHandlerзамістьtrigger
yorch

1
Я не дуже впевнений, що це все ще працює ... angularjs 1.6. Здається, це не працює з повним jquery
Джордж Мауер

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

EDIT: Схоже, вам доведеться вийти з поточного циклу $ 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=%24застосувати в Error (рідний)
mulla.azzi

8
Ви, мабуть, хочете скористатись Angular, $timeoutа не setTimeout, тому що при необхідності $timeoutзапустить $applyцикл для вас. Це також робить ваш код більш випробуваним, оскільки ngMock дає вам повний контроль над виконанням $timeouts. docs.angularjs.org/api/ng/service/$timeout
WildlyInaccurate

2
Насправді це має бути $timeout(fn, 0, false);так, щоб воно не викликало $ apply, чи не так?
Мартін Пробст

2
Це має бути прийнятою відповіддю. тригерHandler працює. тригер не в 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 Можливо, ви вже перебуваєте у функції $ range, як, наприклад, при використанні функції $ timeout? Іншими словами, ви не можете зателефонувати в область "$." $ Apply () в області $. $ Apply () ... Я сподіваюся, що це може вам допомогти.
jpmottin

@jpmottin Я знайшов це, він повинен бути розміщений у $ timeout. Спасибі
Weijing Jay Lin

1
OMG, кутовий тоталль зіпсував його. Чому вони не можуть імітувати 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);
Флорида Г.

9

Використання простого старого JavaScript працювало для мене:
document.querySelector('#elementName').click();


Так. Працює для мене. Дякую.
ktaro

5

Найкращим рішенням є використання:

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


4

Можна робити так, як

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

Я отримую цю помилку щодо цього рішення в моєму додатку 1.5.3: Пошук елементів через селектори jqLite не підтримує.
Тодд Хейл


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');
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.