Làm cách nào để chuẩn hóa HTML trong JavaScript hoặc jQuery?


84

Thẻ có thể có nhiều thuộc tính. Thứ tự các thuộc tính xuất hiện trong mã không quan trọng. Ví dụ:

<a href="#" title="#">
<a title="#" href="#">

Làm cách nào để tôi có thể "bình thường hóa" HTML trong Javascript để thứ tự của các thuộc tính luôn giống nhau? Tôi không quan tâm thứ tự được chọn, miễn là nó luôn giống nhau.

CẬP NHẬT : mục tiêu ban đầu của tôi là làm cho 2 trang HTML khác nhau (trong JavaScript) dễ dàng hơn với những khác biệt nhỏ. Vì người dùng có thể sử dụng phần mềm khác nhau để chỉnh sửa mã nên thứ tự của các thuộc tính có thể thay đổi. Điều này làm cho sự khác biệt quá dài.

TRẢ LỜI : Vâng, đầu tiên cảm ơn vì tất cả các câu trả lời. Và CÓ, nó hoàn toàn có thể. Đây là cách tôi quản lý để làm điều đó. Đây là một bằng chứng về khái niệm, nó chắc chắn có thể được tối ưu hóa:

function sort_attributes(a, b) {
  if( a.name == b.name) {
    return 0;
  }

  return (a.name < b.name) ? -1 : 1;
}

$("#original").find('*').each(function() {
  if (this.attributes.length > 1) {
    var attributes = this.attributes;
    var list = [];

    for(var i =0; i < attributes.length; i++) {
      list.push(attributes[i]);
    }

    list.sort(sort_attributes);

    for(var i = 0; i < list.length; i++) {
      this.removeAttribute(list[i].name, list[i].value);
    }

    for(var i = 0; i < list.length; i++) {
      this.setAttribute(list[i].name, list[i].value);
    }
  }
});

Điều tương tự cho phần tử thứ hai của khác biệt , $('#different'). Bây giờ $('#original').html()$('#different').html()hiển thị mã HTML với các thuộc tính theo cùng một thứ tự.


59
Cần gì cho cái này?
rahul

40
@rahul: thực sự có một nhu cầu khá thú vị cho điều này: nó có thể cải thiện đáng kể việc nén gzip cho các trang của bạn.
haylem

11
ah, trong Javascript ... rất nhiều để nén. Không biết nhu cầu lúc đó là gì.
haylem

13
@Julien: Vào thời điểm mã JavaScript của bạn chạy, trang đã được gửi đến máy khách. Tôi không thấy nó có thể giúp ích như thế nào khi nén.
casablanca

22
Thực sự có một cách sử dụng hợp lệ để cố gắng thực hiện những gì OP yêu cầu. Sử dụng trình soạn thảo WYSIWYG để điều khiển wiki. Dự án mà tôi đang thực hiện thực hiện chính xác điều đó và trình soạn thảo sẽ đảo ngược thứ tự của các thuộc tính mỗi khi bạn chỉnh sửa wiki, dẫn đến những khác biệt không cần thiết. Tôi kết thúc các thuộc tính sắp xếp theo thứ tự bảng chữ cái trong HTML đã gửi trên chương trình phụ trợ trước khi lưu để tránh khác biệt; có thể dễ dàng thực hiện việc sắp xếp đó trong javascript trước khi gửi.
Frank Farmer

Câu trả lời:


68

JavaScript không thực sự thấy một trang web ở dạng HTML dựa trên văn bản, mà là một cấu trúc cây được gọi là DOM hoặc Mô hình đối tượng tài liệu. Thứ tự của các thuộc tính phần tử HTML trong DOM không được xác định (trên thực tế, như nhận xét của Svend, chúng thậm chí không phải là một phần của DOM), vì vậy ý ​​tưởng sắp xếp chúng tại thời điểm JavaScript chạy là không phù hợp.

Tôi chỉ có thể đoán những gì bạn đang cố gắng đạt được. Nếu bạn đang cố gắng làm điều này để cải thiện hiệu suất JavaScript / trang, thì hầu hết các trình kết xuất tài liệu HTML có lẽ đã nỗ lực rất nhiều vào việc tối ưu hóa quyền truy cập thuộc tính, vì vậy, bạn sẽ thu được rất ít.

Nếu bạn đang cố gắng sắp xếp các thuộc tính để làm cho việc nén gzip của các trang hiệu quả hơn khi chúng được gửi qua dây, hãy hiểu rằng JavaScript chạy sau thời điểm đó. Thay vào đó, bạn có thể muốn xem xét những thứ chạy phía máy chủ, mặc dù nó có thể rắc rối hơn mức đáng có.


8
JavaScript có thể chạy phía máy chủ.
Matt Kantor

Các thuộc tính không được coi là một phần của cây tài liệu (sử dụng cách sắp xếp tự nhiên). Vì vậy, trong khi Attr kế thừa giao diện Node, DOM Core 2 chỉ định các trường này là null cho các thuộc tính w3.org/TR/DOM-Level-2-Core/core.html#ID-637646024
Svend

35

Đưa HTML và phân tích cú pháp thành cấu trúc DOM. Sau đó, lấy cấu trúc DOM và viết nó trở lại HTML. Trong khi viết, hãy sắp xếp các thuộc tính bằng cách sử dụng bất kỳ sắp xếp ổn định nào. HTML của bạn bây giờ sẽ được chuẩn hóa theo các thuộc tính.

Đây là một cách chung để bình thường hóa mọi thứ. (phân tích cú pháp dữ liệu chưa chuẩn hóa, sau đó viết lại dữ liệu đó ở dạng chuẩn hóa).

Tôi không chắc tại sao bạn muốn Bình thường hóa HTML, nhưng bạn có nó. Dữ liệu là dữ liệu. ;-)


1
Bạn có một ví dụ mã. Tôi đã cố gắng làm điều gì đó tương tự, nó không hoạt động.
Julien

12

Đây là một bằng chứng về khái niệm, nó chắc chắn có thể được tối ưu hóa:

function sort_attributes(a, b) {
  if( a.name == b.name) {
    return 0;
  }

  return (a.name < b.name) ? -1 : 1;
 }

$("#original").find('*').each(function() {
  if (this.attributes.length > 1) {
    var attributes = this.attributes;
    var list = [];

    for(var i =0; i < attributes.length; i++) {
      list.push(attributes[i]);
    }

     list.sort(sort_attributes);

    for(var i = 0; i < list.length; i++) {
      this.removeAttribute(list[i].name, list[i].value);
    }

     for(var i = 0; i < list.length; i++) {
       this.setAttribute(list[i].name, list[i].value);
    }
  }
 });

Điều tương tự cho phần tử thứ hai của khác biệt, $ ('# khác nhau'). Bây giờ $ ('# original'). Html () và $ ('# khác'). Html () hiển thị mã HTML với các thuộc tính theo cùng một thứ tự.


Tôi nghĩ tốt hơn nếu bạn tạo nội dung html của mình bằng XML và sau đó kết xuất nó bằng xslt. Bạn chắc chắn sẽ nhận được đầu ra đẹp hơn.
Nasaralla

8

bạn có thể thử mở tab HTML trong firebug, các thuộc tính luôn theo thứ tự


4
Điều này không thực sự hữu ích cho riêng mình. Đó là bởi vì nó đang tạo lại HTML từ DOM và tuy nhiên điều này xảy ra có một thứ tự lặp lại thuộc tính cụ thể (hoặc Firebug sắp xếp chúng theo cách thủ công). Julien có thể tận dụng điều này và sử dụng phương pháp tương tự để viết ra HTML.
Matt Kantor vào

5

Thực ra, tôi có thể nghĩ ra một vài lý do chính đáng. Một sẽ là so sánh để đối sánh danh tính và để sử dụng với các công cụ loại 'khác biệt', nơi khá khó chịu khi các dòng tương đương về ngữ nghĩa có thể được đánh dấu là "khác nhau".

Câu hỏi thực sự là "Tại sao trong Javascript"?

Câu hỏi này "có mùi" "Tôi có một vấn đề và tôi nghĩ tôi có câu trả lời ... nhưng tôi cũng có vấn đề với câu trả lời của mình."

Nếu OP giải thích lý do tại sao họ muốn làm điều này, cơ hội nhận được câu trả lời tốt của họ sẽ tăng lên đáng kể.


2

Câu hỏi "Cần gì cho cái này?" Trả lời: Nó làm cho mã dễ đọc hơn và dễ hiểu hơn.

Tại sao hầu hết giao diện người dùng đều tệ ... Nhiều lập trình viên không hiểu sự cần thiết của việc đơn giản hóa công việc của người dùng. Trong trường hợp này, công việc của người dùng là đọc và hiểu mã. Một lý do để đặt hàng các thuộc tính là vì con người phải gỡ lỗi và duy trì mã. Một danh sách có thứ tự, mà chương trình trở nên quen thuộc, giúp công việc của anh ta dễ dàng hơn. Anh ta có thể nhanh chóng tìm thấy thuộc tính hoặc nhận ra thuộc tính nào bị thiếu và thay đổi giá trị thuộc tính nhanh hơn.


Methinks bạn đã không nghĩ về câu hỏi đủ lâu; ngay cả một giải pháp hiệu quả cho câu hỏi sẽ không giải quyết được những gì bạn nói ở đây, mặc dù nó có thể đúng.
Issa marie tseng

Tại sao bạn cho rằng OP muốn làm điều này với Javascript? Có thể bạn đã nghĩ đến giải pháp Javascript phía máy chủ (thời gian xây dựng?), Nhưng không chắc ai đó đủ kinh nghiệm để làm điều đó sẽ không đề cập đến nó trong một bài đăng Stackoverflow. Cũng có thể OP đang triển khai trình chỉnh sửa HTML trong trình duyệt, nhưng điều đó cũng có vẻ nghi ngờ.
Pointy

0

Điều này chỉ quan trọng khi ai đó đang đọc nguồn, vì vậy đối với tôi đó là thuộc tính ngữ nghĩa trước, ít ngữ nghĩa hơn tiếp theo ...

Tất nhiên vẫn có ngoại lệ, nếu bạn có ví dụ: liên tiếp của <li>, tất cả đều có một thuộc tính trên mỗi thuộc tính và các thuộc tính khác chỉ trên một số, bạn có thể muốn đảm bảo các thuộc tính được chia sẻ đều ở đầu, tiếp theo là các thuộc tính riêng lẻ, ví dụ: .

<li a = "x"> A </li>
<li a = "y" b = "t"> B </li>
<li a = "z"> C </li>

(Ngay cả khi thuộc tính "b" hữu ích hơn về mặt ngữ nghĩa so với "a")

Bạn có được ý tưởng.


0

Tôi nghĩ thực sự có thể xảy ra nếu nội dung html được chuyển dưới dạng xml và được hiển thị qua xslt ... do đó, nội dung gốc của bạn trong XML có thể theo bất kỳ thứ tự nào bạn muốn.

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.