function getData() { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState == 4 && this.status == 200) { const username = this.responseText; alert("ajx获取用户名:" + this.responseText); // document.getElementById("result").innerHTML = this.responseText; } }; xhttp.open("GET", "getdata.php", true); xhttp.send(); }让此函数内的常量username在javascript内全局可用
时间: 2023-12-11 21:04:32 浏览: 155
可以将 `username` 定义在函数外,这样它就会成为全局变量,可以在函数外的其他地方访问到。例如:
```
let username;
function getData() {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
username = this.responseText;
alert("ajx获取用户名:" + this.responseText);
// document.getElementById("result").innerHTML = this.responseText;
}
};
xhttp.open("GET", "getdata.php", true);
xhttp.send();
}
// 在其他地方可以访问到 username
console.log(username);
```
请注意,由于 AJAX 是异步的,当 `console.log(username)` 执行时,可能 `getData()` 函数还未完成,因此 `username` 可能还没有被赋值。如果需要使用 `username` 的值,应该在 `onreadystatechange` 回调函数内进行操作。
相关问题
function getData() { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { if (xhr.readyState == XMLHttpRequest.DONE) { if (xhr.status == 200) { var jsonData = JSON.parse(xhr.responseText); var root = { id: rootId, name: rootName, children: getChildren(jsonData, rootId) }; buildTree($('#tree tbody'), root.children); // 初始化 treegrid $('#tree').treegrid({ expanderExpandedClass: 'glyphicon glyphicon-minus', expanderCollapsedClass: 'glyphicon glyphicon-plus' }); if (this.readyState == 4 && this.status == 200) { username = this.responseText; alert("ajx获取用户名:" + this.responseText); } else { alert("请求失败:" + xhr.statusText); } } }; xhr.open("GET", "shouquan.php?username=" + username, true); xhr.send(); } }; xhttp.open("GET", "getdata.php", true); xhttp.send(); }我在onreadystatechange回调函数内执行主程序,但是还是无法正确执行
你的代码中存在一个问题,即在第13行(`xhr.open("GET", "shouquan.php?username=" + username, true);`)中使用了 `username` 变量,但是在此之前 `username` 变量并没有被定义。因此,此处的 `username` 值为 undefined,导致请求失败。
解决方案是将获取用户名的代码移动到 `var jsonData = JSON.parse(xhr.responseText);` 的后面,即在获取数据成功后再进行用户名的获取和授权的请求。例如:
```
if (xhr.status == 200) {
var jsonData = JSON.parse(xhr.responseText);
var root = { id: rootId, name: rootName, children: getChildren(jsonData, rootId) };
buildTree($('#tree tbody'), root.children);
// 初始化 treegrid
$('#tree').treegrid({
expanderExpandedClass: 'glyphicon glyphicon-minus',
expanderCollapsedClass: 'glyphicon glyphicon-plus'
});
// 获取用户名和授权
var xhrAuth = new XMLHttpRequest();
xhrAuth.onreadystatechange = function() {
if (xhrAuth.readyState == 4 && xhrAuth.status == 200) {
username = xhrAuth.responseText;
alert("ajx获取用户名:" + username);
// 进行授权请求
var xhrShouquan = new XMLHttpRequest();
xhrShouquan.onreadystatechange = function() {
if (xhrShouquan.readyState == 4 && xhrShouquan.status == 200) {
alert("授权成功");
}
};
xhrShouquan.open("GET", "shouquan.php?username=" + username, true);
xhrShouquan.send();
} else {
alert("请求失败:" + xhrAuth.statusText);
}
};
xhrAuth.open("GET", "getusername.php", true);
xhrAuth.send();
}
```
这样,就可以在获取数据成功后再进行其他操作,避免出现变量未定义的问题。
html:24 Uncaught ReferenceError: onreadystatechange is not defined at 1.html:24:26 (匿名) @ 1.html:24 1.html:68 Access to XMLHttpRequest at 'file:///C:/test.xml' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, isolated-app, chrome-extension, chrome, https, chrome-untrusted. 1.html:23 GET file:///C:/test.xml net::ERR_FAILED (匿名) @
这些错误提示表明你在本地使用了一个跨域请求,而浏览器不允许跨域请求本地文件系统。因此你需要将文件放到一个 web 服务器上,然后通过 HTTP 协议访问它。此外,你还需要正确定义 `onreadystatechange` 函数来处理 AJAX 请求的状态变化。你可以参考下面的代码示例:
```html
<!DOCTYPE html>
<html>
<head>
<title>AJAX Example</title>
<script>
function loadXMLDoc() {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("demo").innerHTML = this.responseText;
}
};
xhttp.open("GET", "test.xml", true);
xhttp.send();
}
</script>
</head>
<body>
<button type="button" onclick="loadXMLDoc()">Load XML</button>
<br><br>
<div id="demo"></div>
</body>
</html>
```
在这个示例中,我们使用了一个按钮元素来触发 AJAX 请求,并且将返回的 XML 数据展示在一个 `div` 元素中。同时,我们还定义了 `onreadystatechange` 函数来处理 AJAX 请求的状态变化,当请求成功返回时,我们使用 `innerHTML` 方法将返回的数据显示在网页上。
阅读全文