Передумови
Я наткнувся на це питання, намагаючись написати автоматизовані тести, щоб переконатися, що певний набір елементів на даній сторінці, які всі отримують, має певний набір властивостей 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 порожнім рядком і застосовує його. Це призводить до того, що застосовуються стилі all: hover. Тепер можна зондувати стиль з висотою і повернутися до початкового стану, зупинивши моделювання.
Чому ми застосовуємо ефект наведення для всього документа, а не лише для цікавить елемента, отримуючи з аркушів, а потім виконуємо element.css (...)?
Якщо зробити це, стиль буде застосовано вбудовано, це замінить інші стилі, які можуть не бути замінені оригінальним стилем наведення курсора css.
Як я тепер змоделюю наведення для одного елемента?
Це не ефективно, тому краще не робіть. Якщо потрібно, ви можете перевірити елемент.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стан до елемента.