Come ottenere l'elemento per nome classe o ID


125

Sto cercando di trovare l'elemento in html di angularjs.

Ecco l'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/>

Sto cercando di ottenere l'elemento del pulsante con più file di nome classe, quindi ho provato

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

Ma non funziona, e provato element.findma funziona solo per tag.

C'è qualche funzione che può ottenere l'elemento per id o nome classe in angularjs?



Non devi nemmeno creare una direttiva .. potresti semplicemente aggiungere un gestore come ng-click. Nel peggiore dei casi, se vuoi davvero ottenere l'elemento, puoi sempre usare la sintassi jQuery.
Lucas Holt,

Risposte:


187

getElementsByClassNameè una funzione nel documento DOM. Non è né una funzione jQuery né una funzione jqLite.

Non aggiungere il periodo prima del nome della classe quando lo si utilizza:

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

Avvolgilo in jqLite (o jQuery se jQuery è caricato prima di Angular):

var wrappedResult = angular.element(result);

Se si desidera selezionare dalla elementfunzione di collegamento in una direttiva, è necessario accedere al riferimento DOM anziché al riferimento jqLite - element[0]anziché element:

link: function (scope, element, attrs) {

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

In alternativa è possibile utilizzare la document.querySelectorfunzione (è necessario il periodo qui se si seleziona per classe):

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

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


1
Vale la pena notare che all'interno della funzione link, element.childElementCount potrebbe essere 0 perché angular non ha ancora avuto la possibilità di creare gli elementi, quindi dovresti essere pronto a gestire i risultati per element [0] .getElement .. .
Dylanthepiguy

27

Non è necessario aggiungere un .in getElementsByClassName, cioè

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

Tuttavia, quando si utilizza angular.element, è necessario utilizzare i selettori di stile jquery:

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

dovrebbe fare il trucco.

Inoltre, da questa documentazione "Se jQuery è disponibile, angular.element è un alias per la funzione jQuery. Se jQuery non è disponibile, angular.element delega al sottoinsieme incorporato di Angular di jQuery, chiamato" jQuery lite "o" jqLite. ""


ciao, grazie per la risposta, l'ho provato, ma l'errore dice funzione indefinita
Justin

Potrebbe funzionare o meno, sì. Controlla la mia risposta ora (apportata una modifica) e probabilmente saprai cosa fare.
Ashesh,

Se la funzione non è definita, probabilmente non hai caricato jquery. jqlite (che viene utilizzato se non hai caricato jquery come indicato da @Ashesh) non ha tutte le funzioni di jquery e getElementsByClassName è una di queste.
illuminato

5
angular.element ( 'multi-files'); non funzionerà. Hai bisogno del periodo.
Philippe Gioseffi,

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

20

La risposta di @ tasseKATT è ottima, ma se non vuoi fare una direttiva, perché non usarla $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')fa lo stesso lavoro.
gabbler

3
Sta dando questo errore in 1.5.8 angolare. "La ricerca di elementi tramite selettori non è supportata da jqLite"
SP Singh,

-4

Se vuoi trovare il pulsante solo con il nome della sua classe e usando solo jQLite, puoi fare come di seguito:

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

Spero che questo ti aiuti. :)


1
Questo non sta usando angolare e jquery, inoltre, affermazione errata, puoi effettivamente usare jquery per sostituire jqlite. Questo è il modo corretto per farlo in un ambiente angolare, senza scendere all'elemento javascript vanilla ($ document [0]).
Dennis Bartlett,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.