68

私はこのjQuery構文を見てきました:

if($(element).is(':hover')) { do something}

私はjQueryを使用していないので、純粋なjavascriptでこれを行う最良の方法を探しています.

mouseoverグローバル変数を保持し、 andを使用して設定/設定解除できることは知っていmouseoutますが、代わりにDOMを介して要素のネイティブプロパティを検査する方法があるかどうか疑問に思っていますか? 多分このようなもの:

if(element.style.className.hovered === true) {do something}

また、ブラウザ間の互換性が必要です。

4

4 に答える 4

64

IE> = 8の場合はquerySelector を使用できます:

const isHover = e => e.parentElement.querySelector(':hover') === e;    

const myDiv = document.getElementById('mydiv');
document.addEventListener('mousemove', function checkHover() {
  const hovered = isHover(myDiv);
  if (hovered !== checkHover.hovered) {
    console.log(hovered ? 'hovered' : 'not hovered');
    checkHover.hovered = hovered;
  }
});
.whyToCheckMe {position: absolute;left: 100px;top: 50px;}
<div id="mydiv">HoverMe
  <div class="whyToCheckMe">Do I need to be checked too?</div>
</div>

フォールバックするには、@Kolinkの回答で大丈夫だと思います。

于 2013-02-10T17:11:41.760 に答える
8

まず、どの要素がホバーされているかを追跡する必要があります。これを行う1つの方法は次のとおりです。

(function() {
    var matchfunc = null, prefixes = ["","ms","moz","webkit","o"], i, m;
    for(i=0; i<prefixes.length; i++) {
        m = prefixes[i]+(prefixes[i] ? "Matches" : "matches");
        if( document.documentElement[m]) {matchfunc = m; break;}
        m += "Selector";
        if( document.documentElement[m]) {matchfunc = m; break;}
    }
    if( matchfunc) window.isHover = function(elem) {return elem[matchfunc](":hover");};
    else {
        window.onmouseover = function(e) {
            e = e || window.event;
            var t = e.srcElement || e.target;
            while(t) {
                t.hovering = true;
                t = t.parentNode;
            }
        };
        window.onmouseout = function(e) {
            e = e || window.event;
            var t = e.srcElement || e.target;
            while(t) {
                t.hovering = false;
                t = t.parentNode;
            }
        };
        window.isHover = function(elem) {return elem.hovering;};
   }
})();
于 2013-02-10T06:19:15.193 に答える
6

要素がホバーされているかどうかを確認する1つの方法は、css:hoverで未使用のプロパティを設定し、そのプロパティがjavascriptに存在するかどうかを確認することです。dom-native hover プロパティを使用していないため、問題の適切な解決策ではありませんが、私が考えることができる最も近い、最も最小限の解決策です。

<html>
    <head>
        <style type="text/css">
#hover_el
{   
    border: 0px solid blue;
    height: 100px;
    width: 100px;
    background-color: blue;
}   
#hover_el:hover
{   
    border: 0px dashed blue;
}
        </style>
        <script type='text/javascript'>
window.onload = function() {check_for_hover()};
function check_for_hover() {
    var hover_element = document.getElementById('hover_el');
    var hover_status = (getStyle(hover_element, 'border-style') === 'dashed') ? true : false;
    document.getElementById('display').innerHTML = 'you are' + (hover_status ? '' : ' not') + ' hovering';
    setTimeout(check_for_hover, 1000);
};
function getStyle(oElm, strCssRule) {
    var strValue = "";
    if(document.defaultView && document.defaultView.getComputedStyle) {
        strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule);
    }
    else if(oElm.currentStyle) {
        strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1) {
            return p1.toUpperCase();
        });
        strValue = oElm.currentStyle[strCssRule];
    }
    return strValue;
};
        </script>
    </head>
    <body>
        <div id='hover_el'>hover here</div>
        <div id='display'></div>
    </body>
</html>

( JavaScript get StylesgetStyleのおかげで機能します)

誰かがフラグとして使用するより良い css プロパティを考えられる場合は、solid/dashed私に知らせてください。プロパティは、めったに使用されず、継承できないものであることが望ましいです。

于 2013-02-10T13:08:05.020 に答える