Как получить элемент по имени класса или идентификатору

125

Я пытаюсь найти элемент в html с помощью angularjs.

Вот 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/>

Я пытаюсь получить элемент кнопки по нескольким файлам с именем класса, затем я попробовал

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

Но не работает, и пробовал, element.findно работает только для тега.

Есть ли какая-либо функция, которая может получить элемент по идентификатору или имени класса в angularjs?

Джастин
источник
Может быть, это поможет: stackoverflow.com/questions/20801843/…
Вим Деблаув,
Вам даже не нужно создавать директиву ... вы можете просто добавить обработчик, например ng-click. В худшем случае, если вы действительно хотите получить элемент, вы всегда можете использовать синтаксис jQuery.
Лукас Холт

Ответы:

187

getElementsByClassNameявляется функцией документа DOM. Это не функция jQuery или jqLite.

Не добавляйте точку перед именем класса при его использовании:

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

Оберните его в jqLite (или jQuery, если jQuery загружается до Angular):

var wrappedResult = angular.element(result);

Если вы хотите выбрать из elementфункции ссылки в директиве, вам необходимо получить доступ к ссылке DOM вместо ссылки jqLite - element[0]вместо element:

link: function (scope, element, attrs) {

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

В качестве альтернативы вы можете использовать document.querySelectorфункцию (укажите здесь точку при выборе по классу):

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

Демо: http://plnkr.co/edit/AOvO47ebEvrtpXeIzYOH?p=preview

tasseKATT
источник
1
Возможно, стоит отметить, что внутри функции ссылки element.childElementCount может быть 0, потому что angular еще не имел возможности создать элементы, поэтому вы должны быть готовы иметь дело с отсутствием результатов для element [0] .getElement .. .
Dylanthepiguy
27

Вам не нужно добавлять .в систему getElementsByClassName, т.е.

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

Однако при использовании angular.elementвам нужно использовать селекторы стиля jquery:

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

должен сделать свое дело.

Кроме того, из этой документации: «Если доступен jQuery, angular.element - это псевдоним для функции jQuery. Если jQuery недоступен, angular.element делегирует встроенное подмножество jQuery Angular, называемое« jQuery lite »или« jqLite ». «»

Ashesh
источник
привет, спасибо за ответ, я пробовал, но ошибка говорит о неопределенной функции
Джастин
Это может сработать, а может и не сработать, да. Пожалуйста, проверьте мой ответ сейчас (внесены изменения), и вы, вероятно, будете знать, что делать.
Ashesh
Если функция не определена, вероятно, вы не загружали jquery. jqlite (который используется, если вы не загружали jquery, как упоминалось в @Ashesh) не имеет всех функций, которые есть в jquery, и getElementsByClassName является одной из них.
haimlit
5
angular.element ( 'мульти-файлов'); не сработает. Вам нужен период.
Philippe Gioseffi
var multibutton = angular.element (document.getElementsByClassName ("несколько файлов"));
Salman Lone
20

Ответ @ tasseKATT отличный, но если вы не хотите делать директиву, почему бы не использовать $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
источник
2
angular.element('#Your element id')делает ту же работу.
gabbler
3
Это дает эту ошибку в angular 1.5.8. «Поиск элементов с помощью селекторов не поддерживается jqLite»
С.П. Сингх
-4

Если вы хотите найти кнопку только по имени ее класса и используя только jQLite, вы можете сделать следующее:

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

Надеюсь это поможет. :)

Дебаян Дас
источник
1
Это не использует angular и jquery, а также неправильный статус, вы действительно МОЖЕТЕ использовать jquery для замены jqlite. Это правильный способ сделать это в среде angular, не переходя к ванильному элементу javascript ($ document [0]).
Деннис Бартлетт