JQuery dazu bringen, .change () im IE zu erkennen


131

Ich verwende jQuery, um Elemente auszublenden und anzuzeigen, wenn eine Optionsfeldgruppe geändert / angeklickt wird. Es funktioniert gut in Browsern wie Firefox, aber in IE 6 und 7 wird die Aktion nur ausgeführt, wenn der Benutzer dann auf eine andere Stelle auf der Seite klickt.

Wenn Sie die Seite laden, sieht alles gut aus. Wenn Sie in Firefox auf ein Optionsfeld klicken, wird eine Tabellenzeile ausgeblendet und die andere sofort angezeigt. In IE 6 und 7 klicken Sie jedoch auf das Optionsfeld, und nichts passiert, bis Sie irgendwo auf die Seite klicken. Erst dann zeichnet der IE die Seite neu und blendet die relevanten Elemente aus und ein.

Hier ist die jQuery, die ich verwende:

$(document).ready(function () {
  $(".hiddenOnLoad").hide();

  $("#viewByOrg").change(function () {
    $(".visibleOnLoad").show();
    $(".hiddenOnLoad").hide();
  });

  $("#viewByProduct").change(function () {
    $(".visibleOnLoad").hide();
    $(".hiddenOnLoad").show();
  });
});

Hier ist der Teil des XHTML, der davon betroffen ist. Die gesamte Seite wird als XHTML 1.0 Strict validiert.

<tr>
  <td>View by:</td>
  <td>
    <p>
      <input type="radio" name="viewBy" id="viewByOrg" value="organisation"
      checked="checked" />Organisation</p>
    <p>
      <input type="radio" name="viewBy" id="viewByProduct" value="product" />Product</p>
  </td>
</tr>
<tr class="visibleOnLoad">
  <td>Organisation:</td>
  <td>
    <select name="organisation" id="organisation" multiple="multiple" size="10">
      <option value="1">Option 1</option>
      <option value="2">Option 2</option>
    </select>
  </td>
</tr>
<tr class="hiddenOnLoad">
  <td>Product:</td>
  <td>
    <select name="product" id="product" multiple="multiple" size="10">
      <option value="1">Option 1</option>
      <option value="2">Option 2</option>
    </select>
  </td>
</tr>

Wenn jemand eine Idee hat, warum dies geschieht und wie es behoben werden kann, wäre er sehr dankbar!

Antworten:


96

Versuchen Sie es mit .clickanstelle von .change.


3
@samjudson, in meinen Tests ist dies nicht korrekt und der Klick von jquery wird ausgelöst, wenn ich das nächste Optionsfeld mit den Pfeiltasten auswähle. (vista, ie7)
svandragt

1
@ Pacifika: Nicht für mich in IE7. Zumindest macht es das richtig. "click" ist ein völlig anderes Ereignis als "change" und es gibt zumindest einige Fälle (wenn nicht alle), in denen es ein unangemessener Ersatz ist.
Bobby Jack

3
@samjudson: Klicken Sie auf Ereignisse in Optionsfeldern, und Kontrollkästchen werden ebenfalls ausgelöst, wenn Sie sie über die Tastatur auswählen. Funktioniert in allen Browsern
Philippe Leybaert

4
Ich stehe korrigiert da - das scheint der Fall zu sein, wie kontraintuitiv es auch sein mag!
Bobby Jack

2
Dies scheint die beliebteste Antwort auf diese spezielle Frage zu sein, ist aber nicht ganz richtig! clickunterscheidet sich davon changedarin, dass sein Eventhandler auch aufgerufen wird, wenn auf die bereits ausgewählte Option geklickt wird, während changedies nicht der Fall ist. Diese Antwort enthält ein Beispiel für die Verwendung von jQuery .datazum Vergleichen der alten und neuen Werte.
Laoujin

54

Das Problem bei der Verwendung des clickEreignisses anstelle vonchange besteht darin, dass Sie das Ereignis erhalten, wenn dasselbe Optionsfeld ausgewählt ist (dh sich nicht tatsächlich geändert hat). Dies kann herausgefiltert werden, wenn Sie überprüfen, ob der neue Wert vom alten abweicht. Ich finde das etwas nervig.

Wenn Sie das changeEreignis verwenden, stellen Sie möglicherweise fest, dass es die Änderung erkennt, nachdem Sie auf ein anderes Element im IE geklickt haben. Wenn Sie blur()das clickEreignis aufrufen , wird das changeEreignis ausgelöst (nur wenn sich die Optionsfelder tatsächlich geändert haben).

So mache ich das:

// This is the hack for IE
if ($.browser.msie) {
  $("#viewByOrg").click(function() {
    this.blur();
    this.focus();
  });
}

$("#viewByOrg").change(function() {
  // Do stuff here
});

Jetzt können Sie das Änderungsereignis wie gewohnt verwenden.

Bearbeiten: Es wurde ein Aufruf von focus () hinzugefügt, um Probleme mit der Barrierefreiheit zu vermeiden (siehe Bobbys Kommentar unten).


2
Das ist ein sehr böser Hack, da er Ihre Benutzer daran hindert, über die Tastatur zu navigieren, da der Fokus nach Auswahl eines Optionsfelds verschwindet.
Philippe Leybaert

5
Das ist großartig, verursacht aber Probleme mit der Tastaturzugänglichkeit. Sobald das blur () -Ereignis ausgelöst wurde, ist das Optionsfeld nicht mehr fokussiert, sodass das Wechseln zwischen Optionsfeldern mit der Tastatur äußerst umständlich wird. Meine aktuelle Lösung besteht darin, "this.focus ()" aufzurufen. unmittelbar nach der Anweisung blur ().
Bobby Jack

1
Ich denke, es ist die schlechteste Lösung, die aufgrund der Zugänglichkeitsprobleme vorgestellt wird.
Philippe Leybaert

11
Das Problem mit der Barrierefreiheit kann jedoch mit einem Aufruf von focus () gelöst werden. Es ist mindestens so gut wie die Verwendung von click () für alles.
Bobby Jack

Danke Bobby, das werde ich der Antwort hinzufügen.
Mark A. Nicolosi

33

Haben Sie das Ereignis onpropertychange des IE ausprobiert? Ich weiß nicht, ob es einen Unterschied macht, aber es ist wahrscheinlich einen Versuch wert. IE löst das Änderungsereignis nicht aus, wenn Werte über JS-Code aktualisiert werden, aber möglicherweise funktioniert onpropertychange in dieser Instanz.

$("#viewByOrg").bind($.browser.msie? 'propertychange': 'change', function(e) {
  e.preventDefault(); // Your code here 
}); 

"click" schien nicht zu funktionieren, "propertychange" jedoch. Vielen Dank!
James Kingsbery

Ich habe dies in IE8 versucht, es funktioniert nicht. Es kommt nicht innerhalb der Funktion.
ARUN

14

Das sollte auch funktionieren:

$(document).ready(function(){
   $(".hiddenOnLoad").hide();
   $("#viewByOrg, #viewByProduct").bind(($.browser.msie ? "click" : "change"), function () {
                        $(".visibleOnLoad").show();
                        $(".hiddenOnLoad").hide();
                    });
});

Danke Pier. Das war sehr hilfreich.


Dies ist zumindest eine viel bessere Antwort als die derzeit akzeptierte / am höchsten bewertete. Es "nur" bricht die Tastaturzugriff unter IE und nicht für alle guten Browser.
Bobby Jack

... obwohl das nicht nur eine Kopie von Piers Antwort ist?
Bobby Jack

Einverstanden, es ist eine etwas weniger lesbare Version von Pier, aber beide Selektoren sind in einem Aufruf gebunden.
Tristan Warner-Smith

Ersetzen clickdurch click keyup keypress, um Tastaturunterstützung hinzuzufügen.
Aloisdg wechselt zu codidact.com

6

Im IE müssen Sie das Klickereignis verwenden, in anderen Browsern onchange. Ihre Funktion könnte werden

$(document).ready(function(){
   $(".hiddenOnLoad").hide();
   var evt = $.browser.msie ? "click" : "change";
   $("#viewByOrg").bind(evt, function () {
                        $(".visibleOnLoad").show();
                        $(".hiddenOnLoad").hide();
                    });

   $("#viewByProduct").bind(evt, function () {
                        $(".visibleOnLoad").hide();
                        $(".hiddenOnLoad").show();
                    });     
});

Ersetzen clickdurch click keyup keypress, um Tastaturunterstützung hinzuzufügen.
Aloisdg wechselt zu codidact.com

6

füge dieses Plugin hinzu

jQuery.fn.radioChange = function(newFn){
    this.bind(jQuery.browser.msie? "click" : "change", newFn);
}

dann

$(function(){
    $("radioBtnSelector").radioChange(function(){
        //do stuff
    });
});

4

Ich hatte das gleiche Problem mit dem Eingabetext.

Ich habe mich verändert:

$("#myinput").change(function() { "alert('I changed')" });

zu

$("#myinput").attr("onChange", "alert('I changed')");

und alles funktioniert gut für mich!


2

Dies ist eine einfache Möglichkeit, den IE anzuweisen, das Änderungsereignis auszulösen, wenn auf das Element geklickt wird:

if($.browser.msie) {
    $("#viewByOrg").click(function() {
        $(this).change();
    });
}

Sie können dies auf etwas Allgemeineres erweitern, um mit mehr Formularelementen zu arbeiten:

if($.browser.msie) {
    $("input, select").click(function() {
        $(this).change();
    });
    $("input, textarea").keyup(function() {
        $(this).change();
    });
}

1

Ich bin mir ziemlich sicher, dass dies ein bekanntes Problem mit dem Internet Explorer ist. Das Hinzufügen eines Handlers für das onclickEreignis sollte das Problem beheben:

$(document).ready(function(){

    $(".hiddenOnLoad").hide();

    $("#viewByOrg").change(function () {
        $(".visibleOnLoad").show();
        $(".hiddenOnLoad").hide();
    });

    $("#viewByOrg").click(function () {
        $(".visibleOnLoad").show();
        $(".hiddenOnLoad").hide();
    });

    $("#viewByProduct").change(function () {
        $(".visibleOnLoad").hide();
        $(".hiddenOnLoad").show();
    });     

    $("#viewByProduct").click(function () {
        $(".visibleOnLoad").hide();
        $(".hiddenOnLoad").show();
    });     
});

1

Erzwingen Sie im IE Radio und Kontrollkästchen, um ein "Änderungs" -Ereignis auszulösen:

if($.browser.msie && $.browser.version < 8)
  $('input[type=radio],[type=checkbox]').live('click', function(){
    $(this).trigger('change');
  });

1

Ab jquery 1.6 ist dies kein Problem mehr. Ich bin mir nicht sicher, wann es behoben wurde. Gott sei Dank dafür



1

Der Trick mit dem Klick funktioniert ... aber wenn Sie den richtigen Status des Radios oder des Kontrollkästchens erhalten möchten, können Sie Folgendes verwenden:

(function($) {
    $('input[type=checkbox], input[type=radio]').live('click', function() {
       var $this = $(this);
       setTimeout(function() {
          $this.trigger('changeIE'); 
       }, 10) 
    });
})(jQuery);

$(selector).bind($.browser.msie && $.browser.version <= 8 ? 'changeIE' : 'change', function() {
  // do whatever you want
})

0

Wenn Sie anstelle von "Klicken" klicken, ändert sich das Verhalten. Ich möchte das Verhalten von Änderungsereignissen lieber mit einem Timer (setTimout) emulieren.

so etwas wie (Warnung - Notizblockcode):

if ($.browser.msie) {
  var interval = 50;
  var changeHack = 'change-hac';
  var select = $("#viewByOrg");
  select.data(changeHack) = select.val();
  var checkVal=function() {
    var oldVal = select.data(changeHack);
    var newVal = select.val();
    if (oldVal !== newVal) {
      select.data(changeHack, newVal);
      select.trigger('change')
    }
    setTimeout(changeHack, interval);
  }
  setTimeout(changeHack, interval);
}

$("#viewByOrg").change(function() {
  // Do stuff here
});

whoah ... ein bisschen hartnäckig, nein?
Orip

0

versuchen Sie dies, es funktioniert für mich

$("#viewByOrg")
        .attr('onChange', $.browser.msie ? "$(this).data('onChange').apply(this)" : "")
        .change( function(){if(!$.browser.msie)$(this).data('onChange').apply(this)} )
        .data('onChange',function(){alert('put your codes here')});

0

Dies kann jemandem helfen: Anstatt mit der ID des Formulars zu beginnen, zielen Sie auf die ausgewählte ID ab und senden Sie das Formular bei Änderung wie folgt:

<form id='filterIt' action='' method='post'>
  <select id='val' name='val'>
    <option value='1'>One</option>
    <option value='2'>Two</option>
    <option value='6'>Six</option>
  </select>
  <input type="submit" value="go" />
</form>

und die jQuery:

$('#val').change(function(){
  $('#filterIt').submit();
});

(Natürlich ist die Schaltfläche "Senden" optional, falls Javascript deaktiviert ist.)


0

Versuche Folgendes:

.bind($.browser.msie ? 'click' : 'change', function(event) {

0

Vermeiden Sie die Verwendung von .focus () oder .select () vor der .change () -Funktion von jquery für IE, dann , ich verwende es auf meiner Site.

Vielen Dank


0
//global
var prev_value = ""; 

$(document).ready(function () {

 if (jQuery.browser.msie && $.browser.version < 8)
      $('input:not(:submit):not(:button):not(:hidden), select, textarea').bind("focus", function () { 
         prev_value = $(this).val();

       }).bind("blur", function () { 
         if($(this).val() != prev_value)
         has_changes = true;
       });
}

0

Bitte versuchen Sie es mit jedem anstelle von Ändern / Klicken , was auch beim ersten Mal im IE und in anderen Browsern einwandfrei funktioniert

Ich arbeite nicht zum ersten Mal

$("#checkboxid").**change**(function () {

});

Funktioniert auch beim ersten Mal einwandfrei

$("#checkboxid").**each**(function () {

});
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.