Cara mendapatkan elemen dengan nama kelas atau id


125

Saya mencoba menemukan elemen dalam html oleh angularjs.

Ini html-nya:

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

Saya mencoba untuk mendapatkan elemen tombol dengan nama kelas multi-file, lalu saya mencoba

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

Tetapi itu tidak berhasil, dan mencoba element.findtetapi hanya berfungsi untuk tag.

Apakah ada fungsi yang bisa mendapatkan elemen dengan id atau classname di angularjs?



Anda bahkan tidak perlu membuat perintah .. Anda cukup menambahkan penangan seperti ng-click. Kasus terburuk, jika Anda benar-benar ingin mendapatkan elemen tersebut, Anda selalu dapat menggunakan sintaks jQuery.
Lucas Holt

Jawaban:


187

getElementsByClassNameadalah fungsi pada Dokumen DOM. Ini bukanlah fungsi jQuery atau jqLite.

Jangan tambahkan titik sebelum nama kelas saat menggunakannya:

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

Bungkus dengan jqLite (atau jQuery jika jQuery dimuat sebelum Angular):

var wrappedResult = angular.element(result);

Jika Anda ingin memilih dari elementfungsi link in a directive, Anda perlu mengakses referensi DOM alih-alih referensi jqLite - element[0]alih - alih element:

link: function (scope, element, attrs) {

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

Alternatifnya Anda dapat menggunakan document.querySelectorfungsi (perlu titik di sini jika memilih berdasarkan kelas):

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

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


1
Perlu dicatat bahwa di dalam fungsi link, element.childElementCount bisa jadi 0 karena angular belum memiliki kesempatan untuk membuat elemen, jadi Anda harus bersiap untuk menangani tidak ada hasil untuk elemen [0] .getElement .. .
Dylanthepiguy

27

Anda tidak perlu menambahkan .di getElementsByClassName, yaitu

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

Namun, saat menggunakan angular.element, Anda harus menggunakan pemilih gaya jquery:

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

harus melakukan triknya.

Juga, dari dokumentasi ini, "Jika jQuery tersedia, angular.element adalah alias untuk fungsi jQuery. Jika jQuery tidak tersedia, angular.element mendelegasikan ke subset bawaan jQuery Angular, yang disebut" jQuery lite "atau" jqLite. ""


hai, terima kasih atas balasannya, saya mencobanya, tetapi kesalahan mengatakan fungsi tidak terdefinisi
Justin

Mungkin atau mungkin tidak berhasil, ya. Silakan periksa jawaban saya sekarang (sudah diedit) dan Anda mungkin akan tahu apa yang harus dilakukan.
Ashesh

Jika fungsinya tidak ditentukan, Anda mungkin tidak memuat jquery. jqlite (yang digunakan jika Anda tidak memuat jquery karena @Ashesh disebutkan) tidak memiliki semua fungsi yang dimiliki jquery, dan getElementsByClassName adalah salah satunya.
haimlit

5
angular.element ('multi-file'); tidak akan berhasil. Anda memang membutuhkan menstruasi.
Philippe Gioseffi

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

20

@tasseKATT's Answer is great, but if you don't want to make a directive, why not use $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;
};

PLUNKR


2
angular.element('#Your element id')melakukan pekerjaan yang sama.
obrolan

3
Ini memberikan kesalahan ini di sudut 1.5.8. "Mencari elemen melalui pemilih tidak didukung oleh jqLite"
SP Singh

-4

Jika Anda ingin mencari tombol hanya dengan nama kelasnya dan menggunakan jQLite saja, Anda dapat melakukan seperti di bawah ini:

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

Semoga ini membantu. :)


1
Ini tidak menggunakan angular dan jquery, juga, statment salah, Anda memang BISA menggunakan jquery untuk menggantikan jqlite. Ini adalah cara yang benar untuk melakukan ini dalam lingkungan bersudut, tanpa harus menggunakan elemen javascript vanilla ($ document [0]).
Dennis Bartlett
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.