Чистый javascript, чтобы проверить, что-то зависает (без установки на mouseover/out)
Я видел этот синтаксис jQuery:
if($(element).is(':hover')) { do something}
Поскольку я не использую jQuery, я ищу лучший способ сделать это в чистом javascript.
Я знаю, что могу сохранить глобальную переменную и установить/отключить ее с помощью mouseover
и mouseout
, но мне интересно, есть ли способ проверить собственные свойства элемента через DOM вместо этого? Может быть, что-то вроде этого:
if(element.style.className.hovered === true) {do something}
Кроме того, он должен быть совместим с браузером.
Ответы
Ответ 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;};
}
})();
Ответ 2
Вы можете использовать querySelector для IE >= 8
function isHover(e) {
return (e.parentElement.querySelector(':hover') === e);
}
function isHover(e) {
return (e.parentElement.querySelector(':hover') === e);
}
var myDiv = document.getElementById('mydiv');;
document.addEventListener('mousemove', function checkHover() {
var 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>
Ответ 3
мне пришло в голову, что один из способов проверить, находится ли элемент над зависанием, - установить неиспользуемое свойство в 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>
(функция getStyle
благодаря JavaScript получает стили)
если кто-то может подумать о лучшем качестве css для использования в качестве флага, чем solid/dashed
, пожалуйста, дайте мне знать. предпочтительно свойство будет тем, которое редко используется и не может быть унаследовано.
Ответ 4
Просто использование element.matches(':hover')
, похоже, хорошо работает для меня, вы можете использовать расширенный polyfill для более старых браузеров: https://developer.mozilla.org/en-US/docs/Web/API/Element/matches