Подія спрацьовує під час очищення введення тексту на IE10 із піктограмою очищення


82

На chrome подія "пошук" запускається на вхідних даних пошуку, коли користувач натискає кнопку очищення.

Чи є спосіб зафіксувати ту саму подію в javascript в Internet Explorer 10?

введіть тут опис зображення


1
Можливий дублікат: stackoverflow.com/questions/2492722 / ...
wakooka

Ні, це все про IE10. На webkit я знаю, як з цим впоратися.
ghusse

При очищенні поля в IE10 не відбувається жодної події.
wakooka

1
Хм, можливо, все-таки варто спробувати, але схоже на те, що IE також має помилкову подію "введення": help.dottoro.com/ljhxklln.php ( запускається лише при додаванні тексту, а не при видаленні!)
natevw,

3
@ghusse подія "input" запускається.
kzh

Відповіді:


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
Дякую Гус! Якщо хтось придумає будь-яке інше рішення (без setTimeout), дайте мені знати.
Він Нрік

Це також працює для ASP.NET / jQuery / IE11. Замість $ ("input"). Bind ("mouseup", function (e) {потрібно використовувати $ ('# <% = MyTextBox.ClientID%>'). Mouseup (function () {
Joe Schmoe

3
Рішення Lucent нижче працює для мене в IE11. Його рішення - використовувати oninputзамість цього подію. Коли ви натискаєте піктограму X, inputподія запускається.
iheartcsharp

чи не повинно бути твердження if if (oldValue === "")?
Ділан Ченскі,

Незважаючи на те, що рішення від Lucent з input-event працює, це рішення перевершує те, що воно спрацьовує лише тоді, коли елемент очищений, тоді як Lucent також спрацьовує, коли курсор входить у елемент, залишає елемент, а також коли вводяться дані.
spheenik

40

oninputПодія вистрілює з this.valueвстановленим в порожній рядок. Це вирішило проблему для мене, оскільки я хочу виконати одну і ту ж дію, незалежно від того, чи вони очищають поле пошуку за допомогою X або шляхом зворотного інтервалу. Це працює лише в IE 10.


1
це працює і для мене в IE10, не думайте, що в попередніх версіях IE є кнопка очищення поля, тому повинна працювати лише
IE10

3
Працює і в IE11!
AfroMogli

1
Це також працює в Chrome та Firefox, а також спрацьовує, коли користувач клацає правою кнопкою миші та скорочує значення. Дозволяється підключати цей: inputEl.addEventListener('input', function(){ /* DoSomething */ }).
Дерек,

31

Використовуйте inputзамість цього. Він працює з однаковою поведінкою у всіх браузерах.

$(some-input).on("input", function() { 
    // update panel
});

1
Не працює в IE 11 у режимі документообігу 5, відсутня закриваюча дужка, до речі.
Бернхард Дьоблер

10

Чому ні

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

1
Що робити, якщо користувач просто видалив якийсь текст за допомогою клавіатури?
ghusse

@ghusse Ви також можете очистити текстове поле клацанням і перетягуванням, не використовуючи цю кнопку. Так прийнятий огляд також зазнає невдачі. Я припускаю, що OP задав питання, тому що коли користувач натискає кнопку очищення поля, він хоче отримати повідомлення про подію.
Ертуг

Клацанням та перетягуванням я не бачу, як очистити текстове поле, окрім натискання кнопки дель на клавіатурі.
ghusse

@ghusse Будь ласка, виділіть увесь текст і спробуйте перетягнути в інше текстове поле. Якщо це не працює, спробуйте натиснути клавішу Alt.
Ертуг

здається, що це краща відповідь в кінці дня, хоча, можливо, не на 100% конкретна для питання. Здається, це охоплює всілякі випадки, навіть автозавершення з хрому.
AR

8

Я усвідомлюю, що на це питання відповіли, але прийнята відповідь не спрацювала у нашій ситуації. IE10 не розпізнав / спрацював$input.trigger("cleared"); заяву.

Наше остаточне рішення замінило це твердження подією клавіатури на клавіші ENTER (код 13). Для нащадків у нашому випадку це спрацювало:

$('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 символи та автоматично здійснює пошук за клавіатурою)
punkologist

6

Ми можемо просто послухати inputподію. Детальніше див . Посилання . Ось як я виправив проблему з кнопкою очищення в Sencha ExtJS на IE:

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
Ця відповідь працює для MS Edge, подія "input" запускається при натисканні на "x", щоб очистити поле пошуку.
Мотті

Я використовую vanilla js, і MS Edge не запускає вхідну подію, натискаючи X. Я думаю, це була погана ідея, спробувати переглянути таку подію. Краще використовувати кнопку, як звичайні форми.
Rivenfall

2

Вихідне рішення - просто позбутися X повністю за допомогою CSS:

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

Це має наступні переваги:

  1. Набагато простіше рішення - вміщується на одному рядку
  2. Застосовується до всіх входів, тому вам не потрібно мати обробник для кожного вводу
  3. Немає ризику зламати javascript із помилкою в логіці (потрібно менше контролю якості)
  4. Стандартизує поведінку в браузерах - змушує IE поводитися так само, як chrome, оскільки chrome не має X

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;
}

посилання

Подія MSDN onchange - перевірено в IE10.

... або приховати за допомогою CSS:

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

0

Наведений вище код не працював у моєму випадку, і я змінив один рядок і представив, $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);
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.