Voila la nouvelle version du script désormais largement commenté :
// Le commentaire suivant ne doit pas être effacé.
// http://forum.alsacreations.com/topic-5-31536-1-AfficherMasquer-les-numeros-de-ligne-dans-un-champ-texte.html
function repeatString(str, num){
var returnStr='';
for(k=1; k<=num; k++){
returnStr+=str;
}
return returnStr;
}
function lineNumbers(checkbox){
page=document.getElementById('page');
// On sauvegarde la position de la scrollbar pour firefox qui ne se replace pas automatiquement contrairement aux autres navigateurs.
posY=page.scrollTop;
posX=page.scrollLeft;
// On découpe le champ texte par ligne et on le stock dans un tableau.
array=page.value.split("\n");
// Si c'est la première exécution de la fonction on calcule la taille du numéro correspondant à la dernière ligne.
if(typeof(maxLength)=='undefined') maxLength=String(array.length).length;
// On calcule le nombre de caractère à enlever/ajouter par ligne uniquement s'il faut en ajouter de façon à ne pas en supprimer plus qu'il n'y en a.
if(checkbox.checked==true) maxLength=String(array.length).length;
// On vérifie si les numéros de ligne sont déjà affichés grâce à un champ texte caché.
lineNumbersHidden=document.getElementById('lineNumbersHidden');
if(lineNumbersHidden.value=='true' && checkbox.checked==false) lineNumbersHidden.value='false';
else if(lineNumbersHidden.value=='false' && checkbox.checked==true) lineNumbersHidden.value='true';
else if((lineNumbersHidden.value=='true' && checkbox.checked==true) || (lineNumbersHidden.value=='false' && checkbox.checked==false)) return;
else if(lineNumbersHidden.value==''){
lineNumbersHidden.value=checkbox.checked;
return;
}
// On rajoute/enlève le numéro pour chaque ligne du champ.
for(j=0; j<array.length; j++){
if(checkbox.checked==true) array[j]=String(j+1)+repeatString(' ', maxLength+1-String(j+1).length)+array[j];
else array[j]=array[j].substring(maxLength+1, array[j].length);
}
page.value=array.join("\n");
// On replace la scrollbar de Firefox.
page.scrollTop=posY;
page.scrollLeft=posX;
}
function savePos(){
document.getElementById('posYHidden').value=document.getElementById('page').scrollTop;
document.getElementById('posXHidden').value=document.getElementById('page').scrollLeft;
return true;
}
function setPos(){
document.getElementById('page').scrollTop=document.getElementById('posYHidden').value;
document.getElementById('page').scrollLeft=document.getElementById('posXHidden').value;
return true;
}
window.onload=function (){
// On affiche la checkbox.
document.getElementById('controls').style.display='inline';
// On vérifie si les commentaires sont affichés, si oui on les enlève.
// Ces balises de commentaires servent à pouvoir afficher du code HTML contenant une balise </textarea> dans Firefox, Opera et IE.
page=document.getElementById('page');
if(document.getElementById('comments').value=='yes'){
page.value=page.value.substring(4, page.value.length-3);
document.getElementById('comments').value='no';
}
c1=document.getElementById('c1');
lineNumbers(c1);
// Si l'utilisateur appuie sur entrée dans le champ alors on cache les numéros de lignes car ils ne sont plus bons.
// On place le retour à la ligne manuellement car sinon il se retrouve à la fin du champ.
page.onkeypress=function (event){
var key=window.event?window.event.keyCode:event.keyCode;
if(key==13 && c1.checked==true){
var page=document.getElementById('page');
savePos();
if(document.selection) document.selection.createRange().text="\n"+repeatString(' ', String(page.value.split("\n").length).length+1);
else if(page.selectionStart) page.value=page.value.substr(0, page.selectionStart)+"\n"+repeatString(' ', String(page.value.split("\n").length).length+1)+page.value.substr(page.selectionEnd);
setPos();
c1.checked=false;
lineNumbers(c1);
return false;
}
};
// Si la page est rafraîchie alors on sauvegarde les positions de scroll dans les champs texte car Firefox les conserve.
window.onunload=savePos;
// On replace la scrollbar de Firefox si l'on vient de rafraîchir la page.
setPos();
};
* Améliorations de cette deuxième version
Le problème des doubles numéros de ligne dans Firefox a été réglé grâce à un champ texte caché.
La scrollbar de Firefox est désormais replacée au rafraîchissement de la page et quand on affiche ou cache les lignes.
Les numéros de lignes sont désormais cachés lorsque l'on en insère une nouvelle, logique puisque s'il y en a une de plus ils ne sont plus bons.
Masquage au chargement des commentaires de début et de fin qui servent à "cacher" la balise </textarea> à Firefox, IE et Opera.
Voila, les critiques sont les bienvenus comme toujours. Modifié par Changaco (23 Dec 2007 - 11:48)
Assimiler ... Analyser ... Arguer
|