Làm cách nào để getElementByClass thay vì GetElementById bằng JavaScript?


91

Tôi đang cố gắng chuyển đổi khả năng hiển thị của các phần tử DIV nhất định trên trang web tùy thuộc vào loại của từng DIV. Tôi đang sử dụng một đoạn mã JavaScript cơ bản để chuyển đổi chúng. Vấn đề là tập lệnh chỉ sử dụng getElementById, vì getElementByClasskhông được hỗ trợ trong JavaScript. Và rất tiếc, tôi phải sử dụng lớp chứ không phải id để đặt tên cho các DIV vì tên DIV được tạo động bởi biểu định kiểu XSLT của tôi bằng cách sử dụng một số tên danh mục nhất định.

Tôi biết rằng một số trình duyệt hiện hỗ trợ getElementByClass, nhưng vì Internet Explorer không hỗ trợ nên tôi không muốn đi theo con đường đó.

Tôi đã tìm thấy các tập lệnh sử dụng các hàm để lấy các phần tử theo lớp (chẳng hạn như # 8 trên trang này: http://www.dustindiaz.com/top-ten-javascript/ ), nhưng tôi không thể tìm ra cách tích hợp chúng với kịch bản chuyển đổi của tôi.

Đây là mã HTML. Bản thân các DIV bị thiếu vì chúng được tạo khi tải trang bằng XML / XSLT.

Câu hỏi chính: Làm cách nào để tải tập lệnh Toggle dưới đây để nhận Phần tử theo Lớp thay vì nhận Phần tử theo ID?

<html>

<head>

<!--This is the TOGGLE script-->
<script type="text/javascript">
<!--
    function toggle_visibility(id) {
       var e = document.getElementById(id);
       if(e.style.display == 'block')
          e.style.display = 'none';
       else
          e.style.display = 'block';
    }
//-->
</script>

</head>

<!--the XML/XSLT page contents will be loaded here, with DIVs named by Class separating dozens of li's-->

<a href="#" onclick="toggle_visibility('class1');">Click here to toggle visibility of class 1 objects</a>

<a href="#" onclick="toggle_visibility('class2');">Click here to toggle visibility of class 2 objects</a>

</body>
</html>

3
Tại sao tôi vẫn chưa sử dụng jQuery? Tôi đã lấy đề xuất của @Jonathan Sampson về việc sử dụng jQuery và nó hoạt động! (Câu trả lời của CMS là câu trả lời mà tôi nghĩ rằng tôi đang tìm kiếm, nhưng không thể làm cho nó hoạt động) Tôi đã cấp cho mỗi liên kết một id và với jQuery, tôi có thể xác định lớp nào hiển thị và lớp nào bị ẩn khi bạn nhấp vào liên kết cụ thể. TUYỆT QUÁ! Giải pháp này có vẻ quá tốt là đúng. jQuery có vẻ quá tốt là đúng. Hạn chế của việc sử dụng jQuery là gì? Là một người mới, tại sao tôi lại sử dụng Javascript thay vì jQuery?
Alan

Câu trả lời:


77

Các trình duyệt hiện đại có hỗ trợ cho document.getElementsByClassName. Bạn có thể thấy sự phân hủy hoàn toàn trong đó các nhà cung cấp cung cấp chức năng này tại caniuse . Nếu bạn đang tìm cách mở rộng hỗ trợ cho các trình duyệt cũ hơn, bạn có thể muốn xem xét một công cụ bộ chọn giống như trong jQuery hoặc một polyfill.

Câu trả lời cũ hơn

Bạn sẽ muốn kiểm tra jQuery , điều này sẽ cho phép những điều sau:

$(".classname").hide(); // hides everything with class 'classname'

Google cung cấp tệp nguồn jQuery được lưu trữ, vì vậy bạn có thể tham khảo tệp này và có thể chạy ngay lập tức. Bao gồm những điều sau trong trang của bạn:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript">
  $(function(){
    $(".classname").hide();
  });
</script>

1
Mặc dù tốt, nhưng jQuery được lưu trữ trên Google chỉ hữu ích cho những việc đơn giản nhất, vì tính bảo mật của tập lệnh chéo trang được thực hiện bởi hầu hết các trình duyệt hiện đại.
Paulo Santos

2
Bạn cũng có thể tải xuống tệp nguồn từ jQuery.com và tham chiếu nó cục bộ.
Sampson

21
@Paulo: Không thể áp dụng tập lệnh trên nhiều trang cho <script>thẻ. JQuery được lưu trữ trên Google được thiết kế đặc biệt cho các trang web sản xuất (dưới dạng CDN). Nếu trang web của bạn là https, chỉ cần đảm bảo bạn sử dụng phiên bản https để tránh cảnh báo về nội dung hỗn hợp.
Chetan S 19/12/09

3
Trên thực tế, <script>việc chèn thẻ là cơ sở của các yêu cầu JSONP trên nhiều trang web.
Chetan S

2
Paulo, bạn có nhận ra rằng một khi bạn bao gồm jQuery với thẻ <script>, không có giới hạn trên nhiều trang web không?
Dark Falcon

88

Các getElementsByClassNamephương pháp hiện nay natively hỗ trợ bởi hầu hết các phiên bản gần đây của Firefox, Safari, Chrome, IE và Opera, bạn có thể làm một chức năng để kiểm tra xem một triển khai nguồn gốc có sẵn, nếu không sử dụng phương pháp Dustin Diaz:

function getElementsByClassName(node,classname) {
  if (node.getElementsByClassName) { // use native implementation if available
    return node.getElementsByClassName(classname);
  } else {
    return (function getElementsByClass(searchClass,node) {
        if ( node == null )
          node = document;
        var classElements = [],
            els = node.getElementsByTagName("*"),
            elsLen = els.length,
            pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)"), i, j;

        for (i = 0, j = 0; i < elsLen; i++) {
          if ( pattern.test(els[i].className) ) {
              classElements[j] = els[i];
              j++;
          }
        }
        return classElements;
    })(classname, node);
  }
}

Sử dụng:

function toggle_visibility(className) {
   var elements = getElementsByClassName(document, className),
       n = elements.length;
   for (var i = 0; i < n; i++) {
     var e = elements[i];

     if(e.style.display == 'block') {
       e.style.display = 'none';
     } else {
       e.style.display = 'block';
     }
  }
}

2
Tại sao bạn sử dụng hàm bên trong đó thay vì chỉ sử dụng mã đơn giản?
Tomáš Zato - Phục hồi Monica

-1 ví dụ sử dụng giả sử rằng tất cả các phần tử trên màn hình có hiển thị khối. Trong toggle_visibility, nếu e là <span> thì nó phải là "inline" chứ không phải "block". Một giải pháp nhiều mạnh mẽ hơn là xác định một lớp CSS: .invisible {display: none quan trọng!} Và sử dụng JavaScript (hoặc jQuery) để gán và bỏ chỉ định rằng lớp từ các yếu tố
John Meyer

6
document.getElementsByClassName('CLASSNAME')[0].style.display = 'none';

Thông thường bằng cách sử dụng getElementsByClassName, nó trả về một mảng gồm nhiều lớp. Bởi vì cùng một tên lớp có thể được sử dụng trong nhiều trường hợp bên trong cùng một trang HTML. Chúng tôi sử dụng id phần tử mảng để nhắm mục tiêu lớp chúng tôi cần, trong trường hợp của tôi, đó là trường hợp đầu tiên của tên lớp đã cho. Vì vậy, tôi đã sử dụng [0]


3

Sử dụng nó để truy cập lớp trong Javascript.

<script type="text/javascript">
var var_name = document.getElementsByClassName("class_name")[0];
</script>

2

thêm vào câu trả lời của CMS , đây là một cách tiếp cận chung chung hơn toggle_visibilitymà tôi vừa sử dụng:

function toggle_visibility(className,display) {
   var elements = getElementsByClassName(document, className),
       n = elements.length;
   for (var i = 0; i < n; i++) {
     var e = elements[i];

     if(display.length > 0) {
       e.style.display = display;
     } else {
       if(e.style.display == 'block') {
         e.style.display = 'none';
       } else {
         e.style.display = 'block';
       }
     }
  }
}

1

Giải pháp của tôi:

Đầu tiên, hãy tạo các thẻ "<style>" với một ID.

<style id="YourID">
    .YourClass {background-color:red}
</style>

Sau đó, tôi tạo một hàm trong JavaScript như sau:

document.getElementById('YourID').innerHTML = '.YourClass {background-color:blue}'

Làm việc như một cái duyên đối với tôi.


1
Ngắt dòng ( <br>) là vô dụng / không hợp lệ trong một thẻ phong cách
Chris Forrence

-1

Nối ID vào khai báo lớp

.aclass, #hashone, #hashtwo{ ...codes... }
document.getElementById( "hashone" ).style.visibility = "hidden";
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.