当输出应为HTML时,在javascript函数内部使用blade

当输出应为HTML时,在javascript函数内部使用blade,javascript,laravel,Javascript,Laravel,我遇到的问题是javascript函数中的转义html,从blade传递$消息包含基本html或带引号的字符串,因此如果我使用{!!!!},它将不起作用,因为从blade到函数的输出似乎需要带引号 内部javascript脚本标记 @foreach ($messages as $message) addMessages('{{$message['message']}}', '{{$message['message_side']}}'); @endforeach

我遇到的问题是javascript函数中的转义html,从blade传递$消息包含基本html或带引号的字符串,因此如果我使用{!!!!},它将不起作用,因为从blade到函数的输出似乎需要带引号

内部javascript脚本标记

@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代码并将其附加到问题中吗?根据
{…}
的makes
htmlspecialchars()
调用,因此每个引用都应该转换为
&aposit'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,它非常棒。你不再需要手动包装值了,是吗?嗯,双引号的好处很好。链接中的斜线如下所示/\