2010-11-23 14 views
0

Ich füge ein Element zu einem Array hinzu, wenn das Kontrollkästchen aktiviert ist und ich es entfernen muss, wenn es nicht markiert ist. Ich benutze Spleiß, um ein Element zu entfernen. Ich kann einfach kein Ereignis aufrufen, wenn es nicht aktiviert ist. Ich habe versucht, mit dieser:Element aus Array entfernen, wenn Kontrollkästchen deaktiviert ist

if ($('input[name="'+category+'"]:checked')) 
    item_id[category] = $(this).attr("id"); 
else 
    item_id.splice(category, 1); 

Es fügt das benötigte Element ok, wenn das Kontrollkästchen aktiviert ist, aber es scheint nicht, es zu entfernen, wenn es nicht aktiviert ist. Variable Kategorie ist eine Schleifenvariable und ist korrekt.

Wenn jemand dies erarbeiten kann, würde es sehr geschätzt werden.

+0

Ist 'item_id' definitiv ein Array und ist' category' definitiv eine ganze Zahl? –

Antwort

1

Nicht ganz sicher, was Sie nach, ehrlich zu sein, aber hier meine Lösung ist, hoffen, dass es für Sie in irgendeiner Weise arbeitet

Javascript Array - indexOf Methode: http://www.tutorialspoint.com/javascript/array_indexof.htm

<script> 

if (!Array.prototype.indexOf) 
{ 
    Array.prototype.indexOf = function(elt /*, from*/) 
    { 
    var len = this.length; 

    var from = Number(arguments[1]) || 0; 
    from = (from < 0) 
     ? Math.ceil(from) 
     : Math.floor(from); 
    if (from < 0) 
     from += len; 

    for (; from < len; from++) 
    { 
     if (from in this && 
      this[from] === elt) 
     return from; 
    } 
    return -1; 
    }; 
} 

$(function() { 

    var checkedItems = new Array(); 

    $(":checkbox").change(function() { 
     if($(this).attr('checked')) 
     { 
     checkedItems.push($(this).attr("id")); 
     } 
     else 
     { 
     var index = checkedItems.indexOf($(this).attr("id")); 
     checkedItems.splice(index,1); 
     } 
    }); 

}); 
</script> 

HTML

<input type="checkbox" id="c1" value="1"> 
<input type="checkbox" id="c2" value="2"> 
<input type="checkbox" id="c3" value="3"> 
+0

das funktioniert so, wie ich gefragt habe. Es gibt nur noch einige andere Probleme zu lösen. Vielen Dank. – donkapone

+0

oh wirklich, es gibt ein paar Probleme? Ist es mit dem Code, den ich gepostet habe oder dem ich vergessen habe, in den Code aufzunehmen? – manraj82

1

Die Funktion splice soll zurückgeben, was entfernt wurde. Starten Sie das Debuggen, indem Sie den Rückgabewert anzeigen.

2

jQuery-Selektoren geben immer ein Objekt zurück, ob ein Element übereinstimmt oder nicht.

Was Sie effektiv haben, ist:

if (new Object()) 
    item_id[category] = $(this).attr("id"); 
else 
    item_id.splice(category, 1); 

Objekte sind immer truthy (egal ob es sich um ein leeres Objekt ist, oder ein Objekt John Resig initialisiert), so dass diese if Anweisung wird nie die else auszuführen.

Was sind Sie wahrscheinlich nach its:

if ($('input[name="'+category+'"]:checked').length) 
    item_id[category] = $(this).attr("id"); 
else 
    item_id.splice(category, 1); 

, die die length Eigenschaft stattdessen überprüft.

Dies funktioniert jedoch immer noch nicht, da splice() alle Elemente in Ihrem Array verschiebt; die category falsch machen.

Wenn Sie das Ereignis an eine Anzahl von Checkbox-Elementen binden, ist es unklug, .bind() (und seine Gegenstücke .click()) zu verwenden, da diese Methode ein Ereignis für jedes Kontrollkästchen bindet. Verwenden Sie stattdessen .live() oder .delegate(); Dies bindet ein Ereignis an einen Vorfahren aller Checkbox-Elemente, und auf Ereignis (mit JavaScripts Event Bubbling), die viel effizienter ist.

Wenn Sie diese beiden Punkte in Betracht ziehen, können Sie sich so etwas vorstellen.

$(yourJquerySelector).live('change', function() { 
    var category = '?' // (this.value ?) 

    item_id[category] = this.checked ? this.id : undefined; 
}); 
+0

Vielen Dank für Ihre Eingabe. Nun, was ich tatsächlich habe, ist dies: Ich überprüfe die Checkbox-Länge, und es wird das Element zu einem Array hinzufügen, aber es wird nie anders aufrufen (Ich habe es mit einer Warnung überprüft). Wenn es überprüft wird, ist die Länge 1, aber wenn nicht, gibt es nichts zurück, daher wird es nicht ausgeführt. Das Gleiche gilt für die .is() -Methode. Ich benutze .live() mit 'ändern' Ereignis. – donkapone

+0

@donkapone: Was meinst du "es wird nichts zurückgeben"? Wenn keine Elemente übereinstimmen, wird die Länge 0 sein. Diese Art der Sache erscheint viele hundert Mal in jQuery-Code. Können Sie Ihre Frage so aktualisieren, dass sie genau das enthält, was Sie jetzt haben? (und vielleicht ein bisschen extra; wie die gesamte Ereignisbindung und die Variablendeklarationen von 'item_id' und' category'). – Matt

+0

Ich müsste den ganzen Code kopieren, der ungefähr 200 Zeilen enthält, damit Sie verstehen, wo item_id und category deklariert sind, weil sie überall zu finden sind. Was ich damit meinte, dass es nichts zurückgeben wird, ist, dass ich die Länge in Firebug Console ausdruckt, und es zeigt 1, wenn es ausgewählt ist und es nichts ausdruckt, wenn es nicht ausgewählt ist. Hier ist der Code: http://pastebin.com/8CGLtqm7 Der eingefügte Code ist in der updateDivResult() -Methode, die Ereignisse werden am Ende aufgerufen, wenn der Körper geladen wird. item_id erhält seinen Wert von der Methode getDefault(). products_custom ist ein Array meiner Werte. – donkapone

1

Ihr, wenn die Bedingung ändern:

$('input[name="'+category+'"]').is(':checked') 

Wie von Matt erwähnt, Ihre aktuelle, wenn die Bedingung ein Selektor ist, die eine Liste von jQuery Elemente zurückgibt. Das Testen der Anzahl der zurückgegebenen Elemente (mit der length -Eigenschaft) würde ebenfalls den Zweck erfüllen.

Verwandte Themen