Tôi cần hiển thị một trang HTML phía máy chủ và "trích xuất" các byte thô của phần tử canvas để tôi có thể lưu nó vào PNG. Vấn đề là, phần tử canvas được tạo ra từ javascript (tôi đang sử dụng Flot của jquery để tạo ra một biểu đồ, về cơ bản). Vì vậy, tôi đoán tôi cần một cách để "lưu trữ" chức năng DOM + Javascript từ trình duyệt mà không thực sự sử dụng trình duyệt. Tôi định cư trên mshtml (nhưng mở cho bất kỳ và tất cả các gợi ý) vì có vẻ như nó sẽ có thể chính xác điều đó. Đây là một dự án ASP.NET MVC.Hiển thị HTML + Javascript phía máy chủ
Tôi đã tìm kiếm xa và rộng và chưa thấy bất kỳ điều gì kết luận.
Vì vậy, tôi có HTML đơn giản này - ví dụ như giữ đơn giản càng tốt để chứng minh vấn đề -
<!DOCTYPE html>
<html>
<head>
<title>Wow</title>
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.1.min.js" type="text/javascript"></script>
</head>
<body>
<div id="hello">
</div>
<script type="text/javascript">
function simple()
{
$("#hello").append("<p>Hello</p>");
}
</script>
</body>
</html>
trong đó sản xuất sản lượng dự kiến khi chạy từ trình duyệt.
Tôi muốn có thể tải HTML gốc vào bộ nhớ, thực thi hàm javascript, sau đó thao tác cây DOM cuối cùng. Tôi không thể sử dụng bất kỳ lớp System.Windows.WebBrowser giống như mã của tôi cần chạy trong một môi trường dịch vụ.
Vì vậy, đây là mã của tôi:
IHTMLDocument2 domRoot = (IHTMLDocument2)new HTMLDocument();
using (WebClient wc = new WebClient())
{
using (var stream = new StreamReader(wc.OpenRead((string)url)))
{
string html = stream.ReadToEnd();
domRoot.write(html);
domRoot.close();
}
}
while (domRoot.readyState != "complete")
Thread.Sleep(SleepTime);
string beforeScript = domRoot.body.outerHTML;
IHTMLWindow2 parentWin = domRoot.parentWindow;
parentWin.execScript("simple");
while (domRoot.readyState != "complete")
Thread.Sleep(SleepTime);
string afterScript = domRoot.body.outerHTML;
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(domRoot);
domRoot = null;
Vấn đề là, "beforeScript" và "afterScript" là giống hệt nhau. Ví dụ IHTMLDocument2 đi qua chu trình "uninitialized", "loading", "complete" bình thường, không có lỗi nào được ném ra, không có gì.
Bất kỳ ai có bất kỳ ý tưởng nào về những gì tôi đang làm sai? Hoàn toàn bị mất ở đây.
Cảm ơn đã dành thời gian để trả lời, nhưng tôi sẽ không đồng ý với những gì bạn nói - liên quan đến "không có ý định ". Khu vực có thể xem của trình duyệt (cửa sổ) phải là (và) tách biệt với công cụ DOM/Javascript bên trong của trình duyệt. Tại sao nó lại quan trọng khi kết quả được hiển thị? Tại sao DOM + CSS + Javascript không thể hiển thị ở bất kỳ vị trí nào trong bộ nhớ? Trong thực tế, có một ví dụ về Node.js tương tác với Flot để làm chính xác những gì tôi muốn làm - tạo ra một biểu đồ phía máy chủ. Đáng buồn thay, tôi không thể sử dụng Node.js ... –
Về những gì tôi cần làm trên máy chủ - tôi cần, định kỳ, tạo biểu đồ (hiện tại, sử dụng Flot) trong môi trường không đầu, không tương tác. Biểu đồ phải giống y hệt như khi người dùng đang xem trang web trong trình duyệt. Đây là một dự án ASP.NET MVC, tôi đã không tìm thấy bất kỳ điều khiển phía máy chủ/thành phần để làm điều này một cách dễ dàng. –
Vâng, về cơ bản bạn đã đúng. Nó thực sự làm cho tinh thần để làm cho DOM + CSS + Javascript bất cứ nơi nào vào bộ nhớ. Tuy nhiên, tôi hy vọng điều này sẽ hoạt động với trình duyệt, không thể tải được trong phiên không tương tác. Dù sao, tôi chúc bạn may mắn, nếu bạn sẽ tiếp tục với điều này. –