2011-01-10 29 views
6

Tôi đang cố gắng tìm một cách hay để thu thập tên của các lớp được định nghĩa trong các bảng định kiểu đi kèm với một tài liệu đã cho. Tôi biết về document.StyleSheetList nhưng có vẻ như không dễ để phân tích cú pháp. Những gì tôi đang tìm kiếm là một cái gì đó giống như, đối với tài liệu biểu định kiểu như:Liệt kê các lớp CSS đã biết bằng cách sử dụng Javascript

.my_class { 
    background: #fff000; 
} 
.second_class { 
    color: #000000; 
} 

Tôi có thể trích xuất một mảng như ["my_class", "second_class"]. Điều này rõ ràng giả định kịch bản thuận lợi của một dom và bảng định kiểu được nạp đầy đủ.

Tôi đã tìm kiếm ở khắp mọi nơi một cách tốt để làm điều gì đó như thế này và cho đến nay, đã có ít tiến bộ. Có ai có bất kỳ ý tưởng về làm thế nào để kéo này đi? Cảm ơn!

+0

Bạn đang tìm kiếm thứ gì đó sẽ hoạt động trong tất cả các trình duyệt, hay đây chỉ là để phát triển? – Prestaul

+0

Bởi "CSS classes", bạn có nghĩa là "Tất cả các selectors bất kể đề cập đến một lớp HTML", "Selectors bao gồm bộ chọn lớp", "Các bit của selectors là selectors class" hay cái gì khác? – Quentin

Trả lời

14

Điều này sẽ hiển thị tất cả các quy tắc được xác định trong biểu định kiểu.

var allRules = []; 
var sSheetList = document.styleSheets; 
for (var sSheet = 0; sSheet < sSheetList.length; sSheet++) 
{ 
    var ruleList = document.styleSheets[sSheet].cssRules; 
    for (var rule = 0; rule < ruleList.length; rule ++) 
    { 
     allRules.push(ruleList[rule].selectorText); 
    } 
} 

Điều, tuy nhiên, là nó bao gồm tất cả quy tắc bất kể là lớp hoặc thẻ hoặc id hoặc bất cứ điều gì ..

Bạn sẽ cần phải giải thích chi tiết hơn những gì bạn muốn xảy ra cho những người không lớp quy tắc (hay quy tắc kết hợp)

+0

Tôi thực sự đã triển khai một cái gì đó khá giống nhau ở cuối (có sẵn tại đây: https://gist.github.com/774111). –

+3

@Fred, chỉ cần liếc qua mã của bạn trong github .. Đối với các lớp được xác định, bạn cần tính đến các trường hợp '.class1.class2',' tag.class' và '# id.class' .. Vì không được sử dụng cẩn thận vì một số lớp có thể được sử dụng từ javascript (* events etc .. *) để chúng không nằm trong DOM khi bạn kiểm tra DOM (* nếu trường hợp đó quan trọng đối với bạn .. *) –

0

Điều gì về

.something .other_something?

Bạn có muốn một nhóm lớp họcNên tồn tại? Hoặc một nhóm các bộ chọn?

Dù sao, bạn đã thử lặp lại thông qua document.styleSheets [i] .cssRules? Nó cung cấp cho bạn văn bản chọn. Phân tích cú pháp đó với một số regexp kungfu sẽ dễ dàng hơn ...

Bạn có cần nó để được crossbrowser?

+0

Tôi thực sự đã sử dụng 'document.styleSheets []. CssRules' trong triển khai của tôi, nhưng kinda giả định có một số cách khác (tôi thực sự nhầm lẫn nghĩ jQuery bao gồm chức năng này - tôi cũng có thể đóng góp nó ngay bây giờ mà tôi đã đi qua nó , Tuy nhiên). –

-2

Bạn có thể đi kèm với jQuery. Ví dụ sẽ là

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script> 
<script> 
    $(document).ready(function(){ 
     var allobjects = $("*") 
    }); 
</script> 

Kiểm tra các trang web jQuery: http://api.jquery.com/all-selector/

+2

Thao tác này sẽ lấy tất cả các phần tử HTML trong tài liệu. Nó sẽ không nói bất cứ điều gì về bản định kiểu. – Quentin

+0

Tôi rất thích câu trả lời này. Không chắc chắn tại sao bỏ phiếu xuống. Bạn có thể bật tất cả các đối tượng tài liệu vào một mảng và đọc các lớp của chúng ... OP đã chỉ ra các lớp được định nghĩa trong các bảng định kiểu đi kèm với một tài liệu đã cho, vì vậy trước tiên bạn cần có các phần tử để quyết định lớp nào được sử dụng trong tài liệu. – Dutchie432

+0

Ồ, tôi thấy sự nhầm lẫn. OP đang cố đọc các kiểu trong tất cả các bảng định kiểu, không phải các lớp trong tất cả các đối tượng tài liệu. Hơi mơ hồ. – Dutchie432

2

Bạn đã đi đúng hướng với document.styleSheets (https://developer.mozilla.org/en/DOM/document.styleSheets)

https://developer.mozilla.org/en/DOM/stylesheet.cssRules

Đây là phương pháp nhanh chóng và dơ bẩn để xuất tất cả các bộ chọn lớpTìm trong bàn điều khiển trong Firefox + Firebug.

var currentSheet = null; 
    var i = 0; 
    var j = 0; 
    var ruleKey = null; 

    //loop through styleSheet(s) 
    for(i = 0; i<document.styleSheets.length; i++){ 
     currentSheet = document.styleSheets[i]; 

     ///loop through css Rules 
     for(j = 0; j< currentSheet.cssRules.length; j++){ 

      //log selectorText to the console (what you're looking for) 
      console.log(currentSheet.cssRules[j].selectorText); 

      //uncomment to output all of the cssRule contents 
      /*for(var ruleKey in currentSheet.cssRules[j]){ 
       console.log(ruleKey +': ' + currentSheet.cssRules[j][ruleKey ]); 
      }*/ 
     } 
    } 
+0

Khi tôi thực hiện việc này, tôi nhận được: 'SecurityError: Thao tác không an toàn. cho (j = 0; j user9645

1

đây có lẽ không phải là điều bạn bạn thực sự muốn được làm trừ như một phần của quá trình tái cấu trúc, nhưng đây là một chức năng mà nên làm những gì bạn muốn:

function getClasses() { 
    var classes = {}; 
    // Extract the stylesheets 
    return Array.prototype.concat.apply([], Array.prototype.slice.call(document.styleSheets) 
     .map(function (sheet) { 
      // Extract the rules 
      return Array.prototype.concat.apply([], Array.prototype.slice.call(sheet.cssRules) 
       .map(function(rule) { 
        // Grab a list of classNames from each selector 
        return rule.selectorText.match(/\.[\w\-]+/g) || []; 
       }) 
      ); 
     }) 
    ).filter(function(name) { 
     // Reduce the list of classNames to a unique list 
     return !classes[name] && (classes[name] = true); 
    }); 
} 
Các vấn đề liên quan