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?

Justin
sumber
Mungkin ini membantu: stackoverflow.com/questions/20801843/…
Wim Deblauwe
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

tasseKATT
sumber
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. ""

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

Ari
sumber
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. :)

Debayan Das
sumber
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