1

讲故事的时间

在 Play 的模板方案中,我有这个简化的设置:

@(param:String)    
<!DOCTYPE html>
<html>    <head><!-- JQuery & Bootstrap css+js includes --></head>    <body> 
    @param    
    <input type="text" data-provide="typeahead" data-source='@Html(param)' data-items="4">
</body>    </html>

@Html() 在此处和此处的底部都被提及,基本上可以防止类似<的字符被替换为&lt;. 我正在尝试通过 Play 的模板引擎将我从数据库中获取的Json.stringify-ed 和Json.toJson-ed传递List[String]到 HTML 中,然后让 Bootstrap 从data-source属性中自动获取它。

假设 @param 计算为一个 JSON 对象,该对象包含一个带有 的字符串'

<input data-provide="typeahead" data-source='["can't","hi","boom"]' data-items="4" type="text" >


我意识到需要在我的数据源 JSON 对象中转义单引号字符。起初我尝试使用\,甚至\\\无济于事。我什至开始为任务编写一个正则表达式替换器来模拟这里提到的 addSlashes()

然后一时兴起...

<input data-provide="typeahead" data-source='["can&#x27;t","hi", "boom"]' data-items="4" type="text" >

现在一切正常!(当数据源被硬编码时。仍然需要弄清楚如何取消 @Html() 以便它&#x27;不会消失。)


问题

为什么 Bootstrap Typeahead 需要读取未转义的单引号字符的数据源?





为后代:

val quoteRegex = """'""".r
quoteRegex.replaceAllIn(str, m => "&#x27;")
4

1 回答 1

1

单引号的问题在于它会截断您的数据源属性。html 解析器将读取您的 html 并为您提供类似的内容

<input data-provide="typeahead" data-source='["can' t","hi","boom"]' data-items="4" type="text" >

并且您的数据源属性的值为["can. 所以问题不在于预先输入。

当您对单引号进行编码时,它不再破坏属性,并且编码的引号被添加到未编码的 dom 中,因此您得到'&#x27;

于 2013-06-14T04:19:17.143 回答