2014-05-12 17 views
96

Sto cercando di trovare l'elemento in html da angularjs.Come ottenere l'elemento per nome della classe o id

Ecco il codice 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 tasto al nome di classe multi-file, poi ho provato

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

Ma non funziona, e ho cercato element.find ma funziona solo per tag.

C'è qualche funzione che può ottenere l'elemento da id o classname in angularjs?

+0

Forse questo aiuta a: http: // StackOverflow.it/questions/20801843/angularjs-find-element-with-attribute –

+0

Non hai nemmeno bisogno di 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. –

risposta

157

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

Non aggiungere il periodo che precede il nome della classe quando lo si utilizza:

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

avvolgerla in jqLite (o jQuery se jQuery viene caricato prima angolare):

var wrappedResult = angular.element(result); 

Se si desidera per selezionare dal element nella funzione di collegamento di una direttiva è necessario accedere al riferimento DOM invece del riferimento jqLite - element[0] anziché element:

link: function (scope, element, attrs) { 

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

In alternativa è possibile utilizzare la funzione document.querySelector (necessario il periodo di qui se la selezione per classe):

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

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

+0

Può valere la pena notare che all'interno della funzione di collegamento, element.childElementCount può essere 0 perché angular non ha ancora avuto la possibilità di creare gli elementi, quindi dovresti essere pronto a gestire i risultati per l'elemento [0] .getElement. .. – Dylanthepiguy

22

Non è necessario aggiungere un . in getElementsByClassName, vale a dire

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

O semplicemente

angular.element('multi-files'); 

dovrebbe fare il trucco.

Inoltre, da this documentation "Se jQuery è disponibile, angular.element è un alias per la funzione jQuery. Se jQuery non è disponibile, i delegati angular.element al sottoinsieme built-in di angolare di jQuery, chiamato 'jQuery lite' o "jqLite""

+0

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

+0

Potrebbe o potrebbe non funzionare, sì. Per favore controlla la mia risposta ora (fatto un edit) e probabilmente saprai cosa fare. – Ashesh

+0

Se la funzione non è definita, probabilmente non è stato caricato jquery. jqlite (che è usato se non hai caricato jquery come accennato @Ashesh) non ha tutte le funzioni di jquery e getElementsByClassName è uno di questi. – haimlit

-2

Se si vuole trovare il pulsante solo dal suo nome della classe e utilizzando solo jQLite, si può fare come di seguito:

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

Spero che questo aiuti. :)

+1

Non utilizzare mai insieme angolare e JQuery ... –

+1

Questo non usa angolare e jquery, inoltre, statuto errato, si può effettivamente usare jquery per sostituire jqlite. Questo è il modo corretto di farlo in un ambiente angolare, senza scendere all'elemento vanilla javascript ($ document [0]). –

18

@ risposta di tasseKATT è grande, ma se si don' t voglio fare una direttiva, perché non usare $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

+1

'angular.element ('# ID elemento')' fa lo stesso lavoro. – gabbler

+1

Sta dando questo errore in 1.5.8 angolare. "La ricerca di elementi tramite selettori non è supportata da jqLite" – Surinderpal

Problemi correlati