我使用的尝试使用和的NodeJS上phantomjs服务器端对我们网站的搜索引擎优化。 虽然AJAX工作得很好,我不能够执行,我已经在我的代码中使用自定义的承诺。 如何使phantomJS等到承诺得到解决。 下面是我所编码。
$('body').addClass('before-dom-ready');
$(function() {
$('body').addClass('after-dom-ready');
var dfrd = $.Deferred(),
promise = dfrd.promise();
setTimeout(function() {
dfrd.resolve();
}, 5000);
promise.done(function() {
$('body').addClass('promise-executed');
});
});
phantomJS增加了“前-DOM就绪”和阶级“-DOM就绪后”,但我无法得到“的承诺,执行”类的身体。
PhantomJs不会自动等到所有待处理的脚本结束。 好康#onLoadFinished被称为在onload事件。
至于大部分的脚本,这里的想法是要等到“东西”已完成或真。 我强烈建议你测试waitfor.js 。 这是非常重要的是要了解PhantomJs这个例子。
我想你的例子就是一个例子,但让我提出一个答案。
Html页面
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.10.0.min.js"></script>
<title>Test</title>
</head>
<body id="body">
<script type="text/javascript">
//alert('hello');
$('body').addClass('before-dom-ready');
$(function () {
$('body').addClass('after-dom-ready');
var dfrd = $.Deferred(),
promise = dfrd.promise();
setTimeout(function () {
dfrd.resolve();
}, 5000);
promise.done(function () {
$('body').addClass('promise-executed');
$('body').text('Hello World !');
});
});
</script>
</body>
</html>
PhantomJs脚本
var page = require('webpage').create();
var system = require('system');
function waitFor(testFx, onReady, timeOutMillis) {
var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 10000, //< Default Max Timout is 10s
start = new Date().getTime(),
condition = false,
interval = setInterval(function () {
if ((new Date().getTime() - start < maxtimeOutMillis) && !condition) {
// If not time-out yet and condition not yet fulfilled
condition = (typeof (testFx) === "string" ? eval(testFx) : testFx()); //< defensive code
} else {
if (!condition) {
// If condition still not fulfilled (timeout but condition is 'false')
//console.log("'waitFor()' timeout");
typeof (onReady) === "string" ? eval(onReady) : onReady();
clearInterval(interval);
//phantom.exit(1);
} else {
// Condition fulfilled (timeout and/or condition is 'true')
console.log("'waitFor()' finished in " + (new Date().getTime() - start) + "ms.");
typeof (onReady) === "string" ? eval(onReady) : onReady(); //< Do what it's supposed to do once the condition is fulfilled
clearInterval(interval); //< Stop this interval
}
}
}, 500); //< repeat check every 500ms
};
if (system.args.length != 1) {
console.log('invalid call');
phantom.exit(1);
} else {
//adapt url to your context
page.open('http://localhost:9231/demo.html', function (status) {
if (status !== 'success') {
console.log('Unable to load the address!');
phantom.exit();
} else {
waitFor(
function () {
return page.evaluate(function () {
return $('body').hasClass('promise-executed');
}) > 0;
},
function () {
page.render('page.png');
phantom.exit();
}, 10000);
}
});
}
基本上, waitFor
将检查每500毫秒,如果身体有一个名为类'promise-executed'
。