Je désire afficher dans le même élément
, un texte préformaté qui donne soit la version VBScript, soit la version Javascript d'un code ASP.
Pour cela j'utilise deux variables chaînes : textJS et textVB dans lesquelles les sauts de lignes sont générés par des "\n", la chaîne étant
placée à l'intérieur d'un élément HTML .
La bascule d'un texte à l'autre se fait à partir d'un click sur un élément qui prend la valeur "Afficher le code en Javascript" lorsque le code affiché est du VBscript et "Afficher le code en VBscript" lorsque le code affiché est du Javascript.
Dans l'événement onload de l'élément , je lance la fonction une première fois pour afficher le code en VBscript.
Le code s'affiche correctement sur IE8, Firefox, Chrome (tous les sauts de lignes sont effectués).
Par contre lorsque je clique sur le bouton pour afficher le code en Javascript :
- Sur Firefox et Chrome tout se passe normalement
- Sur IE8, tous les sauts de lignes commandés par les \n ont disparu (en fait, ils n'ont pas disparu, ils ont été basculés en fin de chaîne)
La séquence \r\n ne fonctionnant pas mieux que la séquence \n\r, je viens de résoudre le problème avec ce petit script :
auparavant, je crée une variable globale :
var ie=false;
Ensuite dans ma fonction d'affichage du code, j'inclus ces instructions :
if (navigator.appName=="Microsoft Internet Explorer"&&ie==false) {
textJS=textJS.replace(/\n/g,"
");
textVB=textVB.replace(/\n/g,"
");
ie=true;
}
Avec ceci, le séquence \n est remplacée par un élément
une seule fois et tout fonctionne.
Par contre, je confirme que dans une fonction alert(), les \n provoquent bien des sauts de lignes avec Internet Explorer.
Je persiste donc à croire que le comportement d'Internet Explorer n'est pas normal dans cette séquence.
Merci tout de même d'avoir essayé d'apporter des solutions à ce problème....
Qu'obtiens tu lorsque tu fait un alert(Code.split('\n').length);
Pour moi, il s'agit du bug d'Internet Explorer. non puisque cela marche au début...
J'avais fait un truc comme ceci dans une de mes sources
//---------------------
function Affiche_Code(){
var S_Obj = document.getElementsByTagName('script');
var szTmp = new String(S_Obj[0].text);
var szFind = new RegExp("\<","gi");
var szTmp = szTmp.replace( szFind, "<");
document.write( '<script type="text/javascript">' +szTmp +'<script><\/pre>');
}
Bonjour,
Par contre, je confirme que dans une fonction alert(), les \n provoquent bien des sauts de lignes avec Internet Explorer. pas seulement IExplorer mais TOUS les navigateurs
...essaies ce code sur les différents navigateurs
<html>
<head>
<script type= "text/javascript">
alert("Texte avec un\npassage à la ligne type '\\n'");
alert("Texte avec un\rpassage à la ligne type '\\r'");
</script>
</head>
</html>
nota : \r\n est valide sous IExplorer et Opera
Ta façon de procéder fait que sous IExplorer tu perds l'indentation de ton code.
Le format de sortie de ton code dépend également du format avec lequel ton éditeur enregistre les fichiers, Windows, UNIX ou Mac, modifiant entre autre les line endings.
En insérant les textes en modifiant le innerHTML de l'objet de destination tu t'exposes à des surprises, cette technique étant fortement utilisé mais pas forcément recommandable, bien que très pratique.
Il existe une méthode, createTextNode de l'objet document qui rempli ce rôle à ravir et en respectant la structure du DOM.
En relisant je présumes(???) que tu insères les code grâce à un document.write, pourquoi dans ce cas ne pas tout insérer puis cacher/afficher ce qui t'intéresses suivant le besoin.
Je te livres ce petit code pour test, c'est assez instructif suivant les navigateurs et les formats d'enregistrement.
<html>
<head>
<script type ="text/javascript">
//----------------
function GetCode(){
var oScript = document.getElementsByTagName( 'script');
var szTmp = new String( oScript[0].text);
return( szTmp);
}
</script>
</head>
Ecriture par createTextNode
Ecriture par innerHTML
Ecriture Directe
<script type="text/javascript">
//-- Get le Code
var S_Obj = document.getElementsByTagName('script');
var szTmp = GetCode();
//-- Ecriture directe
document.write( '' +szTmp+'<\/pre>');
//-- Ecriture createTextNode W3C
var oPre = document.getElementById( 'P_TEXT');
oPre.appendChild( document.createTextNode( szTmp));
//-- Ecriture innerHTML
oPre = document.getElementById( 'P_INNER');
oPre.innerHTML = szTmp;
</script>
</html>
Le principal restant que ce que tu voulais faire fonctionne !
;O)