我试过了:
GM_xmlhttpRequest({
method: "GET",
url: "...",
onload: function(response) {
r = response.responseText;
}});
alert(r); //undefined
这是怎么做到的?
答案 0 :(得分:1)
为什么会这样?
默认情况下,使用XMLHTTPRequest的ajax请求是异步的。这意味着对方法的调用立即返回,并且当请求在后台进行时主执行继续。请求完成后,将使用请求的结果调用回调方法。因此,在(异步)请求完成之前执行警报。
解决方案1:回调
您没有提供有关为什么需要同步响应文本的上下文,因此您可以重写代码以使用回调并继续使用异步行为 - 这通常是一种很好的做法。
解决方案2:强制同步请求
但是,如果发现您绝对必须同步发出请求,您会发现可以请求同步进行ajax请求。使用Greasemonkey,您应该在调用synchronous: true
时使用GM_xmlhttpRequest
选项,documented here。请注意,文档说明
注意:整个Firefox UI将被锁定并冻结,直到请求完成。在此模式下,返回值中将提供更多数据。
使用浏览器中的XHR对象,您可以通过passing false
as the second parameter to XMLHTTPRequest#open
获得相同的结果。
如果你正在使用旧版本的Greasemonkey,那么这个SO问题的答案可能会有用:How to make synchronous AJAX calls in greasemonkey?