web-dev-qa-db-de.com

jQuery Uniform Checkbox (nicht) wird nicht geprüft

Ich verwende jQuery Uniform , um Eingaben zu gestalten/auszuwählen. Das Kontrollkästchen funktioniert jedoch nicht mehr. Ich bin appending Daten, die von einem Ajax-Anruf gesendet wurden. Nach dem Laden verwende ich $.uniform.update("input:checkbox"), um die neue HTML-Datei zu aktualisieren. Wenn Sie versuchen, die Eingabe zu (un) überprüfen, funktioniert sie nur einmal. Wenn ich es erneut (un) prüfen möchte, ändert sich das überhaupt nicht.

Ich habe versucht, das Uniform Javascript so zu ändern, dass alle Aktionen (dh click, focus, blur etc) unter der .live-Funktion stehen. (dh .live("click",). Dies verhindert, dass alles funktioniert. 

Update:

Ich habe die Uniform JS vollständig durchgelesen und ein Problem entdeckt: 

if(!$(elem).attr("checked")){
    //box was just unchecked, uncheck span
    spanTag.removeClass(options.checkedClass);
}else{
    //box was just checked, check span.
    spanTag.addClass(options.checkedClass);
}

Die .attr("checked")-Syntax schlägt fehl. Es wird immer falsch zurückgegeben. Warum? Ich weiß es nicht. Außerdem wird die ursprüngliche input nicht aktualisiert, um entweder das checked-Attribut zu entfernen oder das checked-Attribut festzulegen. 

Ich habe die offizielle Website durchlaufen und festgestellt, dass die Checkbox-Eingabe nicht aktualisiert wird. Es ist also nicht nur ich xP

Ich habe ein bisschen gegoogelt und verschiedene Methoden gefunden, um zu überprüfen, ob ein Kontrollkästchen aktiviert ist. Die folgenden Methoden schlagen jedoch fehl:

if ($(elem).attr("checked")) // The original.
if ($(elem).attr("checked") == true)
if ($(elem).is(":checked"))
if ($(elem).checked)
// and:
var check = $(elem).match(/checked=/);
if (check == null)

Worte der Führung werden sehr geschätzt ~: 3

31
escproxy

EINFACHE LÖSUNG

Dies liegt daran, dass UniformJs Sie Ihre Änderungen an einheitlichen Elementen aktualisieren müssen, wenn Sie Werte im Formular dynamisch ändern müssen:

$('#checkbox').prop('checked',true);
$.uniform.update();

Bearbeiten

Wenn Sie nur den #checkbox aktualisieren möchten:

$('#checkbox').prop('checked',true);
$.uniform.update('#checkbox');
54
Mick

Mach einfach das:

$('#checkbox').prop('checked',true).uniform('refresh');
18
moledet

Ich weiß, dass dies ein bisschen spät sein kann, aber hoffentlich wird es jemandem helfen. Ich musste dem einheitlichen Code ein paar Zeilen hinzufügen, damit nach vorab markierten Kontrollkästchen gesucht werden konnte. Dieser Code beginnt bei Zeile 262 für mich. Ich verwende die einheitliche Version 1.7.5. Die Zeilen zwischen den von John hinzugefügten Notizen sind das, was ich hinzugefügt habe.

        "click.uniform touchend.uniform": function(){
      if(!$(elem).attr("checked")){
        //box was just unchecked, uncheck span
        spanTag.removeClass(options.checkedClass);
      // Added by John to look for checkboxes with the attr "checked" that have been click to uncheck
      }else if(!$(elem).is(':checked')){
        spanTag.removeClass(options.checkedClass);
      // end addition by john
      }else{
        //box was just checked, check span.
        spanTag.addClass(options.checkedClass);
      }
    },
7
John Goodman

Es ist eine Weile her, aber ich hatte das gleiche Problem, aber ich löste es durch eine einfache Lösung.

Uniform fügt eine span über dem Ankreuzfeld hinzu und gibt ihr die Klasse checked, wenn sie markiert ist oder nicht, aber nur beim Laden der Seite. Wenn Sie das Kontrollkästchen aktivieren oder deaktivieren, während die Seite bereits geladen ist, wird die Markierung deaktiviert (oder angekreuzt). Da jedoch die Variable span darüber liegt, wird sie als nicht aktualisiert angezeigt. Sie müssen dies manuell tun.

$('#myDiv input[type=checkbox]').attr('checked',true);
$('#myDiv input[type=checkbox]').parent().addClass('checked');

oder

$('#myDiv input[type=checkbox]').attr('checked',false);
$('#myDiv input[type=checkbox]').parent().removeClass('checked');

Ist vielleicht nicht die sauberste Lösung, funktioniert aber in jedem Browser.

2
Jeff B.

jQuery 1.6.4 hat die Bedeutung der attr()-Funktion geändert, die von jquery.uniform.js verwendet wird. attr() gibt jetzt den Status zurück, in dem sich das Attribut befand, als die Seite geladen wurde, und nicht der Status des Attributs JETZT. Es gibt eine Ersetzungsfunktion namens prop(), die den Job erledigt, für den attr() früher gearbeitet hat.

Um das Plugin zu reparieren, ersetzen Sie jedes Vorkommen von attr("checked") durch prop("checked"). Ändern Sie auch attr("disabled") in prop("disabled").

Das sollte dein Projekt reparieren. Es hat für mich funktioniert ;-)

Siehe auch: https://github.com/pixelmatrix/uniform/pull/167 , das versucht, das Problem mit einer besseren Abwärtskompatibilität zu beheben.

2
Grant

Ich glaube, die neueste Version von Jquery verwendet eine andere Methode, um einen: geprüften Wert auszuwerten. Mit einer etwas älteren Version (obwohl nicht ideal) wurde dieses Problem für mich behoben. Das war vor einiger Zeit, und PixelMatrix scheint Uniform noch nicht aktualisiert zu haben.

1
Danny

Könnten Sie nicht so etwas verwenden?

$("#checkbox").attr("checked", "true");

um das Kontrollkästchen zu aktivieren, und

$("#checkbox").removeAttr("checked");

um es zu deaktivieren

0
Mads Ohm Larsen

Sie müssen .attr() nicht in .prop() ändern:

    "click.uniform touchend.uniform": function(){
        if(!$(elem).attr('checked')){
            //box was just unchecked, uncheck span
            spanTag.removeClass(options.checkedClass);

            //Added by PingOn
            $(elem).removeAttr('checked');
            //end addition by PingOn

            // Added by John
        }else if(!$(elem).is(':checked')){
            spanTag.removeClass(options.checkedClass);
            // end addition by john

            //Added by PingOn
            $(elem).removeAttr('checked');
            //end addition by PingOn
        }else{
            //box was just checked, check span.
            spanTag.addClass(options.checkedClass);

            //Added by PingOn
            $(elem).attr('checked','true');
            //end addition by PingOn
      }
0
PingOn