Задний план
Я наткнулся на этот вопрос, пытаясь написать автоматические тесты, чтобы убедиться, что определенный набор элементов на данной странице, все получаемые, имеют некоторый набор свойств css, установленных css для событий при наведении курсора.
Хотя приведенный выше ответ прекрасно объясняет, почему невозможно просто вызвать событие зависания с помощью JS, а затем проверить какое-либо интересующее значение css, он отвечает на первоначальный вопрос «Как имитировать наведение курсора на чистый JavaScript, который активирует CSS». : hover »?" только частично.
Отказ от ответственности
Это неэффективное решение. Мы используем его только для автоматизированного тестирования, когда производительность не имеет значения.
Решение
simulateCssEvent = function(type){
var id = 'simulatedStyle';
var generateEvent = function(selector){
var style = "";
for (var i in document.styleSheets) {
var rules = document.styleSheets[i].cssRules;
for (var r in rules) {
if(rules[r].cssText && rules[r].selectorText){
if(rules[r].selectorText.indexOf(selector) > -1){
var regex = new RegExp(selector,"g")
var text = rules[r].cssText.replace(regex,"");
style += text+"\n";
}
}
}
}
$("head").append("<style id="+id+">"+style+"</style>");
};
var stopEvent = function(){
$("#"+id).remove();
};
switch(type) {
case "hover":
return generateEvent(":hover");
case "stop":
return stopEvent();
}
}
Объяснение
generateEvent читает все файлы css, заменяет: hover пустой строкой и применяет ее. В результате применяются все стили: hover. Теперь можно проверить какой-либо стиль и вернуться в исходное состояние, остановив моделирование.
Почему мы применяем эффект наведения для всего документа, а не только для интересующего элемента, получая из листов и затем выполняя element.css (...)?
Таким образом, стиль будет применен встроенным, это переопределит другие стили, которые не могут быть переопределены исходным стилем наведения CSS.
Как бы я теперь смоделировал наведение для одного элемента?
Это неэффективно, так что лучше не надо. При необходимости вы можете проверить с помощью element.is (selectorOfInterest), применяется ли стиль к вашему элементу, и использовать только эти стили.
пример
В Jasmine вы можете, например, теперь выполнять:
describe("Simulate CSS Event", function() {
it("Simulate Link Hover", function () {
expect($("a").css("text-decoration")).toBe("none");
simulateCssEvent('hover');
expect($("a").css("text-decoration")).toBe("underline");
simulateCssEvent('stop');
expect($("a").css("text-decoration")).toBe("none");
});
});
:hoverустановить состояние элемента.