我正在使用带有jquery的jsdom,它工作得很好。但是,我正在尝试模块化我的代码,所以我不重复自己,所以我用一些jsdom代码创建了一个基本函数,它接受了一些html(DOM),用jquery调整它,然后将它吐出来。但是,我无法返回结果,因此将其分配给调用var。我可能没有回到正确的地方,但我只是没有看到明显的情况。可以使用一点帮助。
以下是代码:
function tweakIt(html_in){
var jsdom = require('jsdom');
jsdom.env({
html: html_in,
scripts: [
'../public/javascripts/jquery-1.7.1.min.js',
],
done: function(errors, window) {
var $ = window.$;
// do some jquery magic and manipulate the dom
$('body').append('<div>foo</div>');
console.log('Freshly Manipulated HTML: '+ $('body').html()); // it logs perfectly
return $('body').html(); // this isn't returned to where I called tweakIt() from, why not?
}
});
}
var oldhtml = '<html><body><div>some text</div></body></html>';
var newhtml = tweakIt(oldhtml); // never gets set because nothing gets returned, why?
编辑:
这确实是一个异步问题,所以这里是如何使用回调而不是返回来完成的:
function tweakIt(html_in, callback){
var jsdom = require('jsdom');
jsdom.env({
html: html_in,
scripts: [
'../public/javascripts/jquery-1.7.1.min.js',
],
done: function(errors, window) {
var $ = window.$;
// do some jquery magic and manipulate the dom
$('body').append('<div>foo</div>');
console.log('Freshly Manipulated HTML: '+ $('body').html()); // it logs perfectly
callback($('body').html()); // instead of a return, pass the results to the callback
}
});
}
var oldhtml = '<html><body><div>some text</div></body></html>';
var newhtml = tweakIt(oldhtml, function(newstuff){
console.log(newstuff); // woohoo! it works!
});
答案 0 :(得分:5)
我认为你不能使用返回值来执行此操作,因为done:是一个异步函数。 尝试在tweakIt中添加一个回调,并通过将其作为参数发送来获取新的html,例如:
tweakIt(oldHtml, function(newHtml) {/*use the result here*/})
答案 1 :(得分:0)
新版本的JSDOM API不再包含“已完成”和“完成”。回调选项。
所以我写了一个穷人的回调&#39;只有在设置了DOM变量之后才能访问它。
function getSomeDOMVar(callback) {
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const dom = new JSDOM(`
<!DOCTYPE html>
<html>
<body>
<script>
var result; // globally scoped, undefined var, accessible in the node scope as dom.window.result
function doSomething() {
// your code goes here
}
// then assign the data you want back to your the globally scoped var
result = doSomething();
</script>
</body>
</html>
`, {
runScripts: "dangerously",
resources: "usable"
});
// poor man's callback
function waitForVar() {
if (typeof dom.window.result !== 'undefined') {
cb(dom.window.result);
}
}
setTimeout(waitForVar, 1000);
}
getSomeDOMVar(function(result) {
console.log(result)
});
&#13;