2010-09-14 4 views
5
​<input id="test" type="text" value="text" />​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ 

alert(​$(':input:not([readonly])').length);​​​​​​​​​​​​​​​​​ // 1 

$('#test').attr('readonly', 'readonly'); 

alert($(':input:not([readonly])').length); // 1 

$('#test').removeAttr('readonly');​​​​​​​​​​ 

alert($(':input:not([readonly])').length); // 1 

Suite à the question here, je ne peux pas la solution pour travailler car il semble jQuery ne définit pas l'attribut readonly correctement (ou au moins régulièrement).jQuery set puis lire sur attr en lecture seule zone de texte

note I obtenir les mêmes résultats avec $('#test').attr('readonly', true);

J'utilise Chrome, et l'attribut lecture seule rend comme readonly="". Il y a un autre article ici qui suggère que FireFox fait la même chose. Je ne suis pas vraiment dérangé à ce sujet dans la mesure où il empêche toujours la zone de texte d'être modifiable, mais je ne peux pas trouver un moyen de détecter l'attribut readonly.

J'aime normalement jQuery mais c'est un peu WTF.

Des idées?

+1

La raison pour laquelle vous voyez ce comportement parce que le sélecteur '[readonly]' vérifie juste la * présence * de l'attribut, et 'true' ou' false', il est présent. –

Répondre

7

Personnellement, je n'utiliserais pas removeAttr() ... Je le mettrais simplement à false avec attr().

Vous pouvez alors simplement interroger la propriété normalement:

if ($("#X").attr("readonly")) 
{ 
    execute code 
} 

, vous pouvez également continuer à utiliser removeAttr(), puis il suffit d'utiliser la longueur comme un moyen de détecter la propriété:

if (!$("#X").attr("readonly").length) 
{ 
    execute code 
} 

Si vous êtes inquiet au sujet du sélecteur, vous devriez faire la syntaxe de sélection comme :not([readonly='readonly'])éditer: Je vois que c'était déjà dans la réponse que vous avez citée.

+0

Eh bien, mais c'est l'attribut add qui cause vraiment le problème. – fearofawhackplanet

+0

Je ferais juste l'addition de la même façon: $ ("# X"). Attr ("readonly", true); – Trafalmadorian

+0

également dans ce cas, allez par le comportement, pas par les débogueurs de navigateur ... parfois, ils ne suivent pas toujours les changements de propriété comme ceci correctement. – Trafalmadorian

0

Je pense que même si vous parvenez à désactiver l'entrée pro-grammaticalement en utilisant Javascript, l'utilisateur intelligent sera en mesure de le changer si leur désactiver le navigateur JavaScript. Donc, pour être sûr, il est préférable de recharger la valeur de votre côté serveur.

Questions connexes