2010-10-14 5 views
1

j'ai ce code jQuery:jquery et textarea

$("#text_a").html('<textarea name = "text">".$text_user."</textarea>'); 

Et si je mets dans le texte textarea avec la nouvelle ligne que je reçois cette erreur:

unterminated string literal 

Je reçois une erreur avec ce texte:

First line... 
Second line ... 
+0

Est-ce le code JavaScript réel qui s'exécute sur le navigateur? Ou est-ce du code source PHP? –

+0

Définissez-vous la valeur de $ text_user par php? – thomaux

+0

@Anzeo - It * is * PHP '. $ Text_user.' concatène la chaîne avec la variable PHP, ce n'est pas la version rendue. –

Répondre

2

En supposant que c'est en fait une question PHP, j'utilise normalement json_encode() pour générer des chaînes JavaScript. Par exemple:

// Prints: var myString = "Hello\nWorld"; 
var myString = <?php echo json_encode("Hello\nWorld"); ?>; 

Retour en JavaScript, vous voulez probablement éviter l'injection HTML et les attaques XSS:

var myTextarea = $('<textarea name="text"></textarea>').text(<?php echo json_encode($text_user); ?>); 
$("#text_a").html(myTextarea); 

Additif

Un peu test qui illustre la nécessité d'échapper à bon:

<?php 

$text_user = '</textarea><a href="http://www.google.com">Google></a><textarea>'; 

?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head><title></title> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> 
<script type="text/javascript"><!-- 
jQuery(function($){ 
    // Proper escaping 
    var myTextarea = $('<textarea name="text"></textarea>').text(<?php echo json_encode($text_user); ?>); 
    $("#text_a").html(myTextarea); 

    // HTML injection 
    $("#text_b").html('<textarea name="text">' + <?php echo json_encode($text_user); ?> + '</textarea>'); 
}); 
//--></script> 
</head> 
<body> 

<div id="text_a"></div> 
<div id="text_b"></div> 

</body> 
</html> 
+0

'.html() 'obtient le code HTML * interne * d'un élément, donc cela n'aura pas le même effet. –

+0

@Nick Craver, je viens de corriger la partie JavaScript. Cela devrait fonctionner comme prévu maintenant. –

0

vous ne pouvez pas avoir des sauts de ligne au milieu d'une chaîne, vous devez soit:

$("#text_a").html('<textarea name="text">First line...\ 
Second line ...</textarea>'); 

Ou mieux, à mon avis, échapper à vos nouvelles lignes, comme ceci:

$("#text_a").html('<textarea name="text">First line...\nSecond line ...</textarea>'); 

There are a few encoding options, par exemple:

$("#text_a").html('<textarea name = "text">".json_encode($text_user)."</textarea>'); 
+0

Mais comment échapper à toutes les nouvelles lignes dans la chaîne php? – lolalola

+0

@lolalola - Comme ceci: '$ (" # text_a "). Html ('');' Voir cette question pour plus de détails: http://stackoverflow.com/questions/168214/pass-a-php-string-to-a-javascript-variable-including-escaping-newlines –

1

Vous confondez avec PHP javascript. Pourrait être quelque chose comme:

var text_user = "<?= nl2br(htmlentities($text_user)) ?>"; 
$("#text_a").html('<textarea name = "text">'+text_user+'</textarea>'); 

L'opérateur de concaténation dans ecmascript est "+", pas "." comme en PHP.

+0

Ce que l'OP a posté * était * PHP, et ce que vous publiez aurait l'exact même erreur d'un littéral de chaîne non terminé. –

+0

@nick: Merci, il devrait non seulement échapper "\ n" ainsi que des citations. Je pense que son code ne fonctionnerait pas comme javascript ou PHP, et la question est étiquetée jequery/textarea. –