【问题标题】:Pass JavaScript function in ajax response在 ajax 响应中传递 JavaScript 函数
【发布时间】:2012-07-13 13:45:55
【问题描述】:

我正在尝试从 AJAX 提交的表单返回回调。用户提交表单,服务器处理并返回有效响应,即错误消息以及可以执行操作的 JavaScript 函数。我正在使用 Zepto.js 回退到 jQuery,具体取决于浏览器。

我的ajax请求是:

$.ajax({
    success: function(data, status, xhr) {
        data.callback();
    },
    url: form.attr('action'),
    data: form.serialize(),
    dataType: 'json'
});

在服务器上我想返回类似:

// PHP code
?>
{
    return: false,
    error: 'Sorry, we couldn’t find an account with that username or password.',
    callback: function() {
        console.log('this is the callback');
    }
}
<?php
// more PHP code

当返回浏览器回调函数时应该触发。我希望服务器返回回调,以便我可以使用相同的 JavaScript 代码并让它相应地响应服务器响应。

我需要将数据类型更改为脚本吗?但是我认为这只是用于加载 .js 文件,而不是代码块。

任何帮助表示赞赏。

【问题讨论】:

  • 通过 ajax 发送回调对于安全来说不是一个好主意。还有 - 为什么你不能选择在 JavaScript 中做什么?
  • @SergeS 我只是想将我的回调消息、操作等保存在服务器上发生的地方更容易。所以我可以将它们全部添加到带有名称或 ID 的 .js 文件中,然后在 PHP 中返回该名称或 ID 并成功调用它?
  • 是的,这是更好的方法(使用开关选择动作,所以不会调用任何不需要的东西)

标签: javascript ajax json callback


【解决方案1】:

这里的一般感觉是我以错误的方式处理这个问题。于是修改代码:

$.ajax({
    success: function(data, status, xhr) {
        var callback = data['callback'];
        callback();
    },
    url: form.attr('action'), // in this example it's badLogin
    data: form.serialize(),
    dataType: 'json'
});
// callback specified in PHP
badLogin: function() {
    console.log('bad login');
}

还有我的 PHP

if (!$valid) {
?>
{
    "return": false,
    "error": "Sorry, we couldn’t find an account with that username or password.",
    "callback": "badLogin"
}
<?php
}

感谢您为我指明正确的方向。

【讨论】:

  • 你没有收到类似“Uncaught TypeError: string is not a function”的错误吗?我愿意。
  • 但我认为你可以做类似 var callback = data['callback']; objectWithBadLoginMethod[回调]();
【解决方案2】:

如果您绝对确定该字符串将始终正确且无法注入任何代码,则您始终可以将代码作为字符串返回并使用eval()

【讨论】:

  • 不幸的是,这基本上是完成此任务的唯一方法。
  • 我已经尝试过这样做,但事实证明它非常有问题。我开始认为我应该使用一种更安全、更“清洁”的完全不同的方法。
  • 我基本上会质疑服务器返回代码的需要。为什么不能只编写一组响应某些参数的函数?在服务器返回消息后,您是否知道可能发生的事情数量有限?
  • @MMM 同意。我在想它会更简单,但无论我以哪种方式实现它,我仍然需要在某处编写函数。
猜你喜欢
  • 2019-06-23
  • 2014-09-03
  • 1970-01-01
  • 2015-08-01
  • 2021-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
相关资源
最近更新 更多