Як отримати елемент за назвою класу чи ідентифікатором


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але працює лише для тегів.

Чи є якась функція, яка може отримати елемент за id або classname у angularjs?


Може бути , це допомагає: stackoverflow.com/questions/20801843 / ...
Wim Deblauwe

Вам навіть не потрібно створювати директиву. Ви можете просто додати обробник, наприклад, ng-click. Найгірший випадок, якщо ви дійсно хочете отримати елемент, ви завжди можете використовувати синтаксис jQuery.
Лукас Холт

Відповіді:


187

getElementsByClassNameє функцією в документі DOM. Це не є ні jQuery, ні функцією jqLite.

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

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

Оберніть його в jqLite (або jQuery, якщо jQuery завантажено перед кутовим):

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


1
Можливо, варто відзначити, що всередині функції посилання element.childElementCount може бути 0, оскільки кутовий ще не мав шансу створити елементи, тому ви повинні бути готові мати справу з результатами для елемента [0] .getElement .. .
Ділантхепігуй

27

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

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

Однак під час використання angular.elementвам потрібно використовувати селектори jquery style:

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

повинен зробити трюк.

Також з цієї документації "Якщо jQuery доступний, angular.element є псевдонімом функції jQuery. Якщо jQuery недоступний, angular.element делегує вбудованому підмножину jQuery вбудований підмножину jQuery, який називається" jQuery lite "або" jqLite ". ""


привіт, дякую за відповідь, я спробував це, але помилка говорить про невизначену функцію
Джастін

Це може чи не спрацює, так. Будь ласка, перевірте мою відповідь зараз (зробив редагування), і ви, ймовірно, будете знати, що робити.
Попел

Якщо функція не визначена, ви, ймовірно, не завантажували jquery. jqlite (який використовується, якщо ви не завантажували jquery як згаданий @Ashesh) не має всіх функцій, які має jquery, і getElementsByClassName є однією з них.
хаїмліт

5
angular.element ('мультифайли'); не буде працювати. Вам потрібен період.
Філіп Джозеффі

var multibutton = angular.element (document.getElementsByClassName ("мультифайли"));
Салман Лоне

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;
};

ПЛУНКР


2
angular.element('#Your element id')виконує ту саму роботу.
габлер

3
Це помилка дає кутну 1.5.8. "Пошук елементів через селектори jqLite не підтримується"
SP Singh

-4

Якщо ви хочете знайти кнопку лише за назвою її класу та лише за допомогою jQLite, ви можете зробити наступне:

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

Сподіваюся, це допомагає. :)


1
Тут не використовуються кутові та jquery, а також неправильний відрезок, ви дійсно можете використовувати jquery для заміни jqlite. Це правильний спосіб зробити це в кутовому середовищі, не спускаючись до елемента JavaScript ванілі ($ document [0]).
Денніс Бартлетт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.