Sınıf adına veya kimliğe göre öğe nasıl alınır


125

Html'deki elementi angularjs ile bulmaya çalışıyorum.

İşte 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/>

Button öğesini sınıf adına göre çoklu dosyalar almaya çalışıyorum, sonra denedim

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

Ama işe yaramıyor ve denedi element.findama sadece etiket için çalışıyor.

Angularjs'de id veya sınıf adına göre eleman alabilen herhangi bir fonksiyon var mı?



Bir yönerge oluşturmanıza bile gerek yok .. ng-click gibi bir işleyici ekleyebilirsiniz. En kötü ihtimalle, öğeyi gerçekten almak istiyorsanız, her zaman jQuery sözdizimini kullanabilirsiniz.
Lucas Holt

Yanıtlar:


187

getElementsByClassNameDOM Belgesi üzerinde bir işlevdir. Bu ne jQuery ne de jqLite işlevidir.

Kullanırken sınıf adının önüne nokta eklemeyin:

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

JqLite (veya jQuery Angular'dan önce yüklenmişse jQuery) sarın:

var wrappedResult = angular.element(result);

Aralarından seçmek istiyorsanız elementbir yönerge bağlantı fonksiyonunda sen jqLite referans yerine DOM referansı erişmesi gereken - element[0]yerine element:

link: function (scope, element, attrs) {

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

Alternatif olarak document.querySelectorişlevi kullanabilirsiniz (sınıfa göre seçiyorsanız burada nokta gerekir):

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

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


1
Bağlantı işlevinin içinde, element.childElementCount'un 0 olabileceğini, çünkü açısal öğelerin henüz öğeleri yaratma şansı olmadığından, [0] .getElement öğesi için hiçbir sonuçla uğraşmaya hazırlıklı olmalısınız. .
Dylanthepiguy

27

Bir eklemek gerekmez .in getElementsByClassName, yani

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

Bununla birlikte, angular.elementkullanırken jquery stil seçicileri kullanmanız gerekir:

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

hile yapmalı.

Ayrıca, bu belgeden "jQuery varsa, angular.element jQuery işlevi için bir takma addır. JQuery yoksa, angular.element, Angular'ın" jQuery lite "veya" jqLite "adlı yerleşik jQuery alt kümesine delege eder. ""


merhaba, cevabınız için teşekkürler, bunu denedim, ancak hata tanımlanmamış işlev diyor
Justin

İşe yarayabilir veya çalışmayabilir, evet. Lütfen şimdi cevabımı kontrol edin (bir düzenleme yaptınız) ve muhtemelen ne yapacağınızı bileceksiniz.
Ashesh

İşlev tanımsızsa, muhtemelen jquery yüklemediniz. jqlite (@Ashesh'in bahsettiği gibi jquery yüklemediyseniz kullanılır) jquery'nin sahip olduğu tüm işlevlere sahip değildir ve getElementsByClassName bunlardan biridir.
haimlit

5
angular.element ( 'çoklu dosyalar'); çalışmayacak. Döneme ihtiyacın var.
Philippe Gioseffi

var multibutton = angular.element (document.getElementsByClassName ("çoklu dosyalar"));
Salman Lone

20

@ tasseKATT'ın Yanıtı harika, ama bir yönerge yapmak istemiyorsanız, neden kullanmayasınız $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')aynı işi yapıyor.
gabbler

3
Bu hatayı 1.5.8 açısal olarak veriyor. "Seçiciler aracılığıyla öğelerin aranması jqLite tarafından desteklenmiyor"
SP Singh

-4

Düğmeyi yalnızca sınıf adına göre ve yalnızca jQLite kullanarak bulmak istiyorsanız, aşağıdaki gibi yapabilirsiniz:

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

Bu yardımcı olur umarım. :)


1
Bu, açısal ve jquery kullanmaz, ayrıca yanlış ifade, jqlite yerine jquery kullanabilirsiniz. Bunu, vanilya javascript öğesine ($ belge [0]) gitmeden açısal bir ortamda yapmanın doğru yolu budur.
Dennis Bartlett
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.