Làm cách nào để lấy phần tử theo lớp trong JavaScript?


226

Tôi muốn thay thế nội dung trong một phần tử html vì vậy tôi đang sử dụng hàm sau cho điều đó:

function ReplaceContentInContainer(id,content) {
   var container = document.getElementById(id);
   container.innerHTML = content;
}

ReplaceContentInContainer('box','This is the replacement text');

<div id='box'></div>

Ở trên hoạt động rất tốt nhưng vấn đề là tôi có nhiều hơn một phần tử html trên một trang mà tôi muốn thay thế nội dung. Vì vậy, tôi không thể sử dụng id nhưng các lớp thay thế. Tôi đã được thông báo rằng javascript không hỗ trợ bất kỳ loại phần tử có sẵn nào theo chức năng lớp. Vậy làm thế nào để mã trên có thể được sửa đổi để làm cho nó hoạt động với các lớp thay vì id?

PS Tôi không muốn sử dụng jQuery cho việc này.

Câu trả lời:


198

Mã này sẽ hoạt động trong tất cả các trình duyệt.

function replaceContentInContainer(matchClass, content) {
    var elems = document.getElementsByTagName('*'), i;
    for (i in elems) {
        if((' ' + elems[i].className + ' ').indexOf(' ' + matchClass + ' ')
                > -1) {
            elems[i].innerHTML = content;
        }
    }
}

Cách thức hoạt động của nó là bằng cách lặp qua tất cả các yếu tố trong tài liệu và tìm kiếm danh sách lớp của chúng matchClass. Nếu một trận đấu được tìm thấy, nội dung được thay thế.

Ví dụ jsFiddle, sử dụng Vanilla JS (nghĩa là không có khung)


5
+1 - Bắt tốt với các khoảng trắng, tôi luôn quên làm điều đó ... sẽ đánh cắp điều đó cho câu trả lời của tôi;) lớp là một từ dành riêng trong javascript; bạn không nên sử dụng nó cho một tên biến mặc dù nó thực sự không gây hại gì (chưa).
Dagg Nợi

1
@ không với chức năng đó, bạn không cần phải có bất kỳ nội dung nào bên trong phần tử bạn muốn thay thế. Bạn có thể có một chuỗi trong đó hoặc bạn có thể có nó trống. Dù bằng cách nào, văn bản thay thế sẽ đột nhiên xuất hiện ở đó khi chức năng được gọi.
Taylor

4
Andrew, @no - Sử dụng classlàm tên biến không hoạt động trong Safari, do đó, hiện tại nó có tác động.
dùng113716

4
Mảng được trả về bởi getElementsBytagName cũng có một thuộc tính độ dài, sau đó kiểm tra className / indexOf cũng được thực hiện. Mặc dù đây không phải là vấn đề trong trường hợp này, một vòng lặp for thường xuyên sẽ đúng hơn.
Wolfgang Stengel

1
thay vì indexOf có khoảng trắng, lưu elems[i].className, nói var cnvà sử dụng cn && cn.match(new RegExp("(^|\\s)" + matchClass + "(\\s|$)"))sẽ hoạt động tốt hơn vì nó khớp với bất kỳ khoảng trắng nào (khoảng trắng, không gian không phá vỡ, tab, v.v.) trong khi cũng cho phép các tên lớp đầu tiên / cuối cùng được khớp. Ví dụ: jsfiddle.net/AXdtH/1636
Supuhstar

178

Tất nhiên, tất cả các trình duyệt hiện đại hiện nay đều hỗ trợ cách đơn giản sau:

var elements = document.getElementsByClassName('someClass');

nhưng được cảnh báo rằng nó không hoạt động với IE8 hoặc trước đó. Xem http://caniuse.com/getelementsbyclassname

Ngoài ra, không phải tất cả các trình duyệt sẽ trả về một thuần NodeList như chúng được yêu cầu.

Có lẽ bạn vẫn nên sử dụng thư viện trình duyệt chéo yêu thích của mình.


Đối với IE8 bạn có thể sử dụng querySelectorAll.
Gras đôi

109
document.querySelectorAll(".your_class_name_here");

Điều đó sẽ hoạt động trong các trình duyệt "hiện đại" thực hiện phương pháp đó (IE8 +).

function ReplaceContentInContainer(selector, content) {
  var nodeList = document.querySelectorAll(selector);
  for (var i = 0, length = nodeList.length; i < length; i++) {
     nodeList[i].innerHTML = content;
  }
}

ReplaceContentInContainer(".theclass", "HELLO WORLD");

Nếu bạn muốn cung cấp hỗ trợ cho các trình duyệt cũ hơn, bạn có thể tải một công cụ chọn độc lập như Sizzle (4KB mini + gzip) hoặc Peppy (10K mini) và quay lại với nó nếu không tìm thấy phương thức truy vấn gốc.

Có phải là quá mức để tải một công cụ chọn chỉ để bạn có thể nhận được các phần tử với một lớp nhất định? Có lẽ. Tuy nhiên, các tập lệnh không quá lớn và bạn có thể thấy công cụ chọn hữu ích ở nhiều nơi khác trong tập lệnh của mình.


@Taylor: Tôi nghĩ rằng nó hoạt động trong IE8 (không chắc chắn 100% - quá lười để google nó). Bất kể, tôi đã thêm một số thông tin về khả năng tương thích ngược bằng cách sử dụng các công cụ chọn bên thứ ba.
Cristian Sanchez

18
document.querySelectorhoạt động trong IE8 trở lên: caniuse.com/queryselector
Zeke

26

Một cách đơn giản và dễ dàng

var cusid_ele = document.getElementsByClassName('custid');
for (var i = 0; i < cusid_ele.length; ++i) {
    var item = cusid_ele[i];  
    item.innerHTML = 'this is value';
}

6

Tôi ngạc nhiên không có câu trả lời bằng cách sử dụng Biểu thức chính quy. Đây là câu trả lời của Andrew khá nhiều , sử dụng RegExp.testthay vì String.indexOf, vì nó dường như hoạt động tốt hơn cho nhiều hoạt động, theo các thử nghiệm của jsPerf .
dường như cũng được hỗ trợ trên IE6 .

function replaceContentInContainer(matchClass, content) {
    var re = new RegExp("(?:^|\\s)" + matchClass + "(?!\\S)"),
        elems = document.getElementsByTagName('*'), i;
    for (i in elems) {
        if (re.test(elems[i].className)) {
            elems[i].innerHTML = content;
        }
    }
}

replaceContentInContainer("box", "This is the replacement text.");

Nếu bạn tìm kiếm cùng một lớp thường xuyên, bạn có thể cải thiện nó bằng cách lưu trữ các biểu thức chính quy (được biên dịch trước) ở nơi khác và chuyển chúng trực tiếp đến hàm, thay vì một chuỗi.

function replaceContentInContainer(reClass, content) {
    var elems = document.getElementsByTagName('*'), i;
    for (i in elems) {
        if (reClass.test(elems[i].className)) {
            elems[i].innerHTML = content;
        }
    }
}

var reBox = /(?:^|\s)box(?!\S)/;
replaceContentInContainer(reBox, "This is the replacement text.");

4

Điều này sẽ hoạt động trong hầu hết các trình duyệt ...

function getByClass (className, parent) {
  parent || (parent=document);
  var descendants=parent.getElementsByTagName('*'), i=-1, e, result=[];
  while (e=descendants[++i]) {
    ((' '+(e['class']||e.className)+' ').indexOf(' '+className+' ') > -1) && result.push(e);
  }
  return result;
}

Bạn sẽ có thể sử dụng nó như thế này:

function replaceInClass (className, content) {
  var nodes = getByClass(className), i=-1, node;
  while (node=nodes[++i]) node.innerHTML = content;
}

3

var elems = document.querySelectorAll('.one');

for (var i = 0; i < elems.length; i++) {
    elems[i].innerHTML = 'content';
};


4
Đó không thực sự là một câu trả lời. Hãy cố gắng giải thích mã của bạn . Hơn nữa, về cơ bản, đây là phiên bản nhỏ gọn hơn của một câu trả lời khác cho câu hỏi này đã được đăng 5 năm trước.
helmbert

Tôi không biết vấn đề là gì. Câu trả lời này là ok. Không có bình luận ... và những gì? Đây không phải là quy tắc vàng. Và những gì bạn muốn bình luận ở đây? Và nó có thể đọc được mã không?
AntiCZ

3

Tôi cho rằng đây không phải là một lựa chọn hợp lệ khi điều này ban đầu được hỏi, nhưng bây giờ bạn có thể sử dụng document.getElementsByClassName('');. Ví dụ:

var elements = document.getElementsByClassName(names); // or:
var elements = rootElement.getElementsByClassName(names);

Xem tài liệu MDN để biết thêm.


0

Tôi nghĩ một cái gì đó như:

function ReplaceContentInContainer(klass,content) {
var elems = document.getElementsByTagName('*');
for (i in elems){
    if(elems[i].getAttribute('class') == klass || elems[i].getAttribute('className') == klass){
        elems[i].innerHTML = content;
    }
}
}

sẽ làm việc


1
nếu bạn chỉ có một số yếu tố trong trang của mình, nếu không thì đây là giải pháp O (N)
jwl

getAttribution ('class') dường như hoạt động trong tất cả trừ IE, sau đó getAttribution ('className') hoạt động trong IE
KeatsKelleher

0

jQuery xử lý việc này dễ dàng.

let element = $(.myclass);
element.html("Some string");

Nó thay đổi tất cả các phần tử .myclass thành văn bản đó.


PS: câu hỏi cho biết "Tôi không muốn sử dụng jQuery cho việc này."
Julian

Ok, tôi đã không nhìn thấy điều đó.
Daniel Høifødt

-15

Khi một số thành phần thiếu ID, tôi sử dụng jQuery như thế này:

$(document).ready(function()
{
    $('.myclass').attr('id', 'myid');
});

Đây có thể là một giải pháp lạ, nhưng có lẽ ai đó thấy nó hữu ích.


3
Nếu có nhiều phần tử với lớp myclass, tất cả chúng sẽ có được id myid, nhưng id phải là duy nhất! Hơn nữa, OP nói rõ ràng để tránh jQuery.
Oriol

1
Không khó để thêm mệnh đề foreach () và ID gia tăng, nếu bạn có nhiều phần tử của cùng một lớp. Tôi đã thêm giải pháp này như một giải pháp thay thế cho những người có thể sử dụng jQuery. OP đã có sẵn một loạt các câu trả lời phù hợp :-)
Krotek
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.