当输出应为HTML时,在javascript函数内部使用blade
我遇到的问题是javascript函数中的转义html,从blade传递$消息包含基本html或带引号的字符串,因此如果我使用{!!!!},它将不起作用,因为从blade到函数的输出似乎需要带引号 内部javascript脚本标记当输出应为HTML时,在javascript函数内部使用blade,javascript,laravel,Javascript,Laravel,我遇到的问题是javascript函数中的转义html,从blade传递$消息包含基本html或带引号的字符串,因此如果我使用{!!!!},它将不起作用,因为从blade到函数的输出似乎需要带引号 内部javascript脚本标记 @foreach ($messages as $message) addMessages('{{$message['message']}}', '{{$message['message_side']}}'); @endforeach
@foreach ($messages as $message)
addMessages('{{$message['message']}}', '{{$message['message_side']}}');
@endforeach
添加消息javascript函数
addMessages = function (text, message_side) {
var $messages, message;
if (text.trim() === '') {
return;
}
$('.message_input').val('');
$messages = $('.messages');
message = new Message({
text: text,
message_side: message_side
});
message.draw();
return $messages.animate({ scrollTop: $messages.prop('scrollHeight') }, 300);
};
因此,我认为问题在于双重转义:第一个数据由Blade通过调用
htmlspecialchars()
(根据)转义,然后在JS代码的某个地方转义(可能不会直接转义,而是通过createTextNode(message)
或innerText=message
)作为文本进行威胁)
所以你需要关掉其中一个逃生电话
正如您提到的,您可以使用{!!}
在刀片端输出原始文本。是的,这仍然需要用引号(单引号或双引号)包装才能成为有效的JS代码。但您应该注意文本中的相同类型引号(单引号或双引号),以忽略此类情况:
addMessage('It's me. I'm broken')
为了实现这一点,您可以使用斜杠手动转义适当的引号,以获得如下结果
addMessage('It\'s me. I\'m broken')
[UPD]正如@Ian Fain提到的,可以在{!!}
因此,最终,这种转义可以在没有任何自定义指令的情况下轻松完成
@foreach ($messages as $message)
addMessages({!! json_encode($message['message']) !!}, {!! json_encode($message['message_side']) !!})
@endforeach
同时提及
json\u encode
添加了额外的双引号,这样就不需要再直接插入它们了。您能检查一下输出的JS代码并将其附加到问题中吗?根据{…}
的makeshtmlspecialchars()
调用,因此每个引用都应该转换为&apos所以他们永远不会用这种方式破坏JS代码。它正在转换为转义html。输出JS代码如下:addMessages('您好,感谢加入,我们需要您的全名和送货地址…','左');问题是我需要这些单引号来让函数工作。所以。。。它不适合你,对吗?但是为什么呢?或者你的意思是,你不需要这样的转义,因为JS将按字面意思呈现它(比如it's
)?不起作用。它不起作用,因为在我看来,它在文本中显示为html,但当我在消息中有类似的内容时,它会直接输出,而不是渲染图像。使用应用程序live时,使用相同的javascript函数,它会渲染图像。这是一个聊天窗口,我在这里做的是从数据库中获取以前的消息并将它们输出到视图。当使用应用程序live时,如果消息包含html,它会很好地工作,并呈现它。问题是我在一个函数中用单引号转义了html,我刚刚意识到这根本不是最好的方法。我想您不仅需要在页面加载时检索消息,还需要在以后检索消息(以异步方式-JS向服务器请求其他消息)。到目前为止,最简单的方法不是用PHP编写JS代码,而是将静态JS调用放入页面的代码中:retrieveInitialMessages()。然后(/*…通过addMessages()调用插入消息…*/)
感谢您的帮助。这似乎奏效了。addMessages(“{!!str\u replace(“'”、“\'”、$message['message'])!!}’、“{{$message['message\u side']}}”);我懂了。不知道里面允许使用php函数。如果可用,最好使用json\u encode
。它将正确处理嵌套斜杠/转义。json_encode()不起作用。它将输出放在双引号中,不替换单引号,并且会弄乱http链接中的斜杠。是否要传递特定的参数?是的,有一个options
参数。链接有什么问题?至于双qoutes,它非常棒。你不再需要手动包装值了,是吗?嗯,双引号的好处很好。链接中的斜线如下所示/\