Skip to main content

在QtScript中问候一下Envjs

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?)。

祝快乐!

Comments

Subscribe to our blog

Try Qt 6.11 Now!

Download the latest release here: www.qt.io/download

Qt 6.11 is now available, with new features and improvements for application developers and device creators.

We're Hiring

Check out all our open positions here and follow us on Instagram to see what it's like to be #QtPeople.