Lý lịch
Tôi tình cờ gặp câu hỏi này trong khi cố gắng viết các bài kiểm tra tự động, để xác minh rằng một tập hợp các phần tử nhất định trên một trang nhất định đều nhận được một số thuộc tính css do css đặt cho các sự kiện di chuột.
Mặc dù câu trả lời ở trên giải thích một cách hoàn hảo, tại sao không thể chỉ đơn giản kích hoạt sự kiện di chuột bằng JS và sau đó thăm dò một số giá trị css quan tâm, nhưng nó trả lời câu hỏi ban đầu "Làm cách nào để mô phỏng một lần di chuột qua trong JavaScript thuần túy kích hoạt CSS" :bay lượn"?" chỉ một phần.
Khước từ
Đây không phải là một giải pháp hiệu quả. Chúng tôi chỉ sử dụng nó để kiểm tra tự động, nơi hiệu suất không phải là mối quan tâm.
Giải pháp
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();
}
}
Giải trình
createEvent đọc tất cả các tệp css, thay thế: di chuột bằng một chuỗi trống và áp dụng nó. Điều này có tác dụng, tất cả: kiểu di chuột đều được áp dụng. Bây giờ người ta có thể thăm dò để tìm kiểu hú và đặt trở lại trạng thái ban đầu bằng cách dừng Mô phỏng.
Tại sao chúng ta áp dụng hiệu ứng di chuột cho toàn bộ tài liệu chứ không chỉ cho phần tử quan tâm bằng cách lấy từ các trang tính và sau đó thực hiện một element.css (...)?
Xong như vậy, kiểu sẽ được áp dụng nội tuyến, kiểu này sẽ ghi đè các kiểu khác, kiểu này có thể không bị kiểu di chuột css ban đầu ghi đè.
Bây giờ tôi sẽ mô phỏng di chuột như thế nào cho một phần tử?
Đây không phải là hiệu suất, vì vậy tốt hơn không nên. Nếu phải, bạn có thể kiểm tra với element.is (selectorOfInterest) nếu kiểu áp dụng cho phần tử của bạn và chỉ sử dụng những kiểu đó.
Thí dụ
Trong Jasmine, bạn có thể thực hiện:
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
trạng thái trên một phần tử.