Comment obtenir un élément par nom de classe ou identifiant

125

J'essaye de trouver l'élément en html par angularjs.

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

J'essaie d'obtenir l'élément bouton par nom de classe multi-fichiers, puis j'ai essayé

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

Mais cela ne fonctionne pas, et essayé element.findmais cela ne fonctionne que pour la balise.

Y a-t-il une fonction qui peut obtenir un élément par identifiant ou nom de classe dans angularjs?

Justin
la source
Peut-être que cela aide: stackoverflow.com/questions/20801843/…
Wim Deblauwe
Vous n'avez même pas besoin de créer une directive ... vous pouvez simplement ajouter un gestionnaire comme ng-click. Dans le pire des cas, si vous voulez vraiment obtenir l'élément, vous pouvez toujours utiliser la syntaxe jQuery.
Lucas Holt

Réponses:

187

getElementsByClassNameest une fonction du document DOM. Ce n'est ni une fonction jQuery ni une fonction jqLite.

N'ajoutez pas le point avant le nom de la classe lorsque vous l'utilisez:

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

Enveloppez-le dans jqLite (ou jQuery si jQuery est chargé avant Angular):

var wrappedResult = angular.element(result);

Si vous souhaitez effectuer une sélection elementdans la fonction de lien d'une directive, vous devez accéder à la référence DOM au lieu de la référence jqLite - element[0]au lieu de element:

link: function (scope, element, attrs) {

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

Vous pouvez également utiliser la document.querySelectorfonction (besoin de la période ici si vous sélectionnez par classe):

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

Démo: http://plnkr.co/edit/AOvO47ebEvrtpXeIzYOH?p=preview

tasseKATT
la source
1
Il peut être intéressant de noter qu'à l'intérieur de la fonction de lien, element.childElementCount peut être égal à 0 car angular n'a pas encore eu la possibilité de créer les éléments, vous devez donc être prêt à ne traiter aucun résultat pour l'élément [0] .getElement .. .
Dylanthepiguy
27

Vous n'avez pas besoin d'ajouter un .in getElementsByClassName, c'est- à -dire

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

Cependant, lors de l'utilisation angular.element, vous devez utiliser des sélecteurs de style jquery:

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

devrait faire l'affaire.

Aussi, à partir de cette documentation "Si jQuery est disponible, angular.element est un alias pour la fonction jQuery. Si jQuery n'est pas disponible, angular.element délègue au sous-ensemble intégré de jQuery d'Angular, appelé" jQuery lite "ou" jqLite. ""

Cendre
la source
salut, merci pour la réponse, j'ai essayé cela, mais l'erreur indique une fonction non définie
Justin
Cela pourrait ou non fonctionner, oui. Veuillez vérifier ma réponse maintenant (faites une modification) et vous saurez probablement quoi faire.
Cendre
Si la fonction n'est pas définie, vous n'avez probablement pas chargé jquery. jqlite (qui est utilisé si vous n'avez pas chargé jquery comme @Ashesh l'a mentionné) n'a pas toutes les fonctions de jquery, et getElementsByClassName en fait partie.
haimlit
5
angular.element ('multi-fichiers'); ne fonctionnera pas. Vous avez besoin de la période.
Philippe Gioseffi
var multibutton = angular.element (document.getElementsByClassName ("multi-fichiers"));
Salman Lone le
20

La réponse de @ tasseKATT est excellente, mais si vous ne voulez pas faire de directive, pourquoi ne pas l'utiliser $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
la source
2
angular.element('#Your element id')fait le même travail.
gabbler
3
Il donne cette erreur dans angulaire 1.5.8. "La recherche d'éléments via des sélecteurs n'est pas prise en charge par jqLite"
SP Singh
-4

Si vous voulez trouver le bouton uniquement par son nom de classe et en utilisant uniquement jQLite, vous pouvez faire comme ci-dessous:

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

J'espère que cela t'aides. :)

Debayan Das
la source
1
Cela n'utilise pas angular et jquery, également une déclaration incorrecte, vous POUVEZ en effet utiliser jquery pour remplacer jqlite. C'est la bonne façon de faire cela dans un environnement angulaire, sans descendre à l'élément javascript vanille ($ document [0]).
Dennis Bartlett