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,兄弟,我知道我是越轨了,但是没有必要因为被称为“可悲的错误”而如此生气,耶稣爱你,所以不要这样做。这与被冒犯无关,一切都与维护这个网站的尊重性质有关。我一点也不生气。