NgClick programatik olarak nasıl tetiklenir


102

Çalışma ng-clickzamanında aşağıdaki gibi bir öğeyi tetiklemek istiyorum:

_ele.click();

VEYA

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

Bu nasıl yapılabilir?


4
Hayır, ng-tıklamayı manuel olarak tetikleyebileceğim mekanizmayı bilmek istiyorum.
mulla.azzi

Yanıtlar:


183

Sözdizimi aşağıdaki gibidir:

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 yolu hakkında daha fazla bilgiyi burada bulabilirsiniz .

Eğer kullanıyorsanız açısal eski sürümlerini kullanmak gerekir tetiği yerine triggerHandler .

Durdurma yayılımı uygulamanız gerekiyorsa, bu yöntemi aşağıdaki gibi kullanabilirsiniz:

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

4
hangi açısal versiyonu kullanıyorsunuz. triggerHandler 1.2.1 iş cezası görünüyor: jsfiddle.net/t34z7
blago

13
lütfen $ (elem) .click () neden Angular ile çalışmıyor?
Sergii Shevchyk

11
JqLite ile sınırlıysanız ve bir seçici kullanamıyorsanız, bunun yerine şunu yapın: angular.element (document.querySelector ('# mySelector')). Trigger ('click');
Daniel Nalbach

3
@DanielNalbach güncel (ve o kadar güncel değil) 1.2+ Açısal sürümlerde, triggerHandlerbunun yerinetrigger
yorch

1
Bunun hala çalıştığından pek emin değilim ... angularjs 1.6 bu tam jquery ile çalışmıyor gibi görünüyor
George Mauer

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

DÜZENLEME: Görünüşe göre mevcut $ apply () döngüsünden çıkmanız gerekiyor. Bunu yapmanın bir yolu $ timeout () kullanmaktır:

$timeout(function() {
    angular.element(domElement).triggerHandler('click');
}, 0);

Fiddle'a bakın: http://jsfiddle.net/t34z7/


2
bu bile çalışmıyor, şu hatayı atıyor Hata: [$ rootScope: inprog] errors.angularjs.org/1.2.14/$rootScope/inprog?p0=%24apply at Error (native)
mulla.azzi

8
Muhtemelen Açısal var kullanmak istiyorum $timeoutziyade setTimeoutgibi $timeoutbir çalışacak $applygerekirse sizin için döngüsünü. Ayrıca, ngMock size $timeouts çalıştırıldığında tam kontrol sağladığından kodunuzu daha test edilebilir hale getirir . docs.angularjs.org/api/ng/service/$timeout
WildlyInaccurate

2
Aslında bu $timeout(fn, 0, false);$ apply'ı çağırmayacak şekilde olmalı, değil mi?
Martin Probst

2
Kabul edilen cevap bu olmalıdır. triggerHandler çalışır. tetikleyici v1.2.25 sürümünde değil
Howie

4
@deadManN $timeoutbir hizmettir ve bu nedenle
WildlyInaccurate

19

Aşağıdaki çözüm benim için çalışıyor:

angular.element(document.querySelector('#myselector')).click();

onun yerine :

angular.element('#myselector').triggerHandler('click');

@DotKu Belki zaten bir $ zaman aşımı işlevinde kullandığınız gibi bir $ kapsam işlevindesiniz? Başka bir deyişle, bir $ kapsamı. $ Apply () 'ı bir $ kapsamı içinde çağıramazsınız. $ Apply () ... Umarım bu size yardımcı olabilir.
jpmottin

@jpmottin Buldum, $ zaman aşımına yerleştirilmesi gerekiyor. Teşekkürler
Weijing Jay Lin

1
OMG, Açısal totallt onu mahvetti. Neden jQuery's'i taklit edemiyorlar$('#element').click()
Jhourlad Estrella

13

Herkesin görmesi durumunda, olay yayılımını bozmayacak önemli bir satırla ek yinelenen yanıt ekledim

$scope.clickOnUpload = function ($event) {    
    $event.stopPropagation(); // <-- this is important

    $timeout(function() {
        angular.element(domElement).trigger('click');
    }, 0);
};

Teşekkürler! Bu nihayet benim için 1.5.11'de ve tam jquery bağımlılığında çalıştı. $ zaman aşımı (function () {var el = document.getElementsByClassName ('fa-chevron-up'); angular.element (el) .trigger ('click');}, 0);
Florida G.

9

Eski düz JavaScript kullanmak benim için çalıştı:
document.querySelector('#elementName').click();


Evet. Benim için çalışıyor. Teşekkürler.
ktaro


4

Beğenebilirsin

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

1.5.3 uygulamamda bu çözüm için şu hatayı alıyorum: Öğeleri seçiciler aracılığıyla aramak jqLite tarafından desteklenmiyor.
Todd Hale


0

Bu kod çalışmayacaktır (tıklandığında bir hata verin):

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

QuerySelector'ı aşağıdaki gibi kullanmanız gerekir :

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

0

Tıklama olayını tetiklemek istediğinizde aşağıdaki satırı yönteminize ekleyin

angular.element('#btn_you_want_to_click_progmaticallt').triggerHandler('click');
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.