ajax异步请求,但是express req.json 返回数据后,将html字符串插入到元素中出现了引号,可咋办?
使用marked将markdown转换为html
转换后的html字符串
"<p><strong>优秀的美剧学习平台</strong></p><p><br/>是一个美剧的学习交流的平台。</p><p><br/></p>"
后台路由
router.get('/explain', function(req, res) {
if (req.query['WhichExplain'])
{
var filename = '/path/' + req.query['WhichExplain'] + '.md';
fs.readFile(filename, 'utf-8', function(err, data) {
if (err){
console.log(err);
} else {
var text = mark(data);
res.json(text.toString().replace(/\s+/g, '')); // 去除了换行符\n
}
});
}
else // 默认渲染没有问题
{
fs.readFile("/path/default.md", 'utf-8', function (err, data) {
if (err) throw err;
var source = data.toString();
var about_html = mark(source);
res.render('explain', {about_content: about_html});
});
}
});
前台ajax处理响应
function XHRReadyState(xhr, Fun){
return function() {
if (xhr.readyState == 4) {
if ((xhr.status >= 200 && xhr.status < 300 || xhr.status == 304)) {
var content = xhr.responseText;
var explainCont = Fun(); // 返回要插入的div对象
explainCont.innerHTML = content;
}
else
{
console.log('Request was unsuccessful: ' + xhr.status);
}
}
else
{
console.log('正在加载中......' + xhr.readyState);
}
};
}
结果有引号
8 回复
那你request default 会出现引号么?
@leapon 这个直接在ejs上面渲染的不会
在 chrome 的 network 里查一下,看两个情况的返回值有什么不同。
@leapon 默认的渲染后元素标签都正常,ajax请求后返回了字符串,然后元素出现了多余的文本节点
现在只有remove firstChild lastChild 但不知道为什么会多出文本节点,这样的做法感觉不太好
你的后台返回的是一个json的字符串,而不是一个纯的字符串
假设你的json内容是abcdef
,那么res.json后的内容实际是"abdef"
,在前台接受到的时候,你的content实际上是'"abdef"'
那两个引号的出现是因为json把字符串编码了
你需要在前台改为var content = JSON.parse(xhr.responseText);
或者修改后台,使用res.end(text.toString().replace(/\s+/g, ''));
,返回一个纯的字符串而不是json
@rapidhere 感谢,问题找到。
这时候res.send蛮好用的,非要用json么