mouseover
Chromeでシミュレートするコードを見つけようとしていますが、「マウスオーバー」リスナーが起動されても、CSSの「ホバー」宣言が設定されることはありません。
私もやってみました:
//Called within mouseover listener
theElement.classList.add("hover");
しかし、要素をそのhover
宣言で宣言されているものに変更するものは何もないようです。
これは可能ですか?
mouseover
Chromeでシミュレートするコードを見つけようとしていますが、「マウスオーバー」リスナーが起動されても、CSSの「ホバー」宣言が設定されることはありません。
私もやってみました:
//Called within mouseover listener
theElement.classList.add("hover");
しかし、要素をそのhover
宣言で宣言されているものに変更するものは何もないようです。
これは可能ですか?
回答:
できません。信頼できるイベントではありません。
ユーザー操作の結果として、またはDOMの変更の直接の結果として、ユーザーエージェントによって生成されたイベントは、DocumentEvent.createEventを介してスクリプトによって生成されたイベントに付与されない特権を持つユーザーエージェントによって信頼されます。 ( "Event")メソッド、Event.initEvent()メソッドを使用して変更、またはEventTarget.dispatchEvent()メソッドを介してディスパッチされます。信頼できるイベントのisTrusted属性の値はtrueですが、信頼できないイベントのisTrusted属性の値はfalseです。
クリックイベントまたはDOMActivateイベントを除いて、ほとんどの信頼できないイベントはデフォルトのアクションをトリガーしないはずです。
クラスを追加し、mouseover / mouseoutイベントで手動で追加/削除する必要があります。
次のようにマウスオーバーイベントをシミュレートできます。
HTML
<div id="name">My Name</div>
JavaScript
var element = document.getElementById('name');
element.addEventListener('mouseover', function() {
console.log('Event triggered');
});
var event = new MouseEvent('mouseover', {
'view': window,
'bubbles': true,
'cancelable': true
});
element.dispatchEvent(event);
temp0.dispatchEvent(new MouseEvent('mouseover', {bubbles: true}))
、マウスオーバーでのみ表示されるツールチップやその他のコンテンツのスタイリングに非常に役立ちます。
:hov
、devtoolsのスタイルインスペクターの上部にあるボタンを確認する必要があります。これにより、検査対象の要素で任意の疑似クラスをアクティブ化できます。
自動テストを作成しようとしているときにこの質問に遭遇し、特定のページの特定の要素セットがすべて受信し、ホバーイベントでcssによって設定されたcssプロパティのセットがあることを確認しました。
上記の回答は完全に説明していますが、JSによってホバーイベントをトリガーしてから対象のcss値をプローブすることができない理由は、最初の質問「CSSをアクティブ化する純粋なJavaScriptでマウスオーバーをシミュレートするにはどうすればよいですか」に回答します。 :ホバー」?」部分的にのみ。
これはパフォーマンスの高いソリューションではありません。パフォーマンスが問題にならない自動テストにのみ使用します。
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)で確認し、それらのスタイルのみを使用することができます。
ジャスミンでは、たとえば次のことを実行できます。
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");
});
});
この場合、私が通常行うことは、javascript ..を使用してクラスを追加し、このクラスに同じCSS
ものをアタッチすることです。:hover
使ってみてください
theElement.addEventListener('onmouseover',
function(){ theElement.className += ' hovered' });
または古いブラウザの場合:
theElement.onmouseover = function(){theElement.className += ' hovered'};
もちろんonmouseout
、要素を離れるときに「ホバーされた」クラスを削除するために使用する必要があります。
attachEvent()
が使用されます。
addEventListener
おり、イベントを添付するのに最適な方法attachEvent
です。シミングはIE8(およびそれ以下)でのみ必要です。Yotam、onmouseover
属性を直接設定して(イベントリスナーを追加するのではなく)別のハンドラーを追加すると、現在設定されているイベントが上書きされます。違いについては、この質問を参照してください。
CSS疑似クラスを要素に適用できるライブラリであるpseudo:stylerを使用できます。
(async () => {
let styler = new PseudoStyler();
await styler.loadDocumentStyles();
document.getElementById('button').addEventListener('click', () => {
const element = document.getElementById('test')
styler.toggleStyle(element, ':hover');
})
})();
免責事項:私はこのライブラリの共著者です。特に、ページのCSSルールを制御できない可能性のあるChrome拡張機能で使用するために、クロスオリジンスタイルシートを追加でサポートするように設計されています。
window.getComputedStyle(<youElement>)
、疑似スタイルを設定した後で組み合わせた場合でも、実際にはかなりうまく機能しているようです。ありがとう!
dom操作後にCSSを検査することを想定していますが、マウスをdevtoolsに戻すとすぐに、そのhtml要素でイベントがアクティブになりません。おそらく、JavaScriptイベント用のdevtoolsに:hoverオプションのようなものが必要です。それは存在しませんが、シミュレートすることができます。
javascriptが無効になっているため、要素を再度変更する機会はありません。devtoolsに移動して、ホバーしたり、クリックしたり、何か他のことをしたりしているかのように、cssとhtmlを調べることができます。完了したら、もう一度コマンドパネルに移動し、[JavaScriptを有効にする]を選択します。
:hov
で、スタイルインスペクターの上部([フィルター]入力ボックスの横)にボタンがあります。クリックすると:hov
:それぞれが擬似クラスで標識し、チェックボックスのシリーズを展開し:active
、:focus
、:focus-within
、:hover
、と:visited
。そして、これらのボックスのいずれかをチェックすると、検査対象の要素でそれぞれの疑似クラスがアクティブになります。
:hover
、要素の状態を強制することだと思います。