So erhalten Sie ein Element anhand des Klassennamens oder der ID


125

Ich versuche, das Element in HTML von anglejs zu finden.

Hier ist das 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/>

Ich versuche, das Schaltflächenelement anhand des Klassennamens Multi-Dateien abzurufen, dann habe ich es versucht

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

Aber es funktioniert nicht und versucht element.find aber es funktioniert nur für Tag.

Gibt es eine Funktion, die ein Element anhand der ID oder des Klassennamens in anglejs abrufen kann?



Sie müssen nicht einmal eine Direktive erstellen. Sie können einfach einen Handler wie ng-click hinzufügen. Im schlimmsten Fall können Sie immer die jQuery-Syntax verwenden, wenn Sie das Element wirklich erhalten möchten.
Lucas Holt

Antworten:


187

getElementsByClassNameist eine Funktion im DOM-Dokument. Es ist weder eine jQuery- noch eine jqLite-Funktion.

Fügen Sie bei Verwendung nicht den Punkt vor dem Klassennamen hinzu:

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

Wickeln Sie es in jqLite (oder jQuery, wenn jQuery vor Angular geladen wird):

var wrappedResult = angular.element(result);

Wenn Sie aus der elementVerknüpfungsfunktion einer Direktive auswählen möchten, müssen Sie auf die DOM-Referenz anstelle der jqLite-Referenz zugreifen - element[0]anstelle von element:

link: function (scope, element, attrs) {

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

Alternativ können Sie die document.querySelectorFunktion verwenden (benötigen Sie den Punkt hier, wenn Sie nach Klasse auswählen):

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

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


1
Es kann erwähnenswert sein, dass element.childElementCount innerhalb der Verknüpfungsfunktion 0 sein kann, da Angular noch keine Möglichkeit hatte, die Elemente zu erstellen. Sie sollten daher darauf vorbereitet sein, keine Ergebnisse für element [0] .getElement zu verarbeiten. .
Dylanthepiguy

27

Sie müssen keine hinzufügen .in getElementsByClassName, das heißt

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

Bei der Verwendung angular.elementmüssen Sie jedoch JQuery-Stil-Selektoren verwenden:

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

sollte den Trick machen.

In dieser Dokumentation heißt es außerdem: "Wenn jQuery verfügbar ist, ist angle.element ein Alias ​​für die jQuery-Funktion. Wenn jQuery nicht verfügbar ist, delegiert angle.element an Angulars integrierte Teilmenge von jQuery, die als" jQuery lite "oder" jqLite "bezeichnet wird. ""


Hallo, danke für die Antwort, ich habe das versucht, aber Fehler sagt undefinierte Funktion
Justin

Es könnte funktionieren oder nicht, ja. Bitte überprüfen Sie jetzt meine Antwort (bearbeitet) und Sie werden wahrscheinlich wissen, was zu tun ist.
Ashesh

Wenn die Funktion undefiniert ist, haben Sie wahrscheinlich keine Abfrage geladen. jqlite (das verwendet wird, wenn Sie jquery nicht wie von @Ashesh erwähnt geladen haben) verfügt nicht über alle Funktionen von jquery, und getElementsByClassName ist eine davon.
Haimlit

5
angle.element ('Multi-Dateien'); wird nicht funktionieren. Sie brauchen den Zeitraum.
Philippe Gioseffi

var multibutton = angle.element (document.getElementsByClassName ("Multi-Dateien"));
Salman Lone

20

Die Antwort von @ tasseKATT ist großartig, aber wenn Sie keine Direktive erstellen möchten, warum nicht $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')macht den gleichen Job.
Gabbler

3
Es gibt diesen Fehler in Winkel 1.5.8. "Das Nachschlagen von Elementen über Selektoren wird von jqLite nicht unterstützt"
SP Singh

-4

Wenn Sie die Schaltfläche nur anhand ihres Klassennamens und nur mit jQLite suchen möchten, können Sie Folgendes tun:

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

Hoffe das hilft. :) :)


1
Dies verwendet nicht eckig und jquery, auch falsche Angabe, Sie können in der Tat jquery verwenden, um jqlite zu ersetzen. Dies ist der richtige Weg, dies in einer eckigen Umgebung zu tun, ohne auf das Vanille-Javascript-Element ($ document [0]) zurückzugreifen.
Dennis Bartlett
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.