Quiero activar ng-click
un elemento en tiempo de ejecución como:
_ele.click();
O
_ele.trigger('click', function());
¿Cómo se puede hacer esto?
Quiero activar ng-click
un elemento en tiempo de ejecución como:
_ele.click();
O
_ele.trigger('click', function());
¿Cómo se puede hacer esto?
Respuestas:
La sintaxis es la siguiente:
function clickOnUpload() {
$timeout(function() {
angular.element('#myselector').triggerHandler('click');
});
};
// Using Angular Extend
angular.extend($scope, {
clickOnUpload: clickOnUpload
});
// OR Using scope directly
$scope.clickOnUpload = clickOnUpload;
Más información sobre la forma Angular Extend aquí .
Si está usando versiones antiguas de angular , debe usar trigger en lugar de triggerHandler .
Si necesita aplicar detener la propagación, puede utilizar este método de la siguiente manera:
<a id="myselector" ng-click="clickOnUpload(); $event.stopPropagation();">
Something
</a>
triggerHandler
lugar detrigger
angular.element(domElement).triggerHandler('click');
EDITAR: Parece que tienes que salir del ciclo actual de $ apply (). Una forma de hacer esto es usando $ timeout ():
$timeout(function() {
angular.element(domElement).triggerHandler('click');
}, 0);
Ver violín: http://jsfiddle.net/t34z7/
$timeout
lugar de setTimeout
, ya $timeout
que ejecutará un $apply
ciclo para usted si es necesario. También hace que su código sea más comprobable, ya que ngMock le brinda control total sobre cuándo $timeout
se ejecutan los correos electrónicos . docs.angularjs.org/api/ng/service/$timeout
$timeout(fn, 0, false);
para que no invoque $ apply, ¿no?
$timeout
es un servicio y, como tal, debe inyectarse en dependencia antes de poder usarlo. docs.angularjs.org/api/ng/service/$timeout
Esta siguiente solución funciona para mí:
angular.element(document.querySelector('#myselector')).click();
en vez de :
angular.element('#myselector').triggerHandler('click');
$('#element').click()
En caso de que todos lo vean, agregué una respuesta duplicada adicional con una línea importante que no interrumpirá la propagación del evento
$scope.clickOnUpload = function ($event) {
$event.stopPropagation(); // <-- this is important
$timeout(function() {
angular.element(domElement).trigger('click');
}, 0);
};
La mejor solución es utilizar:
domElement.click()
Debido a que los angular.element(domElement).triggerHandler('click')
eventos de clic de triggerHandler ( ) de angularjs no aparecen en la jerarquía DOM, pero el de arriba sí, al igual que un clic normal del mouse.
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
Puedes hacer como
$timeout(function() {
angular.element('#btn2').triggerHandler('click');
});
Muestra 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);
Lo que hace es buscar los botones id
y realizar una acción de clic. Voila.
Fuente: https://techiedan.com/angularjs-how-to-trigger-click/
Este código no funcionará (arrojará un error al hacer clic):
$timeout(function() {
angular.element('#btn2').triggerHandler('click');
});
Debe usar querySelector de la siguiente manera:
$timeout(function() {
angular.element(document.querySelector('#btn2')).triggerHandler('click');
});
Incluya la siguiente línea en su método donde desea activar el evento de clic
angular.element('#btn_you_want_to_click_progmaticallt').triggerHandler('click');
});