HTML5では、search
入力タイプの右側に小さなXが表示され、テキストボックスがクリアされます(少なくともChromeでは、おそらく他のものでも)。このXがJavaScriptまたはjQueryでクリックされたことを検出する方法はありません。たとえば、ボックスがまったくクリックされたことを検出したり、何らかの場所のクリック検出(x位置/ y位置)を実行したりする方法はありますか?
HTML5では、search
入力タイプの右側に小さなXが表示され、テキストボックスがクリアされます(少なくともChromeでは、おそらく他のものでも)。このXがJavaScriptまたはjQueryでクリックされたことを検出する方法はありません。たとえば、ボックスがまったくクリックされたことを検出したり、何らかの場所のクリック検出(x位置/ y位置)を実行したりする方法はありますか?
回答:
実際には、ユーザーが検索するたびに、またはユーザーが「x」をクリックしたときに発生する「search」イベントがあります。「インクリメンタル」属性を理解するため、これは特に便利です。
とはいえ、「onclick」ハックを使用しない限り、「x」をクリックすることと検索することの違いがわかるかどうかはわかりません。いずれにせよ、うまくいけばこれが役立つでしょう。
参照:
search
「x」をクリックしたとき以外にイベントが発生したときを理解できません。keyup
、blur
またはフォームが送信されたときに発火しないようです。しかし、これは答えとしてマークされるに値します。
search
ユーザーが押したときにイベントが発生しなければなりませんEnter
。また、検索ボックスにincremental
属性がある場合は、ユーザーが1秒間入力を停止したときにも起動します。
input
イベントをトリガーしますが、イベントはトリガーしませんsearch
。
バインド- search
以下に示すように検索ボックスをイベントします-
$('input[type=search]').on('search', function () {
// search logic here
// this function will be executed on click of X (clear button)
});
私change
はkeyup
と、search
今日は苦労したので、「遅い」答えを追加したいと思っています。基本的に、タイプとして検索パネルがあり、小さなX(ChromeとOperaでは、FFはそれを実装していません)のプレスに適切に反応し、結果としてコンテンツペインをクリアしたいと思っていました。
私はこのコードを持っていました:
$(some-input).keyup(function() {
// update panel
}
$(some-input).change(function() {
// update panel
}
$(some-input).on("search", function() {
// update panel
}
(私はいつ、どのような状況でそれぞれが呼び出されたかを確認したかったので、それらは別々です)。
ChromeとFirefoxの反応は異なります。特に、Firefoxはchange
「入力のすべての変更」として処理し、Chromeは「フォーカスが失われ、コンテンツが変更された場合」として処理します。したがって、Chromeでは「更新パネル」関数が1回呼び出され、FFではキーストロークごとに2回呼び出されました(1つはkeyup
、1つはchange
)。
さらに、小さいX(FFには存在しない)でフィールドをクリアすると、search
Chromeでイベントが発生しました:no keyup
、no change
。
結論?input
代わりに使用:
$(some-input).on("input", function() {
// update panel
}
私がテストしたすべてのブラウザーで同じ動作で動作し、入力コンテンツのすべての変更に反応します(マウスでコピーして貼り付け、オートコンプリートおよび「X」が含まれています)。
change
イベントをChromeと同じように扱い、Enterまたはフォーカスが失われたときにのみ発火します。
パウアンの応答を使用すると、それはほとんど可能です。例
<head>
<script type="text/javascript">
function OnSearch(input) {
if(input.value == "") {
alert("You either clicked the X or you searched for nothing.");
}
else {
alert("You searched for " + input.value);
}
}
</script>
</head>
<body>
Please specify the text you want to find and press ENTER!
<input type="search" name="search" onsearch="OnSearch(this)"/>
</body>
change
イベントはblur
基本的には発生しません。(x)
Chromeの検索フィールドの内側をクリックするだけでは、イベントが発生しないようです。さらなる調査の後(そして以下のコメントを読んだ後)、私はclick
私のために働くようになりました。だから$("input[type='search']").bind('click', function(e) { if ( this.value=="") {//this just cleared!} });
私の側でうまくいく
$("input[type='search']").bind('click', function(e) { if ( this.value=="") {//this just cleared!} });
、ユーザーが入力フィールドをクリックしたときにもトリガーされます。
これは古い質問であることは知っていますが、同じようなことを探していました。検索ボックスをクリアするために「X」がいつクリックされたかを確認します。ここでの答えはどれも私を助けませんでした。1つは閉じていましたが、ユーザーが「Enter」ボタンを押したときにも影響を受け、「X」をクリックした場合と同じ結果が発生しました。
私は別の投稿でこの回答を見つけました。それは私にとって完璧に機能し、ユーザーが検索ボックスをクリアしたときにのみ起動します。
$("input").bind("mouseup", function(e){
var $input = $(this),
oldValue = $input.val();
if (oldValue == "") return;
// When this event is fired after clicking on the clear button
// the value is not cleared yet. We have to wait for it.
setTimeout(function(){
var newValue = $input.val();
if (newValue == ""){
// capture the clear
$input.trigger("cleared");
}
}, 1);
});
Xをクリックすることは変更イベントとして数えられるべきだと私には理解できました。onChangeイベントはすべて、必要なことを実行するためにすべて設定されています。したがって、私にとっての修正は、このjQuery行を単に実行することでした。
$('#search').click(function(){ $(this).change(); });
if (this.value === "") { ... }
ブラウザでこれにアクセスできるようではないようです。検索入力は、Cocoa NSSearchFieldのWebkit HTMLラッパーです。キャンセルボタンは、ブラウザクライアントコード内に含まれているようで、ラッパーから外部参照を使用できません。
出典:
あなたはクリックでマウスの位置から次のようなものでそれを理解する必要があるように見えます:
$('input[type=search]').bind('click', function(e) {
var $earch = $(this);
var offset = $earch.offset();
if (e.pageX > offset.left + $earch.width() - 16) { // X button 16px wide?
// your code here
}
});
この投稿を見つけて、少し古いことに気づきましたが、答えがあると思います。これは、十字のクリック、バックスペース、およびESCキーの打撃を処理します。私はそれがおそらくより良く書かれることができると確信しています-私はまだJavaScriptに比較的新しいです。これが私がやったことです-私はjQuery(v1.6.4)を使用しています:
var searchVal = ""; //create a global var to capture the value in the search box, for comparison later
$(document).ready(function() {
$("input[type=search]").keyup(function(e) {
if (e.which == 27) { // catch ESC key and clear input
$(this).val('');
}
if (($(this).val() === "" && searchVal != "") || e.which == 27) {
// do something
searchVal = "";
}
searchVal = $(this).val();
});
$("input[type=search]").click(function() {
if ($(this).val() != filterVal) {
// do something
searchVal = "";
}
});
});
しかし、それは少しハックであり、グーテンベルクの答えはほとんどの人にとってうまくいくでしょう。
$('#search-field').on('click', function(){
$('#search-field').on('search', function(){
if(!this.value){
console.log("clicked x");
// Put code you want to run on clear here
}
});
setTimeout(function() {
$('#search-field').off('search');
}, 1);
});
'#search-field'
入力用のjQueryセレクターはどこにありますか。'input[type=search]'
すべての検索入力を選択するために使用します。フィールドをクリックした直後に検索イベント(Pauanの回答)をチェックすることで機能します。
完全なソリューションはこちら
検索xをクリックすると、検索がクリアされます。または、ユーザーがEnterキーを押すと、検索APIヒットを呼び出します。このコードは、追加のEscキーアップイベントマッチャーを使用してさらに拡張できます。しかし、これですべてがうまくいくはずです。
document.getElementById("userSearch").addEventListener("search",
function(event){
if(event.type === "search"){
if(event.currentTarget.value !== ""){
hitSearchAjax(event.currentTarget.value);
}else {
clearSearchData();
}
}
});
乾杯。
jsのイベントループに基づいて、click
on clearボタンは入力search
時にイベントをトリガーするため、以下のコードは期待どおりに機能します。
input.onclick = function(e){
this._cleared = true
setTimeout(()=>{
this._cleared = false
})
}
input.onsearch = function(e){
if(this._cleared) {
console.log('clear button clicked!')
}
}
上記のコード、onclickイベントはthis._cleared = false
イベントループを予約しましたが、イベントは常にイベントの後に実行されるonsearch
ため、this._cleared
ステータスを安定して確認し、ユーザーがX
ボタンをクリックしてonsearch
イベントをトリガーしたかどうかを判断できます。
これは、ほとんどすべての条件、貼り付けられたテキスト、インクリメンタル属性、ENTER / ESCキーの押下などで機能します。
これを実現する1つの方法を次に示します。htmlにインクリメンタル属性を追加する必要があります。追加しないと機能しません。
window.onload = function() {
var tf = document.getElementById('textField');
var button = document.getElementById('b');
button.disabled = true;
var onKeyChange = function textChange() {
button.disabled = (tf.value === "") ? true : false;
}
tf.addEventListener('keyup', onKeyChange);
tf.addEventListener('search', onKeyChange);
}
<input id="textField" type="search" placeholder="search" incremental="incremental">
<button id="b">Go!</button>
document.querySelectorAll('input[type=search]').forEach(function (input) {
input.addEventListener('mouseup', function (e) {
if (input.value.length > 0) {
setTimeout(function () {
if (input.value.length === 0) {
//do reset action here
}
}, 5);
}
});
}
ECMASCRIPT 2016
検索またはonclickは機能しますが、私が見つけた問題は古いブラウザでした-検索が失敗しました。多くのプラグイン(jquery uiオートコンプリートまたはファンシーツリーフィルター)には、ぼかしとフォーカスのハンドラーがあります。これをオートコンプリート入力ボックスに追加するとうまくいきました(this.value == ""を使用したため、評価が高速でした)。ぼかしを当てると、小さな「x」を押すとカーソルがボックス内に留まります。
PropertyChangeと入力は、IE 10とIE 8の両方、およびその他のブラウザーで機能しました。
$("#INPUTID").on("propertychange input", function(e) {
if (this.value == "") $(this).blur().focus();
});
FancyTreeフィルター拡張の場合、リセットボタンを使用して、クリックイベントを次のように強制できます。
var TheFancyTree = $("#FancyTreeID").fancytree("getTree");
$("input[name=FT_FilterINPUT]").on("propertychange input", function (e) {
var n,
leavesOnly = false,
match = $(this).val();
// check for the escape key or empty filter
if (e && e.which === $.ui.keyCode.ESCAPE || $.trim(match) === "") {
$("button#btnResetSearch").click();
return;
}
n = SiteNavTree.filterNodes(function (node) {
return MatchContainsAll(CleanDiacriticsString(node.title.toLowerCase()), match);
}, leavesOnly);
$("button#btnResetSearch").attr("disabled", false);
$("span#SiteNavMatches").text("(" + n + " matches)");
}).focus();
// handle the reset and check for empty filter field...
// set the value to trigger the change
$("button#btnResetSearch").click(function (e) {
if ($("input[name=FT_FilterINPUT]").val() != "")
$("input[name=FT_FilterINPUT]").val("");
$("span#SiteNavMatches").text("");
SiteNavTree.clearFilter();
}).attr("disabled", true);
これをほとんどの用途に適合させることができるはずです。
TextFieldの十字ボタン(X)をクリックすると、onmousemove()が発生し、このイベントを使用して任意の関数を呼び出すことができます。
<input type="search" class="actInput" id="ruleContact" onkeyup="ruleAdvanceSearch()" placeholder="Search..." onmousemove="ruleAdvanceSearch()"/>
onchange
イベントはありませんか?