8 Stimmen

InnerHTML/outerHTML im IE spiegeln den Zustand der Checkbox nicht wider, außer im Quirks-Modus

Ich kämpfe gerade mit einem JavaScript/DOM-Bug im IE (was für ein Spaß), und er hat mich wirklich verblüfft. Der Code in Frage kopiert einige Kontrollkästchen in ein Formular und muss ihren markierten Zustand zu halten. Das Problem ist, IE (speziell IE8, obwohl ich vermute, andere als auch) will nicht, dass zu tun.

Ich habe den Fehler selbst auf einen sehr kleinen Testfall eingegrenzt. Im Grunde funktionieren die Dinge ohne DOCTYPE auf der Seite korrekt, aber sie sind kaputt, wenn ein DOCTYPE vorhanden ist. Ich hätte das Gegenteil erwartet, aber wer weiß das schon beim IE.


Im Folgenden sind die einfachsten möglichen Testfälle aufgeführt. Für jeden dieser Fälle gilt: Öffnen Sie die Seite im IE, aktivieren Sie das Kontrollkästchen und klicken Sie auf "TEST".

Erzeugt den Fehler nicht:

<input type="checkbox" id="broken">
<button id="break">TEST</button>
<script>
 document.getElementById('break').onclick = function() {
  alert(document.getElementById('broken').outerHTML);
 };
</script>

Link

Erzeugt den Fehler:

<!DOCTYPE html>
<input type="checkbox" id="broken">
<button id="break">TEST</button>
<script>
 document.getElementById('break').onclick = function() {
  alert(document.getElementById('broken').outerHTML);
 };
</script>

Link

Der Fehler tritt auf gültigen Seiten auf (mit <html> , <head> , <body> usw.) und ob die Eingabe innerhalb eines Formulars erfolgt oder nicht. Im "kaputten" Fall spiegelt outerHTML immer das wider, was beim Laden der Seite vorhanden war (wenn ich die Eingabe standardmäßig angekreuzt habe, wird immer Code mit CHECKED gemeldet, auch wenn ich die Markierung zuerst aufhebe). Das Gleiche passiert, wenn ich die Eingabe umschließe und innerHTML verwende. Auf der aktuellen Website verwende ich die jQuery-Methode .clone(), um das Kopieren durchzuführen; .clone() verwendet intern .outerHTML, und so habe ich das Problem eingegrenzt.


Meine Frage lautet: Gibt es eine Möglichkeit, dieses Problem zu umgehen, ohne dass ich selbst manuell neues HTML erstellen muss? Und hat jemand eine Idee, WARUM das überhaupt passiert (außer "IE SUX LOLZ")?

0 Stimmen

Beide Versionen, ob das Kontrollkästchen aktiviert ist oder nicht, geben Folgendes aus undefined in Firefox 3.6.3. In Chromium 5.0.375.70 und Opera 10.10 alarmieren beide Versionen <input type="checkbox" id="broken"> (alle Browser laufen unter Linux).

0 Stimmen

Möglicherweise verwandt? -- stackoverflow.com/questions/1388893

0 Stimmen

@blow, @Marcel: Firefox unterstützt .outerHTML nicht. Ich verwende die .clone()-Methode von jQuery, die in Firefox .cloneNode() verwendet, also ist das kein Problem. Dies ist speziell eine IE-Frage.

5voto

gnarf Punkte 103284

Es gibt Probleme im Allgemeinen con innerHTML und Formeigenschaften. Nicht nur im IE ((in FF ist es noch schlimmer, da wird die Eigenschaft checked in innerHTML NIE aktualisiert))...

Sie können dies versuchen, um das Problem in der verlinkten Frage zu lösen:

document.getElementById('break').onclick = function() {
  var broken = document.getElementById('broken');
  if (broken.checked) broken.setAttribute('checked','checked');
  else broken.removeAttribute('checked');
  alert(broken.outerHTML);
};

1voto

Matt Kantor Punkte 1684

Am Ende habe ich einen Wrapper für .clone() geschrieben, der auf Gnarfs Antwort :

$.fn.inputClone = function(events) {
    this.each(function() {
        this.attr('value', this.value);

        if(this.checked) this.setAttribute('checked', 'checked');
        else this.removeAttribute('checked');

        if(this.selected) this.setAttribute('selected', 'selected');
        else this.removeAttribute('selected');
    });
    return this.clone(events);
};

Es ist nicht sehr universell einsetzbar (z. B. funktioniert es nicht, wenn Sie versuchen, Elemente zu klonen, die Eingaben enthalten), aber für diesen Fall scheint es zu funktionieren.

0voto

blow Punkte 12031

Verwenden Sie das DOM-Äquivalentobjekt eines Kontrollkästchens http://www.javascriptkit.com/jsref/checkbox.shtml

Fügen Sie es in Ihr DOM-Formular ein, verwenden Sie kein HTML und nicht diesen schmutzigen Weg.

Zur Verdeutlichung:

var domCheckBox=document.getElementById('mycheckboxID');
var domForm=document.getElementById('myformID');
domForm.appendChild(domCheckBox);

Dadurch wird das Kontrollkästchen dem Formular hinzugefügt und der Status "markiert" (und andere) beibehalten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X