Cách lấy phần tử theo tên lớp hoặc id


125

Tôi đang cố gắng tìm phần tử trong html bởi angularjs.

Đây 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/>

Tôi đang cố gắng để có được phần tử nút theo nhiều lớp tên, sau đó tôi đã thử

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

Nhưng nó không hoạt động, và đã thử element.find nhưng nó chỉ hoạt động cho thẻ.

Có hàm nào có thể lấy phần tử theo id hoặc classname trong angularjs không?


Có lẽ điều này sẽ giúp: stackoverflow.com/questions/20801843/ từ
Wim Deblauwe

Bạn thậm chí không phải tạo một lệnh .. bạn có thể chỉ cần thêm một trình xử lý như ng-click. Trường hợp xấu nhất, nếu bạn thực sự muốn lấy phần tử, bạn luôn có thể sử dụng cú pháp jQuery.
Lucas Holt

Câu trả lời:


187

getElementsByClassNamelà một chức năng trên Tài liệu DOM. Nó không phải là một hàm jQuery hay jqLite.

Đừng thêm khoảng thời gian trước tên lớp khi sử dụng nó:

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

Gói nó trong jqLite (hoặc jQuery nếu jQuery được tải trước Angular):

var wrappedResult = angular.element(result);

Nếu bạn muốn chọn từ elementchức năng liên kết trong lệnh, bạn cần truy cập tham chiếu DOM thay vì tham chiếu jqLite - element[0]thay vì element:

link: function (scope, element, attrs) {

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

Ngoài ra, bạn có thể sử dụng document.querySelectorchức năng (cần khoảng thời gian ở đây nếu chọn theo lớp):

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

Bản trình diễn: http://plnkr.co/edit/AOvO47ebEvrtpXeIzYOH?p=preview


1
Có thể đáng lưu ý rằng bên trong hàm liên kết, Element.childEuityCount có thể là 0 vì góc không có cơ hội tạo các phần tử, vì vậy bạn nên chuẩn bị để đối phó với không có kết quả nào cho phần tử [0] .getEuity .. .
Dylanthepiguy

27

Bạn không cần phải thêm .vào getElementsByClassName, tức là

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

Tuy nhiên, khi sử dụng angular.element, bạn phải sử dụng các bộ chọn kiểu jquery:

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

nên làm thủ thuật.

Ngoài ra, từ tài liệu này "Nếu jQuery có sẵn, angular.element là bí danh cho hàm jQuery. Nếu jQuery không có sẵn, angular.element ủy nhiệm cho tập hợp con jQuery tích hợp của Angular, được gọi là" jQuery lite "hoặc" jqLite. ""


xin chào, cảm ơn vì đã trả lời, tôi đã thử nó, nhưng lỗi cho biết chức năng không xác định
Justin

Nó có thể hoặc không thể làm việc, vâng. Vui lòng kiểm tra câu trả lời của tôi ngay bây giờ (thực hiện chỉnh sửa) và có thể bạn sẽ biết phải làm gì.
Ashesh

Nếu chức năng không được xác định, có lẽ bạn đã không tải jquery. jqlite (được sử dụng nếu bạn không tải jquery như @Ashesh đã đề cập) không có tất cả các chức năng mà jquery có, và getElementsByClassName là một trong số đó.
haimlit

5
angular.element ('nhiều tập tin'); sẽ không làm việc Bạn cần thời gian.
Philippe Gioseffi

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

20

Câu trả lời của @ tasseKATT là tuyệt vời, nhưng nếu bạn không muốn thực hiện một chỉ thị, tại sao không sử dụng $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;
};

VUN


2
angular.element('#Your element id')làm cùng một công việc.
gabbler

3
Đó là lỗi này ở góc 1.5.8. "Tra cứu các yếu tố thông qua bộ chọn không được jqLite hỗ trợ"
SP Singh

-4

Nếu bạn muốn tìm nút chỉ bằng tên lớp và chỉ sử dụng jQLite, bạn có thể làm như dưới đây:

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

Hi vọng điêu nay co ich. :)


1
Điều này không sử dụng góc và jquery, ngoài ra, thống kê không chính xác, bạn thực sự có thể sử dụng jquery để thay thế jqlite. Đây là cách chính xác để làm điều này trong một môi trường góc cạnh, mà không đi xuống phần tử javascript vanilla ($ document [0]).
Dennis Bartlett
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.