Danke, die Existenz von .prop war mir nicht bewusst.
Der verzwickte Unterschied zwischen Properties und Attributes bei Elementen hält die Welt seit 10 Jahren in Atem. ;) Zumeist macht es keinen Unterschied, ob attr (intern getAttribute/setAttribute/removeAttribute) oder prop (intern element.property und element.property = value) verwendet wird. Bei booleschen Elementeigenschaften wie checked, disabled, readOnly, required usw. sowie weiteren Nicht-String-Eigenschaften aus dem HTML-DOM sollte auf jeden Fall prop zum Lesen und Schreiben verwendet werden.
* Warum nur im Firefox?
Der Autocomplete interferiert hier vermutlich mit Setzen der Attribute. Der Autocomplete setzt wahrscheinlich .checked = false (nur halt in C++) und du setzt .setAttribute('checked', 'checked').
checked-Attribute und -Property sind entkoppelt, wenn die Property einmal gesetzt wurde. jQuery hat sich leider lange nicht um den Unterschied zwischen Properties und Attributes gekümmert, weder bei attr() noch in Sizzle. Früher gab es prop gar nicht, sondern attr hatte eine gewisse Heuristik, die entweder Attributes oder Properties setzte. Heute muss man selber wissen, wie man klug attr und prop verwendet. (Es gibt immer noch einige Magie in attr.)
Inkonsistent wird es letztlich nur, weil du den aktuellen Status bei change nicht abfragst. Ich würde .toggleClass(el.prop('checked')) anstatt nur toggleClass verwenden. Dann funktioniert der Autocomplete korrekt (warum ihn abschalten?).
Mathias