Bei Chrome wird das Suchereignis bei Sucheingaben ausgelöst, wenn der Benutzer auf die Schaltfläche zum Löschen klickt.
Gibt es eine Möglichkeit, dasselbe Ereignis in Javascript in Internet Explorer 10 zu erfassen?
Bei Chrome wird das Suchereignis bei Sucheingaben ausgelöst, wenn der Benutzer auf die Schaltfläche zum Löschen klickt.
Gibt es eine Möglichkeit, dasselbe Ereignis in Javascript in Internet Explorer 10 zu erfassen?
Antworten:
Die einzige Lösung, die ich endlich gefunden habe:
// 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);
});
oninput
stattdessen das Ereignis zu verwenden. Wenn Sie das X-Symbol drücken, wird das input
Ereignis ausgelöst.
if (oldValue === "")
?
input
Ereignis -event funktioniert, ist diese Lösung insofern überlegen, als sie nur ausgelöst wird, wenn das Element gelöscht wurde, während Lucent auch ausgelöst wird, wenn der Cursor in das Element eintritt, das Element verlässt und auch wenn Daten eingegeben wurden.
Das oninput
Ereignis wird ausgelöst, wenn this.value
eine leere Zeichenfolge festgelegt ist. Dies löste das Problem für mich, da ich die gleiche Aktion ausführen möchte, unabhängig davon, ob das Suchfeld mit dem X oder durch Rückraum gelöscht wird. Dies funktioniert nur in IE 10.
inputEl.addEventListener('input', function(){ /* DoSomething */ })
.
Verwenden Sie input
stattdessen. Es funktioniert mit dem gleichen Verhalten unter allen Browsern.
$(some-input).on("input", function() {
// update panel
});
Warum nicht
$("input").bind('input propertychange', function() {
if (this.value == ""){
$input.trigger("cleared");
}
});
Mir ist klar, dass diese Frage beantwortet wurde, aber die akzeptierte Antwort hat in unserer Situation nicht funktioniert. IE10 hat die $input.trigger("cleared");
Anweisung nicht erkannt / ausgelöst .
Unsere endgültige Lösung ersetzte diese Anweisung durch ein Keydown-Ereignis auf der ENTER-Taste (Code 13). Für die Nachwelt hat dies in unserem Fall funktioniert:
$('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);
});
Außerdem wollten wir diese Bindung nur auf die "Suche" -Eingaben anwenden, nicht auf alle Eingaben auf der Seite. Natürlich hat IE dies auch schwierig gemacht ... obwohl wir codiert hatten <input type="search"...>
, hat IE sie als gerendert type="text"
. Aus diesem Grund verweist der jQuery-Selektor auf den type="text"
.
Prost!
Wir können uns das input
Ereignis einfach anhören . Einzelheiten entnehmen Sie bitte der Referenz . So habe ich ein Problem mit der Schaltfläche "Löschen" in Sencha ExtJS im IE behoben:
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
});
}
});
Eine sofort einsatzbereite Lösung besteht darin, das X mit CSS vollständig zu entfernen:
::-ms-clear { display: none; } /* see /programming/14007655 */
Dies hat folgende Vorteile:
für meine asp.net Serversteuerung
<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
MSDN onchange-Ereignis - in IE10 getestet.
... oder mit CSS verstecken:
input[type=text]::-ms-clear { display: none; }
Der obige Code funktionierte in meinem Fall nicht und ich habe eine Zeile geändert und eingeführt, $input.typeahead('val', '');
welche in meinem Fall funktioniert.
// 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);
});