在不重新加载和更新当前页面的情况下从服务器接收 ajax 回调中的数据。 Express 4 和节点
Receive data in ajax call back from server without reloading and update current page. Express 4 and Node
我有一个表格
form#form-reflow(action='/', method='post',
onsubmit="docreflow()")
input#textinp(type="text", name="textinp")
input#submit(type="submit", name="submit")
运行以下 ajax 客户端脚本以将表单数据发送到 Express。
function docreflow() {
$('#form-reflow').on('submit', function (evt) {
evt.preventDefault();
$.post($('#form-reflow').attr( 'action' ),
{
data: $("#textinp").val(),
headers: {'X-Requested-With': 'XMLHttpRequest'},
dataType: 'text',
accepts: {
text: 'text/plain'
},
})
.done(function onDone (data) {
console.log("returned data is: ");
var data = JSON.parse(data).data;
console.log(data);
$('#form-reflow').html(data);
}
)
.fail(function onFail(err) {
$('#form-reflow').html("<p> There Wazza Khold Dey</p>");
});
})
}
我希望服务器 POST 方法不重新加载页面。
相反,我想知道如何以 html 形式接收客户端上的数据:
顺便说一句,这是玉。
div#ajaxMsg
p It actually works!
p Data is "#{data}"
从控制器方法中执行类似
的操作
res.render('afterReload.jade', {some data...})
页面不应重新加载,而是在 ajax 完成它应该
只需在此处包含呈现的 html 片段:
$('#form-reflow').html(data);
例如,假设您会写一篇 AJAX api 给纽约时报
NYT api 使用 jsonp 发送回你定义的回调
我可以将这些数据包含在我的当前页面中。
假设我只做了一个 json 渲染。我从服务器发送 json 数据
成功后,该函数将按照我的意愿在客户端附加该数据。
我怎样做一个 'No Reload' AJAX 服务器到客户端的响应?
请随时向我询问进一步的说明。
根据
将 evt 类型更改为 change 不会影响行为。它仍然会重新加载页面。
当前和 POST 页面控制器路由都定义为 '/'
更新
我删除了 html5 onsubmit 事件。不需要:
form#form-reflow(action='/', method='post')
input#textinp(type="text", name="textinp")
input#submit(type="submit", name="submit")
更新#2
This 没有解决我的问题
即使我在该脚本中的函数调用末尾添加 return false;
,
控制器函数:
function ajaxReq(req, res) {
console.log(req.body);
if (req.accepts('text')) {
//#TODO: do something with this to doc reflow instead page reload
res.json({data: req.body.textinp});
}
};
仍然重新加载页面。
我不同意@mccannf 指出它是重复的。
不,它不能解决我的问题。尝试实现一个快速应用程序。您在“/”处使用以 ajax 发布到服务器的表单渲染内容,它应该从 .jade/template 文件中返回 html 片段作为 html 块返回成功的 ajax 调用并替换当前的 html 代替表单。
这是我问题的核心。
更新 #3
我已经能够检查 this out 并进行渲染,但它没有进行部分渲染。
任何人都知道如何在不加载整个页面的情况下在 express 4 中使用它,并且
将值返回给 ajax 调用?
这解决了我的问题,现在它是一个工作页面:
script(src="js/scr.js")
观点是这样的,还有更多:
form#form-reflow(action='/scr')
input#textinp(type="text", name="textinp")
input#submit(type="submit", name="submit")
scr 是没有函数包装器的。例如:
$('#form-reflow').submit(function (e) {
e.preventDefault();
var posting = $.post( $('#form-reflow').attr( 'action' ),
{data:$("#textinp").val()
})
posting.done(
function onDone (val) {
$("#form-reflow").removeAttr('action');
$("#form-reflow")
.html("<p> hello baby " + val.data + "</p>");
});
return false;
});
控制器是:
some_controller = function some_controller(req, res) {
if (req.accepts(['json', 'jsonp'])) {
res.setHeader("Content-Type", "application/json");
var json_data = {data: req.body.data,
};
res.jsonp(json_data);
}
};
app.use('/', some_router);
some_router.post('/scr',some_controller);
因此无需呈现到新页面即可工作。
我有一个表格
form#form-reflow(action='/', method='post',
onsubmit="docreflow()")
input#textinp(type="text", name="textinp")
input#submit(type="submit", name="submit")
运行以下 ajax 客户端脚本以将表单数据发送到 Express。
function docreflow() {
$('#form-reflow').on('submit', function (evt) {
evt.preventDefault();
$.post($('#form-reflow').attr( 'action' ),
{
data: $("#textinp").val(),
headers: {'X-Requested-With': 'XMLHttpRequest'},
dataType: 'text',
accepts: {
text: 'text/plain'
},
})
.done(function onDone (data) {
console.log("returned data is: ");
var data = JSON.parse(data).data;
console.log(data);
$('#form-reflow').html(data);
}
)
.fail(function onFail(err) {
$('#form-reflow').html("<p> There Wazza Khold Dey</p>");
});
})
}
我希望服务器 POST 方法不重新加载页面。
相反,我想知道如何以 html 形式接收客户端上的数据: 顺便说一句,这是玉。
div#ajaxMsg
p It actually works!
p Data is "#{data}"
从控制器方法中执行类似
的操作res.render('afterReload.jade', {some data...})
页面不应重新加载,而是在 ajax 完成它应该 只需在此处包含呈现的 html 片段:
$('#form-reflow').html(data);
例如,假设您会写一篇 AJAX api 给纽约时报 NYT api 使用 jsonp 发送回你定义的回调 我可以将这些数据包含在我的当前页面中。
假设我只做了一个 json 渲染。我从服务器发送 json 数据
成功后,该函数将按照我的意愿在客户端附加该数据。
我怎样做一个 'No Reload' AJAX 服务器到客户端的响应?
请随时向我询问进一步的说明。
根据
将 evt 类型更改为 change 不会影响行为。它仍然会重新加载页面。
当前和 POST 页面控制器路由都定义为 '/'
更新 我删除了 html5 onsubmit 事件。不需要:
form#form-reflow(action='/', method='post')
input#textinp(type="text", name="textinp")
input#submit(type="submit", name="submit")
更新#2
This 没有解决我的问题
即使我在该脚本中的函数调用末尾添加 return false;
,
控制器函数:
function ajaxReq(req, res) {
console.log(req.body);
if (req.accepts('text')) {
//#TODO: do something with this to doc reflow instead page reload
res.json({data: req.body.textinp});
}
};
仍然重新加载页面。
我不同意@mccannf 指出它是重复的。
不,它不能解决我的问题。尝试实现一个快速应用程序。您在“/”处使用以 ajax 发布到服务器的表单渲染内容,它应该从 .jade/template 文件中返回 html 片段作为 html 块返回成功的 ajax 调用并替换当前的 html 代替表单。
这是我问题的核心。
更新 #3
我已经能够检查 this out 并进行渲染,但它没有进行部分渲染。 任何人都知道如何在不加载整个页面的情况下在 express 4 中使用它,并且 将值返回给 ajax 调用?
这解决了我的问题,现在它是一个工作页面:
script(src="js/scr.js")
观点是这样的,还有更多:
form#form-reflow(action='/scr')
input#textinp(type="text", name="textinp")
input#submit(type="submit", name="submit")
scr 是没有函数包装器的。例如:
$('#form-reflow').submit(function (e) {
e.preventDefault();
var posting = $.post( $('#form-reflow').attr( 'action' ),
{data:$("#textinp").val()
})
posting.done(
function onDone (val) {
$("#form-reflow").removeAttr('action');
$("#form-reflow")
.html("<p> hello baby " + val.data + "</p>");
});
return false;
});
控制器是:
some_controller = function some_controller(req, res) {
if (req.accepts(['json', 'jsonp'])) {
res.setHeader("Content-Type", "application/json");
var json_data = {data: req.body.data,
};
res.jsonp(json_data);
}
};
app.use('/', some_router);
some_router.post('/scr',some_controller);
因此无需呈现到新页面即可工作。