原文链接:Kent Hansen - Say Hello to Envjs for QtScript
在我的在QtScript中伪造一个网页浏览器博文发表之后,一些朋友提到了Envjs。这里引用Envjs网站的一句话:
> Envjs是用一个JavaScript写成的模拟浏览器环境。
胜于伪造,Envjs真正地实现了这些API,所以它们可以工作。
这非常酷!我刚刚把它跑在QtScript之上,这里是两个晚上工作的结果:
http://qt.gitorious.org/qt-labs/qtscript-browser-env
README中提供了适当的细节;简短地说,您可以调试运行Envjs实现(env.js),调用一个函数注册本地的Envjs/QtScript处理器(例如网络和文件访问、异步函数执行以及一些其它事情),以及presto——实时浏览器环境。
例如代码仓库中的examples/document.js
:
document.write("<p>Hello, JavaScript in QtScript!</p>");
document.close();
console.log("p tag's innerHTML:", document.getElementsByTagName("p").item(0).innerHTML);
console.log("document.innerHTML:", document.innerHTML);
输出:
document: HTMLDocument
p tag's innerHTML: Hello, JavaScript in QtScript!
document.innerHTML: <html><head/><body><p>Hello, JavaScript in QtScript!</p></body></html>
而且,prototype.js也工作正常:
var my_div = document.createElement('div');
my_div.addClassName('prototyped').hide();
document.body.appendChild(my_div);
console.log("document.innerHTML:", document.innerHTML);
输出:
document.innerHTML: <html><head/><body><div class="prototyped"/></body></html>
(不太幸运的是,jQuery 1.5.1失败,结果是Result of expression 'ajaxLocParts' [null] is not an object
。)
我实在没有太多的时间去尝试,但发现了一个局限是XMLHttpRequest的responseXML不能工作,所以您最好使用JSON(对于responseText和JSON.parse())。responseXML不能工作的原因是Envjs DOM解析器使用了E4X,它是一个现在仅被Mozilla的JS引擎所支持的语言扩展。(请按您自己的意愿对和JavaScriptCore以及V8有关的建议进行投票,尽管我对此不报期望。)
目前还什么都没有,但是一个深度集成将是非常棒的(没有外部依赖,只是在您的QML/JavaScript中使用这个浏览器环境)。注意QML已经有一个XMLHttpRequest的实现了,并且实现了一个DOM API的子集(用于responseXML),但仅仅如此——一个子集。并且它并不是我们想继续开发的API——但是如果能有一个支持富JS的集成,也很好。也许Envjs是一个方案。
嗯,Envjs 1.2版的大小是680KB(没有缩小的),所以调试运行它并不是没有代价的。这是另外一个要考虑的因素。在V8中,可以把Envjs注入到标准环境中并且把它串行化,希望这样可以大量减少初始化时间。
本项目对于合并请求(merge request)是开放的。目前并不是所有的本地集成都实现了,并且XMLHttpRequest的实现可以被改进。另外还有一些XML解析问题(也许可以使用其它现存的轻型解析器替代现在所依赖的E4X?)。
祝快乐!