Evento activado al borrar la entrada de texto en IE10 con el icono claro

83

En Chrome, el evento de "búsqueda" se activa en las entradas de búsqueda cuando el usuario hace clic en el botón borrar.

¿Hay alguna forma de capturar el mismo evento en javascript en Internet Explorer 10?

ingrese la descripción de la imagen aquí

ghusse
fuente
1
Posible duplicado: stackoverflow.com/questions/2492722/…
wakooka
No, este tiene que ver con IE10. En webkit, sé cómo manejar esto.
ghusse
No se dispara ningún evento en IE10 al limpiar el campo.
wakooka
1
Hmm, todavía podría valer la pena intentarlo, pero parece que IE también tiene un evento de 'entrada' con errores: help.dottoro.com/ljhxklln.php (¡se activa solo cuando se agrega texto, no cuando se elimina!)
natevw
3
@ghusse se activa el evento 'input'.
2013

Respuestas:

72

La única solución que finalmente encontré:

// 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);
});
ghusse
fuente
1
¡Gracias Ghusse! Si a alguien se le ocurre alguna otra solución (sin setTimeout), avíseme.
He Nrik
Esto también funciona para ASP.NET / jQuery / IE11. En lugar de $ ("input"). Bind ("mouseup", function (e) {necesitas usar $ ('# <% = MyTextBox.ClientID%>'). Mouseup (function () {
Joe Schmoe
3
La solución de Lucent a continuación me funciona en IE11. Su solución es usar el oninputevento en su lugar. Cuando presionas el ícono X, el inputevento se dispara.
iheartcsharp
¿No debería ser la declaración if if (oldValue === "")?
Dylan Czenski
Si bien la solución de Lucent con el input-evento funciona, esta solución es superior porque solo se activa cuando se borra el elemento, mientras que la de Lucent también se activa cuando el cursor entra en el elemento, lo abandona y también cuando se han introducido datos.
spheenik
40

El oninputevento se dispara con un this.valueconjunto de caracteres vacío. Esto me resolvió el problema, ya que quiero ejecutar la misma acción ya sea que borren el cuadro de búsqueda con la X o retrocediendo. Esto solo funciona en IE 10.

Lucent
fuente
1
Esto funciona para mí también en IE10, no creo que las versiones anteriores de IE tienen un botón de campo claro, por lo que sólo debe necesidad de trabajar por IE10
andyface
3
¡Funciona también en IE11!
AfroMogli
1
Esto también funciona en Chrome y Firefox y también se activa cuando el usuario hace clic con el botón derecho del mouse y reduce el valor. Para conectar este uso: inputEl.addEventListener('input', function(){ /* DoSomething */ }).
Derek
32

Úselo en su inputlugar. Funciona con el mismo comportamiento en todos los navegadores.

$(some-input).on("input", function() { 
    // update panel
});
Jeffry Ureña Miranda
fuente
1
No funciona en IE 11 en Document Mode 5, falta el corchete de cierre, por cierto.
Bernhard Döbler
10

Por qué no

$("input").bind('input propertychange', function() {
    if (this.value == ""){
      $input.trigger("cleared");
    }
});
Ertug
fuente
1
¿Qué pasa si el usuario simplemente elimina un texto con su teclado?
ghusse
@ghusse También puede borrar un campo de texto con un clic y arrastrar, sin usar ese botón. Una respuesta tan aceptada también fallará. Supongo que OP hizo la pregunta porque cuando un usuario presiona el botón Borrar campo, quiere ser notificado con un evento.
Ertug
Con un clic y un arrastre, no puedo ver cómo borrar un campo de texto excepto presionando el botón Supr de su teclado.
Ghusse
@ghusse Seleccione todo el texto e intente arrastrarlo a otro cuadro de texto. Si eso no funciona, intente con la tecla Alt presionada.
Ertug
Parece que esta es la mejor respuesta al final del día, aunque tal vez no sea 100% específica para la pregunta. Parece cubrir todo tipo de casos, incluso los autocompletados desde Chrome.
AR
8

Me doy cuenta de que esta pregunta ha sido respondida, pero la respuesta aceptada no funcionó en nuestra situación. IE10 no reconoció / disparó la $input.trigger("cleared");declaración.

Nuestra solución final reemplazó esa declaración con un evento keydown en la tecla ENTER (código 13). Para la posteridad, esto es lo que funcionó en nuestro caso:

$('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);
});

Además, queríamos aplicar este enlace solo a las entradas de "búsqueda", no a todas las entradas de la página. Naturalmente, IE también hizo esto difícil ... aunque habíamos codificado <input type="search"...>, IE los renderizó como type="text". Es por eso que el selector de jQuery hace referencia a type="text".

¡Salud!

NaranjaWombat
fuente
brillante, funcionó para mí, aunque activé keyup en su lugar (mi código busca 2 caracteres y busca automáticamente en keyup)
punkologist
6

Podemos simplemente escuchar el inputevento. Consulte la referencia para obtener más detalles. Así es como solucioné un problema con el botón Borrar en Sencha ExtJS en 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
        });
    }
});
Jaselg
fuente
1
Esta respuesta funciona para MS Edge, el evento "entrada" se activa al hacer clic en la "x" para borrar el campo de búsqueda.
Mottie
Estoy usando vanilla js y MS Edge no activa el evento de entrada al hacer clic en la X. De todos modos, creo que fue una mala idea intentar ver ese evento. Mejor use un botón como las formas normales.
Rivenfall
2

Una solución lista para usar es simplemente deshacerse de la X por completo con CSS:

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

Esto tiene los siguientes beneficios:

  1. Solución mucho más simple: cabe en una línea
  2. Se aplica a todas las entradas para que no tenga que tener un controlador para cada entrada
  3. No hay riesgo de romper javascript con un error en la lógica (se necesita menos control de calidad)
  4. Estandariza el comportamiento en todos los navegadores: hace que IE se comporte igual que Chrome, ya que Chrome no tiene la X
Almenon
fuente
1

para mi control de servidor 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;
}

árbitro

Evento onchange de MSDN : probado en IE10.

... o esconderse con CSS:

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

El código anterior no funcionaba en mi caso y cambié una línea e introduje $input.typeahead('val', '');cuál funciona en mi caso.

// 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);
});
Maneesh Thareja
fuente