<a onclick="run('Hi, Tim! I&#039;ve got two', '">test</a>
onclick
olay hiç çalışmaz.
Yukarıda böyle bir şey tarafından oluşturulur:
<a onclick="run(<?php echo htmlentities($str) ?>)">test</a>
Bunu nasıl düzeltebilirim?
$str
varlık olarak kodlanmış olmaktan önce, bir:
'Hi, Tim! I've got two', '
hangi açıkça literal geçerli bir JavaScript dize değil. Kesme henüz olmamalıdır, hangi HTML kodlanmış olduğunu ve bazı sondaki saçmalık var.
Hi, Tim! I've got two
sonra json_encode
Sana doğru JavaScript dize verecektir:
'Hi, Tim! I\'ve got two'
böylece bir HTML olay işleyicisi öznitelik içine ekleyebilirsiniz:
<a onclick="run(<?php echo htmlspecialchars(json_encode($rawstr)) ?>); return false;">test</a>
Not htmlspecialchars()
, ikincisi genellikle-gereksiz tüm ASCII olmayan karakterleri HTML-kaçış gibi, htmlentities()
tercih olduğu, hangi karışıklık onları size doğru belirtmezseniz eğer charset.
PHP 5.3 itibaren, HTML-özel karakterler size bir kodlama adım kaydeder json_encode
dan çıktı, asla olmasını sağlamak için JSON_HEX_
bayrakları kullanabilirsiniz:
<a onclick="run(<?php echo json_encode($rawstr, JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_QUOT) ?>); return false;">test</a>
Hayatınızı kolaylaştırmak için, saklanması bu ortak çıkış-ile-kaçan daha basitçe adlı fonksiyonları içine yöntemleri:
function h($s) {
echo htmlspecialchars($s, ENT_QUOTES);
}
function j($s) {
echo json_encode($s, JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_QUOT|JSON_HEX_APOS);
}
function u($s) {
echo urlencode($s);
}
<a onclick="run(<?php j($rawstr); ?>); return false;">test</a>
Ve hatta daha iyi, komut bağlanarak tüm niteliklerini inline olay işleyicisi kullanmaktan kaçının:
<a id="test">test</a>
...
<script type="text/javascript">
document.getElementById('test').onclick= function() {
run(<?php j($rawstr); ?>);
return false;
};
</script>