web-dev-qa-db-fra.com

Les navigateurs traitent les caractères de tabulation verticaux de type entrée = texte différemment. L'un d'eux est-il correct?

En développant une validation côté serveur, j'ai découvert que (les dernières versions Windows en date d'écriture de) Firefox, Chrome et Internet Explorer gèrent les caractères de tabulation verticale différemment dans les champs de formulaire input type=text.

J'ai eu beaucoup de difficulté à coller le caractère dans l'un des navigateurs. J'ai donc utilisé JavaScript pour renseigner le texte saisi sur mon formulaire de test de la manière suivante:

document.getElementById('theField').setAttribute('value', "hello\vthere");

Vous pouvez voir certaines des différences côté client dans ceci JSFiddle .

Il y a des différences dans la façon dont les navigateurs:

  • affiche la valeur dans le champ de saisie.
  • permettre à JavaScript de récupérer la valeur
  • rend le caractère lorsqu'il est utilisé pour remplir innerHTML d'une balise <pre>
  • envoyer la valeur au serveur.

Ce tableau ci-dessous montre ce que j'ai trouvé:

Browser    | displayed   | put into pre-tag | logged to console | received by server
------------------------------------------------------------------------------------
Chrome     | hello       | hellothere       | hellothere        | hello
------------------------------------------------------------------------------------
Safari     | hello       | hellothere       | hellothere        | hello
------------------------------------------------------------------------------------
Firefox    | hellothere  | hellothere       | hellothere        | hello
  FF cont. |             |                  |                   |      there
------------------------------------------------------------------------------------
IE         | hello there | hello there      | hello             | hello
  IE cont. |             |                  |   there           |      there
------------------------------------------------------------------------------------
Opera      | hellothere  | hello            | hello             | hello
  Op cont. |             | there            | there             |      there

Pour la console, j'ai utilisé les outils de développement intégrés à chaque navigateur (je ne pouvais pas faire fonctionner JSFiddle avec Firebug).

Existe-t-il une spécification sur la manière dont les navigateurs sont supposés gérer ce caractère dans ce type de champ de formulaire? Si oui, quelle est la spécification et quel navigateur la suit?

3
benrifkah

Réponse mise à jour

tkent, un développeur de chrome qui s’est efforcé de résoudre le problème de troncature des valeurs de son navigateur, a trouvé les spécifications du WHATWG indiquant que l’onglet vertical (U + 000B) est légal et ne doit pas être modifié dans divers contextes. Le type d'entrée = texte est pertinent pour cette question:

http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#attribute-value- (double guidé) -state

Les caractères VT sont dans "Tout le reste". Il est ajouté tel quel à une valeur d'attribut.

Ce qui précède est extrait de son commentaire original sur le suivi des émissions de chrome.

Réponse originale Je n'ai pas trouvé de spécification HTML ou HTTP qui interdit spécifiquement la tabulation verticale dans les valeurs d'entrée de formulaire. Mais sur la base d'informations indirectes Firefox, I.E. et Opera semblent plus corrects.

La valeur d'entrée peut être considérée comme une valeur d'attribut d'élément, auquel cas elle entre dans la définition d'une valeur d'attribut. Le brouillon des spécifications HTML5. indique que valeurs d'attribut "sont un mélange de références de texte et de caractères, sauf que le texte ne peut pas contenir d'esperluette ambiguë."

Leurs définitions de " text " et " références de caractères " n'excluent pas spécifiquement l'onglet vertical. D'après mes lectures, cela suggère que c'est autorisé.

En outre, les développeurs de chrome ont convenu que c'est un problème et travaillent pour le résoudre.

1
benrifkah

Je dirais que le caractère de tabulation verticale est l'un des caractères d'espacement classiques ASCII (Unicode, par exemple, en connaît un peu plus), de sorte que HTML devrait le "réduire" à un seul espace en texte normal (white-space: normal).

A partir d'une session en ligne de commande Python:

>>> import string
>>> string.whitespace
'\t\n\x0b\x0c\r '
>>> string.whitespace == '\t\n\v\f\r '
True
>>> map(ord, '\t\n\v\f\r ')
[9, 10, 11, 12, 13, 32]

Les navigateurs peuvent ne pas savoir quoi faire à propos de l'onglet vertical ('\ v') car il est rarement utilisé de nos jours; Je pense que cela avait plus d'importance à l'époque des imprimantes non graphiques avec des jeux de caractères à largeur fixe. Mais il s’agit d’un caractère juridique (même s’il n’est pas facile à saisir, ce qui est vrai aussi pour le caractère de tabulation "normal" dans les formulaires Web), il doit donc être stocké et transmis comme n'importe quel autre.

0
Tobias