Node.js 如何从简单的jsdom函数返回值?
我将jsdom与jquery一起使用,它工作得很好。然而,我正在尝试将代码模块化一点,这样我就不会重复我自己了,所以我用一些jsdom代码制作了一个基本函数,它接受了一些html(DOM),用jquery对其进行了调整,然后将其吐出来。但是,我无法返回结果并将其分配给调用变量。我可能没有返回正确的位置,但我只是没有看到明显的结果。我需要一点帮助 代码如下:Node.js 如何从简单的jsdom函数返回值?,node.js,express,jsdom,Node.js,Express,Jsdom,我将jsdom与jquery一起使用,它工作得很好。然而,我正在尝试将代码模块化一点,这样我就不会重复我自己了,所以我用一些jsdom代码制作了一个基本函数,它接受了一些html(DOM),用jquery对其进行了调整,然后将其吐出来。但是,我无法返回结果并将其分配给调用变量。我可能没有返回正确的位置,但我只是没有看到明显的结果。我需要一点帮助 代码如下: function tweakIt(html_in){ var jsdom = require('jsdom'); jsdom.env
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\u-in){
var jsdom=require('jsdom');
jsdom.env({
html:html_in,
脚本:[
“../public/javascripts/jquery-1.7.1.min.js”,
],
完成:函数(错误,窗口){
var$=窗口。$;
//执行一些jquery魔术并操作dom
$('body')。追加('foo');
console.log('新操作的HTML:'+$('body').HTML());//它可以完美地记录
return$('body').html();//这不会返回到我调用tweakIt()的位置,为什么不呢?
}
});
}
var oldhtml='some text';
var newhtml=tweakIt(oldhtml);//永远不会被设置,因为没有返回,为什么?
编辑:
这确实是一个异步问题,因此下面介绍如何使用回调而不是返回:
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!
});
function-tweakIt(html\u-in,回调){
var jsdom=require('jsdom');
jsdom.env({
html:html_in,
脚本:[
“../public/javascripts/jquery-1.7.1.min.js”,
],
完成:函数(错误,窗口){
var$=窗口。$;
//执行一些jquery魔术并操作dom
$('body')。追加('foo');
console.log('新操作的HTML:'+$('body').HTML());//它可以完美地记录
回调($('body').html());//将结果传递给回调,而不是返回
}
});
}
var oldhtml='some text';
var newhtml=tweakIt(旧HTML,函数(newstuff){
console.log(newstuff);//呜呜!它能用!
});
我不认为您可以使用返回值来实现这一点,因为done:是一个异步函数。
尝试向tweakIt添加回调,并通过将其作为参数发送来获取新的html,例如
tweakIt(oldHtml,function(newHtml){/*在这里使用结果*/})
新版本的jsdomapi不再包含“done”回调选项
所以我写了一个“穷人的回调”,只有在DOM变量被设置之后才能访问它
函数getSomeDOMVar(回调){
const jsdom=require(“jsdom”);
const{JSDOM}=JSDOM;
constdom=newjsdom(`
var result;//全局作用域,未定义的var,在节点作用域中可作为dom.window.result访问
函数doSomething(){
//你的密码在这里
}
//然后将需要的数据分配回全局范围的var
结果=剂量测定();
`, {
运行脚本:“危险”,
资源:“可用”
});
//可怜人的呼唤
函数waitForVar(){
if(typeof dom.window.result!=“未定义”){
cb(dom.window.result);
}
}
setTimeout(waitForVar,1000);
}
getSomeDOMVar(函数(结果){
console.log(结果)
});代码>好,但是如何将新的HTML发送到来自
done:
的回调?不管怎样,我已经解决了。我将编辑我的OP以显示应该如何完成。谢谢假设您在tweakIt函数callback
中命名了第二个参数,那么您可以执行如下操作,而不是在done函数中指定return语句:callback($('body').html())
Yep,我就是这么做的。再次感谢。噢,我忘了dom.window
在节点和浏览器环境之间共享访问权限。谢谢