【问题标题】:Accessing DOM element in async AJAX callback returns undefined [duplicate]在异步 AJAX 回调中访问 DOM 元素返回未定义 [重复]
【发布时间】:2020-04-24 20:52:48
【问题描述】:

我运行一个名为 hookUser 的函数每 2 秒查询一次数据库以检查用户是否在线,但它会引发此错误:

cannot read innerHTML of undefined

我怀疑是因为异步回调不在同一范围内?

问题是我无法将按钮对象传递给该回调,我可以这样做吗?如果没有,还有其他方法可以使这项工作吗?

感谢任何帮助。

            <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>';?>
...

【问题讨论】:

  • 将按钮的引用作为函数的参数传递。
  • 你怎么能这样做呢,ajax回调不是有固定参数吗?即只是响应。
  • 在 hookUser(user, add this -> btn) 中传递它正在调用的用户以及它将影响的按钮。
  • 看起来您已经在访问该按钮,但您只是在 ajax 调用中拥有它。只需将它移到 上方 $.ajax()

标签: javascript html


【解决方案1】:

尽量在回调之前获取

...    
var button = document.getElementById('button_'+user);
$.post(ajaxurl, data, function (response) {
    console.log(button);
    ...

【讨论】:

    【解决方案2】:

    我的问题是我试图将一个参数添加到一个不能接受的函数中,因此该参数未为用户定义,因此基于用户 ID 的按钮未定义。

    注意:对于任何试图复制此代码的人,请不要这样做,托管站点会认为您正在对它们进行 DDOS,而是立即从数据库中获取用户的项目,然后将其加载到数组中。

     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);
                    }
    

    【讨论】:

    • 您上面列出的代码正是在您明确立场后我们推荐的。请把你的戏剧留给我们。请记住,根据 SO 的规则,您没有提供最少的可用代码,甚至无法测试您遇到的问题。您遇到的问题是您自己的设计,没有正确提供代码库。值得深思。
    • 不,问题不在于在 ajax 之前声明按钮,而是将用户作为 setInterval 中的参数,所以是的,你们都错了,那在示例中可见,但是我为“戏剧”道歉
    • 你知道我们在这里是免费的,对吧?没有人会因帮助您而获得报酬,而“戏剧性”的一部分是当某人的帮助不能神奇地解决您的问题时的权利和判断。很抱歉,我们无法为您提供充分的帮助,但至少我们正在努力提供帮助。我鼓励您阅读有关保持尊重语气的规则。很高兴你把事情解决了。祝你有美好的一天。
    • 我没有资格,我只是很惊讶你们非常乐于助人、聪明和知识渊博的人(我不是在讽刺)没有看到那个短代码 sn 中非常明显的缺陷-p,就像,我并不惊讶我错过了它,因为 A) 我没有你们聪明,B) js 不是我最好的语言,尽管兄弟,我知道我不合时宜但没必要因被称为“大错特错”而如此生气,耶稣爱你,我也爱你
    • 这与被冒犯无关,而是与维护本网站的尊重性质有关。我一点也不生气。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 2014-10-26
    • 2018-02-20
    • 1970-01-01
    相关资源
    最近更新 更多