如何通过类名或ID获取元素


125

我正在尝试通过angularjs在html中查找元素。

这是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中,是否有任何函数可以通过ID或类名获取元素?



您甚至不必创建指令。只需添加诸如ng-click之类的处理程序即可。最坏的情况是,如果您确实想要获取元素,则可以始终使用jQuery语法。
卢卡斯·霍尔特

Answers:


187

getElementsByClassName是DOM文档上的函数。它既不是jQuery也不是jqLit​​e函数。

使用时不要在类名前添加句号:

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

将其包装在jqLit​​e中(如果在Angular之前加载jQuery,则包装在jQuery中):

var wrappedResult = angular.element(result);

如果要从element指令的链接函数中进行选择,则需要访问DOM引用而不是jqLit​​e引用- 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,因为angular尚未有机会创建元素,因此您应该准备不对element [0] .getElement进行任何处理。 。
Dylanthepiguy

27

您不必添加.in getElementsByClassName,即

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

但是,在使用时angular.element,您必须使用jquery样式选择器:

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

应该可以。

另外,从该文档中 “如果jQuery可用,那么angular.element是jQuery函数的别名。如果jQuery不可用,则angular.element委托给Angular的内置jQuery子集,称为“ jQuery lite”或“ jqLit​​e。 ”


嗨,感谢您的答复,我尝试了一下,但是错误提示未定义函数
贾斯汀

它可能会或可能不会,是的。请现在检查我的答案(进行编辑),您可能会知道该怎么做。
Ashesh 2014年

如果该函数未定义,则可能未加载jquery。jqlite(如果您未按提到的@Ashesh加载jquery时使用)不具有jquery的所有功能,并且getElementsByClassName是其中之一。
haimlit 2014年

5
angular.element('multi-files'); 将无法正常工作。您确实需要期间。
Philippe Gioseffi '16

var multibutton = angular.element(document.getElementsByClassName(“ multi-files”));;
萨尔曼·

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')做同样的工作。
gabbler '16

3
它在角度1.5.8中给出了此错误。“ jqLit​​e不支持通过选择器查找元素”
SP Singh

-4

如果只想通过按钮的类名并仅使用jQLite查找按钮,则可以执行以下操作:

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

希望这可以帮助。:)


1
这不是使用angular和jquery,而且语句不正确,您的确可以使用jquery代替jqlite。这是在有角度的环境中执行此操作的正确方法,而无需深入探讨原始的javascript元素($ document [0])。
丹尼斯·巴特利特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.