Экранирование Апострофов в Javascript, Сгенерированном из PHP


Я пытаюсь создать текстовое поле с начальным значением, где, если вы нажмете на него, текст исчезнет, и если вы нажмете до того, как что-либо будет введено, начальное значение вернется так же, как поле поиска на Yahoo answers и многих других сайтах.

echo "<input type=\"text\" 
onblur=\"if (this.value == '') {this.value = '$cleaned';}\" 
onfocus=\"if (this.value == '$cleaned') {this.value = '';}\" 
value=\"$cleaned\" />\n";

У меня есть переменная php $cleaned в качестве начального значения. Этот код работает, за исключением случая, когда в очищенной переменной есть апостроф, например $cleaned = "FRIEND'S". Тогда код будет гласить this.value = 'FRIEND'S' и апостроф в FRIEND'S заканчивает строку рано.

Я пробовал использовать html-объекты, избегая апострофа и используя экранированные кавычки, и не могу заставить этот случай работать. Единственное решение, которое у меня пока есть, - это заменить апострофы символами, похожими на апострофы.

Кто-нибудь знает, как справиться с этим делом?

Author: jkeesh, 2010-09-06

3 answers

Использовать json_encode для кодирования данных, которые будут использоваться в JavaScript и htmlspecialchars для кодирования строки, которая будет использоваться в значении атрибута HTML:

echo '<input type="text"
onblur="'.htmlspecialchars("if (this.value == '') {this.value = ".json_encode($cleaned).";}").'" 
onfocus="'.htmlspecialchars("if (this.value == ".json_encode($cleaned).") {this.value = '';}").'"
value="'.htmlspecialchars($cleaned).' />'."\n";

Но используя defaultValue конечно, проще:

echo '<input type="text"
onblur="'.htmlspecialchars("if (this.value == '') {this.value = defaultValue;}").'" 
onfocus="'.htmlspecialchars("if (this.value == defaultValue) {this.value = '';}").'"
value="'.htmlspecialchars($cleaned).'" />'."\n";
 3
Author: Gumbo, 2010-09-05 22:02:16

Сначала сгенерируйте чистый код JavaScript. Вы можете создать допустимые значения JavaScript с помощью json_encode, например:

$js = 'if (this.value == '.json_encode($cleaned).') {this.value = "";}';

Затем сгенерируйте HTML-код. Вы можете кодировать все атрибуты HTML, включая те, которые содержат встроенный код JavaScript, с помощью htmlspecialchars, например:

echo '<input type="text" onblur="'.htmlspecialchars($js).'" />';
 1
Author: JW., 2010-09-05 22:01:49

Как насчет этого

echo '<input type="text" 
onblur="if (this.value == "") {this.value = "' . $cleaned . '";}" 
onfocus="if (this.value == "' . $cleaned . '") {this.value = "";}" 
value="' . $cleaned . '" />\n';
 0
Author: leonardys, 2010-09-05 21:53:44