クラス名またはIDで要素を取得する方法


125

angularjsでhtml内の要素を見つけようとしています。

ここにhtmlがあります:

<button class="btn btn-primary multi-files" type="button">
   <span>Choose multiple files</span>
</button>
<br/><br/>
<input ng-file-select type="file" multiple  style="display: none"/><br/>

クラス名マルチファイルでボタン要素を取得しようとしているのですが、

var multibutton = angular.element(element.getElementsByClassName(".multi-files"));

しかし、それは機能せず、試してみましたelement.findが、タグに対してのみ機能します。

angularjsのIDまたはクラス名で要素を取得できる関数はありますか?



ディレクティブを作成する必要さえありません。ng-clickのようなハンドラーを追加するだけです。最悪の場合、本当に要素を取得したい場合は、いつでもjQuery構文を使用できます。
Lucas Holt

回答:


187

getElementsByClassNameDOM Documentの関数です。これは、jQuery関数でもjqLit​​e関数でもありません。

使用時にクラス名の前にピリオドを追加しないでください:

var result = document.getElementsByClassName("multi-files");

jqLit​​e(またはjQueryがAngularの前にロードされている場合はjQuery)でラップします。

var wrappedResult = angular.element(result);

あなたがから選択する場合elementディレクティブのリンク機能であなたの代わりにjqLit​​e参照のDOM参照にアクセスする必要がある- element[0]の代わりにelement

link: function (scope, element, attrs) {

  var elementResult = element[0].getElementsByClassName('multi-files');
}

または、document.querySelector関数を使用することもできます(クラスで選択する場合は、ここにピリオドが必要です)。

var queryResult = element[0].querySelector('.multi-files');
var wrappedQueryResult = angular.element(queryResult);

デモ: http : //plnkr.co/edit/AOvO47ebEvrtpXeIzYOH?p=preview


1
リンク関数内では、angularはまだ要素を作成する機会がなかったため、element.childElementCountが0である可能性があるため、element [0] .getElement .. 。
Dylanthepiguy

27

つまり、.in を追加する必要はありません。getElementsByClassName

var multibutton = angular.element(element.getElementsByClassName("multi-files"));

ただし、を使用angular.elementする場合は、jqueryスタイルセレクターを使用する必要があります。

angular.element('.multi-files');

トリックを行う必要があります。

また、このドキュメントから「jQueryが利用可能な場合、angular.elementはjQuery関数のエイリアスです。jQueryが利用できない場合、angular.elementは、「jQuery lite」または「jqLit​​e」と呼ばれるAngularの組み込みjQueryサブセットに委任します。 「」


こんにちは、返信ありがとう、私はそれを試しましたが、エラーは未定義の関数を示しています
Justin

はい、そうかもしれないし、そうでないかもしれません。今すぐ私の答えを確認してください(編集を行ってください)。
Ashesh、2014年

関数が定義されていない場合は、おそらくjqueryをロードしていません。jqlite(@Asheshが言及したようにjqueryをロードしなかった場合に使用されます)には、jqueryが持つすべての機能がなく、getElementsByClassNameもその1つです。
haimlit 2014年

5
angular.element( 'multi-files'); 動作しません。あなたは期間が必要です。
フィリップジョセフィ2016年

var multibutton = angular.element(document.getElementsByClassName( "multi-files"));
Salman Lone 2017

20

@tasseKATTの回答は素晴らしいですが、ディレクティブを作成したくない場合は、なぜ使用しないの$documentですか?

.controller('ExampleController', ['$scope', '$document', function($scope, $document) {
  var dumb = function (id) {
  var queryResult = $document[0].getElementById(id)
  var wrappedID = angular.element(queryResult);
  return wrappedID;
};

プランカー


2
angular.element('#Your element id')同じ仕事をします。
ガブラー2016

3
角度1.5.8でこのエラーが発生しています。「セレクターによる要素の検索はjqLit​​eではサポートされていません」
SP Singh

-4

ボタンをクラス名のみで検索し、jQLiteのみを使用したい場合は、以下のようにします。

var myListButton = $document.find('button').filter(function() {
    return angular.element(this).hasClass('multi-files');
});

お役に立てれば。:)


1
これはangularとjqueryを使用していない、また、誤ったステートメント、jqueryを使用してjqliteを置き換えることができます。これは、バニラjavascript要素($ document [0])に行くことなく、角度のある環境でこれを行う正しい方法です。
Dennis Bartlett
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.