Back to Blog home

在QtScript中问候一下Envjs

Published on Thursday March 10, 2011 by Liang Qi in Labs Qt Qt Script qt-labs-chinese | Comments

原文链接: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集成?

目前还什么都没有,但是一个深度集成将是非常棒的(没有外部依赖,只是在您的QML/JavaScript中使用这个浏览器环境)。注意QML已经有一个XMLHttpRequest的实现了,并且实现了一个DOM API的子集(用于responseXML),但仅仅如此——一个子集。并且它并不是我们想继续开发的API——但是如果能有一个支持富JS的集成,也很好。也许Envjs是一个方案。

开销?

嗯,Envjs 1.2版的大小是680KB(没有缩小的),所以调试运行它并不是没有代价的。这是另外一个要考虑的因素。在V8中,可以把Envjs注入到标准环境中并且把它串行化,希望这样可以大量减少初始化时间。

欢迎贡献

本项目对于合并请求(merge request)是开放的。目前并不是所有的本地集成都实现了,并且XMLHttpRequest的实现可以被改进。另外还有一些XML解析问题(也许可以使用其它现存的轻型解析器替代现在所依赖的E4X?)。

祝快乐!

Subscribe to Our Blog

Stay up to date with the latest marketing, sales and service tips and news.