当前位置: 代码迷 >> JavaScript >> 从服务器接收ajax回调中的数据,而无需重新加载并更新当前页面。 Express 4和节点
  详细解决方案

从服务器接收ajax回调中的数据,而无需重新加载并更新当前页面。 Express 4和节点

热度:29   发布时间:2023-06-07 16:32:38.0

我有一个表格

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形式在客户端上接收数据:这是jade btw。

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来发送具有定义的Callback的消息,而我只能将该数据包含在当前页面中。

可以说我只做一个json渲染。 从服务器我发送json数据

如果成功,该函数将把数据附加到客户端。

如何对客户端响应进行“不重新加载” AJAX服务器?

随时要求我进一步澄清。

根据

更改evt类型以更改不会影响行为。 仍然会重新加载页面。

当前和POST页面控制器路由都定义为'/'

更新我已经删除了html5 onsubmit事件。 没必要:

  form#form-reflow(action='/', method='post')
    input#textinp(type="text", name="textinp")
    input#submit(type="submit", name="submit")  

更新#2

不能解决我的问题

即使我添加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

我已经能够检查并进行渲染,但是没有进行部分渲染。 有谁知道如何在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);

因此,这无需渲染到新页面即可工作。

  相关解决方案