【问题标题】:return responseText from jQuery.get()从 jQuery.get() 返回 responseText
【发布时间】:2011-09-29 14:26:36
【问题描述】:

我试图做这样的事情:

var msg = $.get("my_script.php");

我认为 msg 将设置为 my_script.php 返回的文本,即jqXHR 对象的 responseText。 它显然不像那样工作,因为 msg 总是设置为“[object XMLHttpRequest]”

有没有一种快速的 1 行方式来做我想做的事?

谢谢。

【问题讨论】:

  • 这当然可以,但是同步调用显然会阻塞代码执行。如果您需要使用 msg 中返回的值,通常(尽管并非总是)更好地在回调 itslef 中使用它,正如@Vitor-Mello 所建议的那样。猜猜这取决于你是否可以在回调函数中移动你的代码。
  • @katsuo11 这是最好的解决方案
  • 您能添加自己的解决方案作为答案吗?这是唯一对我有用的。

标签: javascript ajax jquery get


【解决方案1】:

经过一些测试,我最终找到了解决方案。

我需要同步调用,$.get 简写函数总是异步的,所以我需要使用 $.ajax,像这样:

var msg = $.ajax({type: "GET", url: "my_script.php", async: false}).responseText;

我认为没有更好的方法可以做到这一点,感谢您的回答。

【讨论】:

  • 通过这一行,我在浏览器控制台中得到以下信息: jquery-2.2.0.min.js:4 主线程上的同步 XMLHttpRequest 已被弃用,因为它对最终用户的体验产生不利影响.如需更多帮助,请查看xhr.spec.whatwg.org
【解决方案2】:

您可以随时使用:

var msg;
$.get("my_script.php", function(text) {
  msg = text;
});

如果由于某种原因响应是文本,远程脚本可能会将内容类型更改为 JSON 之类的内容,因此 jQuery 会在输出给您之前尝试解析字符串。

【讨论】:

  • 我不想要带有文本响应的警报框,我希望将 msg var 实际设置为文本响应
  • 嘿,你更新的代码有两个问题,如果没有全局声明,就无法在回调函数内部访问 msg。但是即使你这样做了,调用是异步的,你还是会在调用 my_script.php 完成之前尝试使用 msg。我更新了我的问题以反映这一点。谢谢。
【解决方案3】:

返回值只是用于 ajax 请求的 jqXHR 对象。要获取响应数据,您需要注册回调。

$.get("my_script.php", function(data) {
  var msg = data;
  alert(msg);
});

【讨论】:

  • 为什么它不能是警报(数据); ?为什么需要新变量?浪费内存?
【解决方案4】:

响应文本在成功回调中可用;在那里做你需要做的事情。

【讨论】:

  • 问题是,在成功回调中,我超出了调用 $.get() 的范围,例如var msg = '';$.get("my_script.php", function(data){msg = data.responseText});,这里在回调函数中,无法访问msg。
  • 调用设置全局值的函数,或者使用闭包来保持对象或模块的值。
  • @DaveNewton 你能举一个设置全局值的例子吗?
  • @Chud37 另外两个答案显示在成功回调中设置变量。要设置全局,请不要使用var 定义您要设置的内容。这是有风险的,并且非常依赖于时机的运气,除非你是异步进行的,这会违背目的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
相关资源
最近更新 更多