Dim*_*kov 6 javascript asp.net-mvc dom mshtml
我需要在服务器端呈现HTML页面并"提取"canvas元素的原始字节,以便将其保存到PNG.问题是,canvas元素是从javascript创建的(我使用jquery的Flot生成一个图表,基本上).所以我想我需要一种在没有实际使用浏览器的情况下从浏览器"托管"DOM + Javascript功能的方法.我决定使用mshtml(但对任何和所有建议开放),因为它似乎应该能够完全实现.这是一个ASP.NET MVC项目.
我搜索得很远,没有看到任何结论.
所以我有这个简单的HTML - 示例尽可能简单地说明问题 -
<!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>
Run Code Online (Sandbox Code Playgroud)
从浏览器运行时产生预期的输出.
我希望能够将原始HTML加载到内存中,执行javascript函数,然后操作最终的DOM树.我不能使用任何类似System.Windows.WebBrowser的类,因为我的代码需要在服务环境中运行.
所以这是我的代码:
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;
Run Code Online (Sandbox Code Playgroud)
问题是,"beforeScript"和"afterScript"完全相同.IHTMLDocument2实例经历了正常的"未初始化","加载","完成"循环,没有抛出任何错误,没有任何错误.
对于我做错了什么,有人有任何想法吗?完全迷失在这里.
| 归档时间: |
|
| 查看次数: |
8943 次 |
| 最近记录: |