Экранирование Апострофов в 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-объекты, избегая апострофа и используя экранированные кавычки, и не могу заставить этот случай работать. Единственное решение, которое у меня пока есть, - это заменить апострофы символами, похожими на апострофы.
Кто-нибудь знает, как справиться с этим делом?
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";
Сначала сгенерируйте чистый код JavaScript. Вы можете создать допустимые значения JavaScript с помощью json_encode, например:
$js = 'if (this.value == '.json_encode($cleaned).') {this.value = "";}';
Затем сгенерируйте HTML-код. Вы можете кодировать все атрибуты HTML, включая те, которые содержат встроенный код JavaScript, с помощью htmlspecialchars, например:
echo '<input type="text" onblur="'.htmlspecialchars($js).'" />';
Как насчет этого
echo '<input type="text"
onblur="if (this.value == "") {this.value = "' . $cleaned . '";}"
onfocus="if (this.value == "' . $cleaned . '") {this.value = "";}"
value="' . $cleaned . '" />\n';