プログラムでngClickをトリガーする方法


101

次のng-clickような実行時に要素をトリガーしたい:

_ele.click();

または

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

これはどのように行うことができますか?


4
いいえ、ngクリックを手動でトリガーできるメカニズムを知りたいのですが。
mulla.azzi 14年

回答:


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 wayの詳細については、こちらをご覧ください

angularの古いバージョンを使用している場合は、triggerHandlerの代わりにtriggerを使用する必要があります。

伝播停止を適用する必要がある場合は、このメソッドを次のように使用できます。

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

4
どのバージョンの角度を使用していますか。triggerHandlerは1.2.1で正常に動作するようだ:jsfiddle.net/t34z7
Blago

13
$(elem).click()がAngularで機能しない理由を説明してください。
Sergii Shevchyk 2015年

11
jqLit​​eに制限されており、セレクターを使用できない場合は、代わりに次のようにします。angular.element(document.querySelector( '#mySelector'))。trigger( 'click');
Daniel Nalbach、2015

3
@DanielNalbach(現在のバージョンではない)Angularバージョン1.2以降、triggerHandler代わりに使用する必要があるtrigger
yorch

1
これがまだ機能するかどうかはよくわかりません... angularjs 1.6これは完全なjqueryでは機​​能しないようです
George Mauer

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

編集: あなたは現在の$ apply()サイクルから抜け出す必要があるようです。これを行う1つの方法は、$ 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=%24apply at error(native)
mulla.azzi

8
必要に応じてサイクルを実行する$timeoutのでsetTimeout、おそらくでなくAngularを使用したいと思うでしょう。また、ngMockはsがいつ実行されるかを完全に制御できるため、コードをよりテストしやすくします。docs.angularjs.org/api/ng/service/$timeout$timeout$apply$timeout
WildlyInaccurate

2
実際、これは$timeout(fn, 0, false);$ applyを呼び出さないようにする必要がありますね。
Martin Probst 2014年

2
これは受け入れられる答えになるはずです。triggerHandlerが機能します。トリガーがv1.2.25にない
ハウイー

4
@deadManN $timeoutはサービスなので、使用する前に依存関係を挿入する必要があります。docs.angularjs.org
api / ng /

19

次の解決策は私にとってはうまくいきます:

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

の代わりに :

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

@DotKuたぶん、あなたは$ timeout関数で使用するときのように、すでに$ scope関数にいますか?言い換えれば、$ scope。$ apply()で$ scope。$ apply()を呼び出すことはできません...これがあなたに役立つことを願っています。
jpmottin 2016年

@jpmottin見つけたので、$ timeoutに配置する必要があります。ありがとう
Weijing Jay Lin

1
OMG、Angular totalltはそれを台無しにしました。jQueryを模倣できない理由$('#element').click()
Jhourlad Estrella 2017

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 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


4

あなたは好きにできます

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

このソリューションでこのエラーが発生するのは、ng 1.5.3アプリの場合です。jqLit​​eでは、セレクターによる要素の検索はサポートされていません。
トッドヘイル


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');
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.