(ExtJS) ツールバー ボタンがクリックされたときに Web ページのフォーカスを取得するのではなく、クリックによってフォーカスを変更せずに「処理」を実行する必要があります。それ、どうやったら出来るの?
11 に答える
のデフォルトの動作をキャンセルするとonmousedown
、要素がフォーカスを取得できなくなります。
// Prevent capturing focus by the button.
$('button').on('mousedown',
/** @param {!jQuery.Event} event */
function(event) {
event.preventDefault();
}
);
document.activeElementは、現在フォーカスされている要素を格納します。
したがって、ツールバーで、この関数に「マウスダウン」ハンドラーを追加できます。
function preventFocus() {
var ae = document.activeElement;
setTimeout(function() { ae.focus() }, 1);
}
この例を試してください:
<html>
<head>
<script>
function preventFocus() {
var ae = document.activeElement;
setTimeout(function() { ae.focus() }, 1);
}
</script>
</head>
<body>
<input type="text"/>
<input type="button" onmousedown="preventFocus()" onclick="alert('clicked')" value="Toolbar" />
</body>
</html>
これは通常、私にとってはうまくいきます:
<button
tabindex="-1"
onclick="javascript:console.log('do your thing')"
>My Button</button>
https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindexから:
負の値 (通常は
tabindex="-1"
) は、要素がフォーカス可能であるべきであることを意味しますが、シーケンシャル キーボード ナビゲーションを介して到達可能であってはなりません。JavaScript を使用してアクセシブルなウィジェットを作成すると、たいてい役に立ちます。
ブラウザのデフォルトの動作であるため、やりたいことを簡単に実行できる方法はないと思います。
もちろん、クリックしたらすぐにボタンを blur() することもできますが、それでは単にすべての選択が解除されます。以前にアクティブだったオブジェクトにフォーカスを取り戻すには、すべての要素にぼかしハンドラーを追加して、どの要素が最後にフォーカスを持っていた/失ったかを追跡することによって、ある種の「メモリ」を作成する必要があります (グローバルに要素の ID を保存します)。要素がフォーカスを失ったときに更新します)。
私の解決策は、それをボタンとして置き換え<button />
てスタイルすることです。<div />
Div をクリックしてもフォーカスされていないようです。
すべてのフィールドに 1 つのぼかしイベント リスナーをアタッチします。このリスナーは、フォーカスを失ったフィールドをグローバル変数に保存する必要があります。
次に、すべてのツールバー ボタンが 1 つのフォーカス イベント リスナーを取得する必要があります。このリスナーは、上記のように保存されたフィールドにフォーカスする必要があります。
このコードは動作するはずですが、テストはしていません
stateful
フォーカスを戻すには、フォーム フィールドなどの変更プロパティを使用して状態を変更する必要がありますか?
ツールバー ボタンは通常の HTML ボタン要素のスタイルを設定しただけなので、これは実際のブラウザーの動作であり、変更する前によく考える必要があります。しかし、それにもかかわらず...
ハンドラーfalse
から戻るだけで、ボタンがフォーカスを受け取るのを防ぐことができるはずです。onclick
これらの答えはすべて奇抜です。これは、CSSのみを使用する非常に優れたトリックです
<button type="submit" disabled>
<span>Submit</span> <!-- the <span> is the secret -->
</button>
今あなたのCSSで:
button[disabled] > * {
pointer-events: none;
}
トリックは、内側のスパンを使用する必要があることです。そうしないと、ボタンは入力からフォーカスを奪います。