11486 sujets

JavaScript, DOM et API Web HTML5

Bonjour.

Tout est dans le titre, j'ai fais une fonction qui permet d'afficher/masquer les numéros des lignes dans un champ texte.

// 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){
 var array=document.getElementById('page').value.split("\n");
 var maxLength=String(array.length).length;
 if(checkbox.checked==true){
  for(j=0; j<array.length; j++){
   array[j]=String(j+1)+repeatString(' ', maxLength+1-String(j+1).length)+array[j];
  }
  document.getElementById('page').value=array.join("\n");
 }
 else{
  for(j=0; j<array.length; j++){
   array[j]=array[j].substring(maxLength+1, array[j].length);
  }
  document.getElementById('page').value=array.join("\n");
 }
}
window.onload=function (){
 document.getElementById('controls').style.display='inline';
 lineNumbers(document.getElementById('c1'));
};


Au passage j'aimerais savoir s'il n'y aurait pas un meilleur moyen de répéter un caractère que la fonction ci-dessus qui s'appelle repeatString. Smiley murf

Voila j'attends vos critiques avant de le mettre dans les scripts utiles.
Modifié par Changaco (15 Jan 2011 - 15:10)
Apparemment, le fichier HTML n'est pas rechargé, même en forçant avec les touches Ctrl+F5.
Une solution serai :
Après avoir ajouté les numéros de ligne, d'ajouter une dernière ligne avec un commentaire du genre :
// numéros de ligne ajoutés
et au lieu de
if(checkbox.checked==true){
, rechercher la présence de cette ligne Smiley biggol
Modifié par chmel (21 Dec 2007 - 13:28)
chmel a écrit :
Apparemment, le fichier HTML n'est pas rechargé, même en forçant avec les touches Ctrl+F5.
Rien à voir c'est juste que Firefox garde les données du champ.
chmel a écrit :
Une solution serai :
Après avoir ajouté les numéros de ligne, d'ajouter une dernière ligne avec un commentaire du genre :
// numéros de ligne ajoutés
et au lieu de
if(checkbox.checked==true){
, rechercher la présence de cette ligne Smiley biggol
Je vais y réfléchir.
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. Smiley smile
Modifié par Changaco (23 Dec 2007 - 11:48)