博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
事件监听一直报错Cannot set property 'display' of undefined
阅读量:6440 次
发布时间:2019-06-23

本文共 2241 字,大约阅读时间需要 7 分钟。

  hot3.png

css ↓

.wechatBtn {position: relative;}

.wechat {position: absolute; top: 24px; right: -1px; display: none;}

js ↓

function wechatBlock (){

            var wechat = document.getElementsByClassName('wechat');
            wechat.style.display = 'block';
            console.log('2');
}
function wechatNone (){
            var wechat = document.getElementsByClassName('wechat');
            wechat.style.display = 'none';
            console.log('3');
}
window.onload = function(){
            var wechatBtn = document.getElementsByClassName('wechatBtn');
            wechatBtn.addEventListener('mouseover',wechatBlock);
            wechatBtn.addEventListener('mouseout',wechatNone);
            console.log('1');
}

html ↓

<a class="wechatBtn" href="#">

              关注微信
              <div class="QRcode wechat">
                    <span>
                    订阅号
                    </span>
                    <span>
                    商家服务号
                    </span>
              </div>
</a>

事件监听报错

一直报错Cannot set property 'display' of undefined,终于找到原因,getElementsByClassName('');取出的是一个数组,所以要在后面加上[0],或者用querySelector替代getElementsByClassName('');,所以类似的getElementsByTagName('');等等都会出现这个问题。

所以要这样写:

function wechatBlock (){

            var wechat = document.getElementsByClassName('wechat');
            wechat[0].style.display = 'block';
            console.log('2');
}
function wechatNone (){
            var wechat = document.getElementsByClassName('wechat');
            wechat[0].style.display = 'none';
            console.log('3');
}
window.onload = function(){
            var wechatBtn = document.getElementsByClassName('wechatBtn');
            wechatBtn[0].addEventListener('mouseover',wechatBlock);
            wechatBtn[0].addEventListener('mouseout',wechatNone);
            console.log('1');
}

用jQuery写更简单:

window.onload = function(){

            $('.wechatBtn').mouseover(function(){
                $('.wechat').show();
            });
            $('.wechatBtn').mouseout(function(){
                $('.wechat').hide();
            });
}

jQuery很好,但是却有一个小BUG,确切的说这个BUG应该是浏览器事件冒泡所造成的——那就是对于有子元素的父亲同时使用mouseover和mouseout事件并对其进行效果处理(如fadeIn/Out、slideDown/Up...等等)。

window.onload = function(){

            $('.wechatBtn').mouseover(function(){
                $('.wechat').fadeIn("fast");
            }).mouseout(function(){
                $('.wechat').fadeOut("fast");
            });
}

这段代码把鼠标移入.wechat后,就会来回的显示隐藏造成闪烁。不过还是有办法的,可以用hover代替,对执行的动作延迟处理,这样闪烁的问题就解决了,show()和hide()不需要延迟执行,事件冒泡对他们没有影响。

window.onload = function(){

        $(.wechatBtn).hover(

            function(){

                var $btn =  $('.wechatBtn');

                t = setInterval(function(){

                    $btn.children().slideDown(300);

                },300);

           },function(){

                clearInterval(t);

                $(this).children().slideUp();

           }

        );

}

问题解决了!

转载于:https://my.oschina.net/af666/blog/753796

你可能感兴趣的文章
[python]使用virtualenvWrapper
查看>>
用Aspose.Cells控件读取Excel
查看>>
TCP三次握手四次挥手相关问题探讨
查看>>
iOS 独立开发记录(上)
查看>>
How to add elements to a List in Scala
查看>>
一起学微软Power BI系列-官方文档-入门指南(4)Power BI的可视化
查看>>
Android.util.Log 关于Android开发中打印log
查看>>
转:Python yield 使用浅析 from IBM Developer
查看>>
仪表板颜色
查看>>
NodeJS、NPM安装配置步骤(windows版本)
查看>>
mysql oom之后的page 447 log sequence number 292344272 is in the future
查看>>
chrome禁用某个网站js脚本的执行
查看>>
数组排序 和 二分法查找
查看>>
MongoDB C Driver Building on Windows
查看>>
备忘zookeeper(单机+伪集群+集群)
查看>>
无需编译、快速生成 Vue 风格的文档网站
查看>>
AtomicBoolean介绍与使用
查看>>
Elasticsearch之curl删除
查看>>
Apache Spark 内存管理详解(转载)
查看>>
JS隐藏号码中间4位
查看>>