クリアアイコンでIE10のテキスト入力をクリアするとイベントが発生します


82

Chromeでは、ユーザーがクリアボタンをクリックすると、検索入力で「検索」イベントが発生します。

Internet Explorer 10のJavaScriptで同じイベントをキャプチャする方法はありますか?

ここに画像の説明を入力してください



いいえ、これはすべてIE10に関するものです。Webkitでは、これを処理する方法を知っています。
ghusse 2013年

フィールドをクリアするときにIE10で発生するイベントはありません。
wakooka 2013年

1
うーん、まだ試してみる価値があるかもしれませんが、IEにもバグのある「入力」イベントがあるようです:help.dottoro.com/ljhxklln.php(テキストが追加されたときにのみ発生し、削除されたときではありません!)
natevw 2013

3
@ ghusse'input 'イベントが発生します。
kzh 2013年

回答:


72

私が最終的に見つけた唯一の解決策:

// There are 2 events fired on input element when clicking on the clear button:
// mousedown and mouseup.
$("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 == ""){
      // Gotcha
      $input.trigger("cleared");
    }
  }, 1);
});

1
Ghusseに感謝します!誰かが(setTimeoutなしで)他の解決策を思いついた場合は、私に知らせてください。
彼はNrik 2013年

これは、ASP.NET / jQuery / IE11でも機能します。代わりに$( "入力")のバインド( "MouseUpイベント"、機能(e)は{あなたは$( '#<%= MyTextBox.ClientID%>')を使用する必要があります(関数(){のmouseUp。。
ジョーSchmoe

3
以下のLucentによるソリューションは、IE11で機能します。彼の解決策は、oninput代わりにイベントを使用することです。Xアイコンを押すと、inputイベントが発生します。
iheartcsharp 2015

ifステートメントはすべきではありませんif (oldValue === "")か?
Dylan Czenski 2016

Lucentにinputよる-eventを使用したソリューションは機能しますが、このソリューションは、要素がクリアされたときにのみ起動するという点で優れています。一方、Lucentは、カーソルが要素に入るとき、要素を離れるとき、およびデータが入力されたときにも起動します。
spheenik 2017

40

oninputイベントがで発生させthis.value、空の文字列に設定。Xを使用して検索ボックスをクリアする場合でも、バックスペースを使用する場合でも、同じアクションを実行したいので、これで問題は解決しました。これはIE10でのみ機能します。


1
これはIE10でも機能します。IEの以前のバージョンにはクリアフィールドボタンがあるとは思わないので、IE10でのみ機能する必要があります
andyface

3
IE11でも動作します!
AfroMogli 2015

1
これはChromeとFirefoxでも機能し、ユーザーがマウスを右クリックして値を切り取ったときにも発生します。接続するには、これを使用しますinputEl.addEventListener('input', function(){ /* DoSomething */ })
デレク


10

何故なの

$("input").bind('input propertychange', function() {
    if (this.value == ""){
      $input.trigger("cleared");
    }
});

1
ユーザーがキーボードでテキストを削除した場合はどうなりますか?
ghusse 2015年

@ghusseボタンを使用せずに、クリックアンドドラッグでテキストフィールドをクリアすることもできます。したがって、受け入れられた回答も失敗します。ユーザーがフィールドのクリアボタンを押すと、イベントで通知を受けたいので、OPが質問をしたと思います。
Ertug 2015年

クリックしてドラッグすると、キーボードのdelボタンを押さないとテキストフィールドをクリアする方法がわかりません。
ghusse 2015年

@ghusseすべてのテキストを選択して、他のテキストボックスにドラッグしてみてください。それがうまくいかない場合は、Altキーを押してみてください。
Ertug 2015年

質問に100%固有ではないかもしれませんが、これは1日の終わりにはより良い答えのようです。クロムからの自動完了でさえ、あらゆる種類のケースをカバーしているようです。
AR

8

この質問には回答がありましたが、受け入れられた回答は私たちの状況では機能しませんでした。IE10は$input.trigger("cleared");ステートメントを認識/起動しませんでした。

最終的なソリューションでは、そのステートメントをENTERキー(コード13)のkeydownイベントに置き換えました。後世のために、これは私たちの場合にうまくいったものです:

$('input[type="text"]').bind("mouseup", function(event) {
    var $input = $(this);
    var oldValue = $input.val();
    if (oldValue == "") {
        return;
    }
    setTimeout(function() {
        var newValue = $input.val();
        if (newValue == "") {
            var enterEvent = $.Event("keydown");
            enterEvent.which = 13;
            $input.trigger(enterEvent);
        }
    }, 1);
});

さらに、このバインディングをページ上のすべての入力ではなく、「検索」入力にのみ適用したかったのです。当然、IEはこれも困難にしました...コーディングはしましたが<input type="search"...>、IEはそれらをとしてレンダリングしましたtype="text"。これが、jQueryセレクターがを参照する理由type="text"です。

乾杯!


素晴らしい、私のために働いたが、代わりにキーアップをトリガーした(私のコードは2文字を探し、キーアップを自動的に検索する)
パンクロジスト2015

6

inputイベントを聞くだけです。詳細については、リファレンス参照してください。これは、IEのSenchaExtJSのクリアボタンの問題を修正した方法です。

Ext.define('Override.Ext.form.field.ComboBox', {
    override: 'Ext.form.field.ComboBox',

    onRender: function () {
        this.callParent();

        var me = this;
        this.inputEl.dom.addEventListener('input', function () {
            // do things here
        });
    }
});

1
この回答はMSEdgeで機能し、「x」をクリックして検索フィールドをクリアすると「input」イベントが発生します。
Mottie 2016年

私はvanillajsを使用していますが、XをクリックしてもMS Edgeは入力イベントを発生させません。とにかく、そのようなイベントを監視しようとするのは悪い考えだったと思います。通常のフォームのようにボタンを使用することをお勧めします。
Rivenfall 2018年

2

すぐに使えるソリューションは、CSSでXを完全に取り除くことです。

::-ms-clear { display: none; } /* see /programming/14007655 */

これには次の利点があります。

  1. はるかに簡単なソリューション-1行に収まる
  2. すべての入力に適用されるため、入力ごとにハンドラーを用意する必要はありません。
  3. ロジックのバグでJavaScriptを壊すリスクはありません(QAは必要ありません)
  4. ブラウザ間の動作を標準化します-ChromeにはXがないという点で、IEはChromeと同じように動作します

1

私のasp.netサーバー制御用

<asp:TextBox ID="tbSearchName" runat="server" oninput="jsfun_tbSearchName_onchange();"></asp:TextBox>

js

function jsfun_tbSearchName_onchange() {
    if (objTbNameSearch.value.trim() == '')
            objBTSubmitSearch.setAttribute('disabled', true);
        else
            objBTSubmitSearch.removeAttribute('disabled');
        return false;
}

ref

MSDNonchangeイベント-IE10でテスト済み。

...またはCSSで非表示にする:

input[type=text]::-ms-clear { display: none; }

0

上記のコードは私の場合は機能していませんでした。1行を変更$input.typeahead('val', '');して、私の場合に機能するものを紹介しました。

// There are 2 events fired on input element when clicking on the clear button:// mousedown and mouseup.
$("input").on('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 === ''){
            $input.typeahead('val', '');
            e.preventDefault();
        }
    }, 1);
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.