PhantomJs不支持bind
方法(Function.prototype.bind
)。您可以查看Issue #10522了解详情。
但您可以在js代码中定义它。一个简单的版本是这样的:
Function.prototype.bind = Function.prototype.bind || function (thisp) {
var fn = this;
return function () {
return fn.apply(thisp, arguments);
};
};
或者您可以使用bind-polyfill。
它有效,但问题是在某些情况下PhantomJs崩溃了。这是我的代码bind
函数,它不是Function
原型的一部分,但它没有改变任何东西,其他版本的结果相同:
var webpage = require('webpage');
var bind = function(fn, scope) {
return function() {
// console.log(fn);
return fn.apply(scope, arguments);
};
};
var WebPage = (function() {
var WebPage = function() {
this.page = webpage.create();
this.page.onConsoleMessage = bind(this.on_console_message, this);
};
WebPage.prototype.open = function(url) {
this.url = url;
this.page.open(url, bind(this.on_open, this));
};
WebPage.prototype.on_open = function(status) {
if(status != 'success') {
console.log('page opening status: ' + status);
phantom.exit();
}
this.page.evaluate(function() {
console.log('here');
});
phantom.exit();
};
WebPage.prototype.on_console_message = function(msg) {
console.log(msg);
};
return WebPage;
})();
page = new WebPage();
var url = 'http://localhost:8000/index.html';
page.open(url);
这是我用python -m SimpleHTTPServer
<!doctype html>
<html>
<head>
<title>Test Page</title>
</head>
<body>
</body>
</html>
> phantomjs test.js
PhantomJS has crashed. Please read the crash reporting guide at https://github.com/ariya/phantomjs/wiki/Crash-Reporting and file a bug report at https://github.com/ariya/phantomjs/issues/new with the crash dump file attached: /tmp/1fb7d785-11ed-5883-6c4f0088-5aa5e04f.dmp
Segmentation fault (core dumped)
如果您在console.log(fn)
函数中取消注释bind
,则可以看到它适用于on_open
方法,但在尝试访问on_console_message
方法时会崩溃。
我在两台机器(Ubuntu 14.04 / x86_64)上使用v1.9.7和1.9.8进行了测试。似乎minidump_stackwalk
不包含有用信息(here是一个转储)