从jQuery.get()返回responseText

13

我试图做类似于这样的事情:

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

我原以为msg会被设置为my_script.php返回的文本,即jqXHR对象的responseText。 但实际上并不是这样,因为msg总是被设置为"[object XMLHttpRequest]"

有没有一种快速的方法可以实现我想要的效果?

谢谢。


1
这肯定可以运行,但同步调用显然会阻塞代码执行。如果您需要使用返回的msg值进行操作,通常最好(虽然不总是)在回调函数内部处理它,正如@Vitor-Mello所建议的那样。我猜这取决于您是否可以将代码移动到回调函数内部。 - njr101
@katsuo11 这是最佳解决方案。 - ravi404
你能否将你自己的解决方案添加为答案?这是唯一对我有效的方法。 - Gerhard Burger
4个回答

35
在进行一些测试后,我最终找到了一个解决方案。
我需要调用同步,而$.get简写函数始终是异步的,因此我将需要使用$.ajax,就像这样:
var msg = $.ajax({type: "GET", url: "my_script.php", async: false}).responseText;

我认为没有比这更好的方法了,感谢您的回答。


1
使用这行代码后,我在浏览器控制台中得到了以下信息:jquery-2.2.0.min.js:4 同步 XMLHttpRequest 在主线程上已被弃用,因为它对最终用户的体验有害。如需更多帮助,请查看 https://xhr.spec.whatwg.org/。 - tom

7
你可以始终使用以下方法:

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

如果由于某些原因响应是文本,那么远程脚本可能会将 content-type 更改为类似 JSON 的内容,因此 jQuery 在输出之前会尝试解析该字符串。

我不想要一个带有文本响应的警告框,我希望msg变量实际上设置为文本响应。 - Yann Milin
1
嘿,你更新的代码有两个问题,回调函数内无法访问msg变量,除非在全局声明。但即使这样做,由于调用是异步的,你大多数情况下会在my_script.php调用完成之前尝试使用msg变量。我已经更新了我的问题以反映这一点。谢谢。 - Yann Milin

2

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

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

2
为什么不能只是alert(data)?为什么需要新变量?浪费内存吗? - Tommix

1

响应文本可在成功回调中获得;在那里执行您需要的操作。


问题在于,在成功回调函数中,我无法访问调用$.get()的作用域,例如var msg = '';$.get("my_script.php", function(data){msg = data.responseText});,在回调函数中,无法访问msg。 - Yann Milin
调用一个设置全局值的函数,或者使用闭包来保持对象或模块的值。 - Dave Newton
@DaveNewton,你能否举个例子,在哪里设置全局变量? - Chud37
@Chud37 另外两个答案展示了在成功回调中设置变量。要设置全局变量,不要使用 var 定义你要设置的内容。这很危险,并且非常依赖于时间的运气,除非你是异步执行的,否则就失去了意义。 - Dave Newton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接