2010-02-25 32 views

Trả lời

2

thực sự trông giống như không có cách nào để có được "tất cả các mã nguồn". Bạn có thể sử dụng

document.documentElement.innerHTML 

để lấy bên trongHTML của phần tử trên cùng (thường là html). Nếu bạn có một thông báo lỗi php như

<h3>fatal error</h3> 
segfault 

<html> 
    <head> 
     <title>bla</title> 
     <script type="text/javascript"> 
      alert(document.documentElement.innerHTML); 
     </script> 
    </head> 
    <body> 
    </body> 
</html> 

innerHTML sẽ

<head> 
<title>bla</title></head><body><h3>fatal error</h3> 
segfault  
     <script type="text/javascript"> 
      alert(document.documentElement.innerHTML); 
     </script></body> 

nhưng thông báo lỗi vẫn sẽ giữ lại

chỉnh sửa: documentElement được mô tả ở đây: https://developer.mozilla.org/en/DOM/document.documentElement

+0

Đây có thể là những gì tôi đang tìm kiếm. Tuy nhiên, tôi không hiểu mã ví dụ bạn đã đăng. Khối thứ hai có phải là văn bản được in qua 'cảnh báo' trong khối đầu tiên không? Nếu vậy, tại sao thông báo lỗi đột nhiên xuất hiện bên trong thẻ 'body'? – Franz

+0

yep, khối mã thứ hai là mã đang được cảnh báo. Đó có thể là sự điều chỉnh mã của firefox. Chỉ cần sao chép khối đầu tiên vào một tệp html trống và thử: --) –

+0

Đây không phải là nguồn hoàn chỉnh. Như bạn đã lưu ý, mọi thứ không nằm trong khoảng ' 'và'' sẽ không được đưa vào. Câu trả lời của Lachlan có vẻ là một giải pháp tốt hơn nhiều. – MatrixFrog

1

Có lẽ bạn có thể nhận được nó thông qua DOM, sử dụng

nguồn var = document.getElementsByTagName ("html");

và lấy nguồn sử dụng DOMParser

https://developer.mozilla.org/En/DOMParser

+0

getElementsByTagName (lưu ý: các yếu tố) –

2

Bạn có thể nhận URL với var URL = document.location.href và điều hướng đến "view-source:"+URL.

Bây giờ bạn có thể lấy mã nguồn hoàn toàn (viewsource là id của cơ thể):

var code = document.getElementById('viewsource').innerHTML; 

Vấn đề là mã nguồn được định dạng. Vì vậy, bạn phải chạy strip_tags() và htmlspecialchars_decode() để khắc phục.

Ví dụ, dòng 1 nên là loại tài liệu và dòng 2 sẽ giống như thế:

&lt;<span class="start-tag">HTML</span>&gt; 

Vì vậy, sau strip_tags() nó trở thành:

&lt;HTML&gt; 

Và sau htmlspecialchars_decode(), chúng tôi cuối cùng đã có được kết quả mong đợi:

<HTML> 

Mã không chuyển sang trình phân tích cú pháp DOM để y Bạn cũng có thể xem HTML không hợp lệ.

+0

Hmmm ... có vẻ khá hay. Toàn bộ mã được bao bọc trong một phần tử có ID 'viewsource' hay tại sao bạn làm theo cách đó? Và những gì bạn có nghĩa là "định dạng"? Các thực thể có được thoát không? – Franz

+0

Hãy coi nó như một mã HTML bình thường. Id nội dung là nguồn lượt xem. Tôi đã thêm ví dụ như thế nào nó trông. Tôi hy vọng rằng bạn có một số ý tưởng làm thế nào để đi trang này (bạn có thể làm điều đó với iframe ẩn, ví dụ). – Sagi

+0

Hoặc bạn chỉ có thể sử dụng '.textContent' để thay thế. –

5

Bạn sẽ cần đối tượng xul browser để tải nội dung vào.

Tải phiên bản "xem nguồn:" của trang của bạn vào đối tượng trình duyệt, theo cách tương tự như trình đơn "Xem nguồn trang". Xem hàm viewSource() trong chrome://global/content/viewSource.js. Chức năng đó có thể tải từ bộ nhớ cache, hay không.

Một khi nội dung được tải, nguồn gốc được cho bởi:

var source = browser.contentDocument.getElementById('viewsource').textContent; 

Serialize một DOM Document
Phương pháp này sẽ không nhận được nguồn gốc, nhưng có thể có ích cho một số độc giả.

Bạn có thể tuần tự hóa đối tượng tài liệu thành một chuỗi. Xem Serializing DOM trees to strings trong MDC. Bạn có thể cần sử dụng phương thức khởi tạo thay thế trong tiện ích mở rộng của mình.

Bài viết đó nói về các tài liệu XML, nhưng nó cũng hoạt động trên bất kỳ tài liệu DOMDocument HTML nào.

var serializer = new XMLSerializer(); 
var source = serializer.serializeToString(document); 

Điều này thậm chí hoạt động trong trang web hoặc bảng điều khiển firebug.

+0

Điều này cũng khá hoàn chỉnh. Điều gì xảy ra nếu XHTML bị hỏng do một số lỗi, mặc dù? – Franz

+0

Trình phân tích cú pháp DOM sẽ đã bị xử lý với HTML bị hỏng, vì vậy bộ phân tích sẽ không thấy nguồn bị hỏng. –

+0

Điều đó có thể sẽ là xấu sau đó? Biến 'document' có thuộc tính' textContent' không? – Franz

0

Phần đầu tiên của câu trả lời của Sagi, nhưng thay vào đó hãy sử dụng document.getElementById('viewsource').textContent.

Các vấn đề liên quan