Javascript 在异步AJAX回调中访问DOM元素返回未定义的
我运行了一个名为Javascript 在异步AJAX回调中访问DOM元素返回未定义的,javascript,html,Javascript,Html,我运行了一个名为hookUser的函数,每2秒查询一个数据库,以检查用户是否在线,但它会引发以下错误: 无法读取未定义的innerHTML 我怀疑这是因为异步回调不在同一范围内 问题是我无法将button对象传递到回调中,我可以这样做吗?如果没有,是否有其他方法来实现这一点 感谢您的帮助 <script> function hookUser(user) {
hookUser
的函数,每2秒查询一个数据库,以检查用户是否在线,但它会引发以下错误:无法读取未定义的innerHTML
我怀疑这是因为异步回调不在同一范围内
问题是我无法将button对象传递到回调中,我可以这样做吗?如果没有,是否有其他方法来实现这一点
感谢您的帮助
<script>
function hookUser(user)
{
console.log('HOOKED USER: '+user);
setInterval(
function(user)
{
var ajaxurl = 'checkonline.php',
data = {'username':user};
$.post(ajaxurl, data, function (response) {
var button = document.getElementById('button_'+user);
if(response){
console.log(user+'ONLINE');
//button.innerHTML = 'ONLINE';
//button.className = 'btn btn-xs btn-success';
}else{
console.log(user+'ONLINE');
//button.innerHTML = 'OFFLINE';
//button.className = 'btn btn-xs btn-danger';
}
});
},2000);
}
</script>
...
<div class="col-md-3">
<div class="col-md-12 thumb-user " >
<div>
<button id='button_<?php echo $current_user;?>' class='btn btn-xs btn-success' >Unknown</button>
<?php echo '<script>hookUser(\''.$current_user.'\');</script>';?>
...
函数hookUser(用户)
{
log('HOOKED USER:'+USER);
设定间隔(
功能(用户)
{
var ajaxurl='checkonline.php',
数据={'username':用户};
$.post(ajaxurl、数据、函数(响应){
var button=document.getElementById('button_'+user);
如果(答复){
log(用户+‘在线’);
//button.innerHTML='在线';
//button.className='btn btn xs btn success';
}否则{
log(用户+‘在线’);
//button.innerHTML='OFFLINE';
//button.className='btn btn xs btn danger';
}
});
},2000);
}
...
...
尝试在回调之前获取它
...
var button = document.getElementById('button_'+user);
$.post(ajaxurl, data, function (response) {
console.log(button);
...
我的问题是,我试图将一个参数添加到一个无法获取参数的函数中,因此该参数对于用户是未定义的,因此基于用户ID的按钮是未定义的 注意:对于任何试图复制此代码的人,不要这样做,托管站点会认为您正在使用它们,而是立即从DB获取用户的项目,然后将其加载到阵列中
console.log('HOOKED USER: '+user);
setInterval(
function()
{
var ajaxurl = 'checkonline.php',
data = {'username':user};
var button = document.getElementById('button_'+user);
$.post(ajaxurl, data, function (response) {
if(response){
console.log(user+'ONLINE');
button.innerHTML = 'ONLINE';
button.className = 'btn btn-xs btn-success';
}else{
console.log(user+'ONLINE');
button.innerHTML = 'OFFLINE';
button.className = 'btn btn-xs btn-danger';
}
});
},2000);
}
将对按钮的引用作为函数的参数传递。但是,ajax回调没有固定的参数吗?Ie只是响应。在hookUser(user,添加此->btn)中,您传递它正在调用的用户,以及它将影响的按钮。看起来您已经在访问该按钮,但它只是在ajax调用中。只需将其移到
$.ajax()
行上方您上面列出的代码正是我们在澄清您的立场后推荐的代码。请别演戏了。请记住,根据SO的规则,您甚至没有提供最低限度的可用代码来测试您遇到的问题。您遇到的问题是您自己的设计,没有正确地提供代码库。值得深思。不,问题不是在ajax之前声明按钮,而是让用户在setInterval中作为参数,所以是的,你们都错了,这在示例中是显而易见的,但是的,我为你们意识到我们在这里是免费的“戏剧性”道歉,对吗?没有人会因为帮助你而得到报酬,而“戏剧”的一部分是当某人的帮助不能神奇地解决你的问题时的权利和判断。很抱歉,我们未能充分帮助您,但至少我们正在努力帮助您。我鼓励你阅读关于保持尊重语气的规则。很高兴你把它整理好了。祝你有一个美好的一天。我没有资格,我只是惊讶于你这一次非常乐于助人、聪明和知识渊博的人(我不是在讽刺)没有看到短代码片段中非常明显的缺陷,比如,我不惊讶我错过了它,因为a)我没有你们这么聪明,B)js不是我最好的语言,尽管cmon,兄弟,我知道我是越轨了,但是没有必要因为被称为“可悲的错误”而如此生气,耶稣爱你,所以不要这样做。这与被冒犯无关,一切都与维护这个网站的尊重性质有关。我一点也不生气。