事件監聽一直報錯Cannot set property 'display' of undefined

css ↓css

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

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>ide

事件監聽報錯this

一直報錯Cannot set property 'display' of undefined,終於找到緣由,getElementsByClassName('');取出的是一個數組,因此要在後面加上[0],或者用querySelector替代getElementsByClassName('');,因此相似的getElementsByTagName('');等等都會出現這個問題。spa

因此要這樣寫:code

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

用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();

           }

        );

}

問題解決了!

相關文章
相關標籤/搜索