当前位置: 首页 > 面试题库 >

为什么要在渲染局部之前进行scape_javascript?

郎子平
2023-03-14
问题内容

我正在看这个Railscast插曲,想知道为什么escape_javascript需要在这里致电:

$("#reviews").append("<%= escape_javascript(render(:partial => @review)) %>");

有什么escape_javascript用?

根据Rails的文档:

escape_javascript(javascript)

转义符返回以及JavaScript段的单引号和双引号。

但这对我来说意义不大。


问题答案:

如果将代码分为两部分,则更容易理解。

第一部分$("#reviews").append("<%= ... %>");是带有erb的javascript。这意味着,<%= ... %>它将被内部返回的任何红宝石代码替换。替换的结果必须是有效的javascript,否则客户端尝试对其进行处理时将抛出错误。这就是第一件事:您需要有效的javascript。

要考虑的另一件事是,ruby生成的任何内容都必须包含在带有双引号的javascript字符串内-注意周围的双引号<%= ... %>。这意味着生成的javascript将如下所示:

$("#reviews").append("...");

现在,让我们检查中的红宝石部分<%= ... %>。怎么render(:partial => @review)办?它正在呈现部分内容-这意味着它可以呈现任何类型的代码-html,css …甚至更多的javascript!

那么,如果我们的partial包含一些简单的html(如此),会发生什么呢?

<a href="/mycontroller/myaction">Action!</a> 

还记得您的JavaScript将双引号字符串作为参数吗?如果我们简单地用<%= … %>那个部分的代码替换,那么我们就会有一个问题-在href=双引号之后马上!javascript将无效:

// Without escaping, you get a broken javascript string at href
$("#reviews").append("<a href="/mycontroller/myaction">Action!</a>");

为了避免这种情况的发生,您希望转义这些特殊字符,以便不对字符串进行剪切-您需要生成此字符的东西:

<a href=\"/mycontroller/myaction\">Action!</a>

这是escape_javascript做什么的。它确保返回的字符串不会“破坏” javascript。如果使用它,将获得所需的输出:

$("#reviews").append("<a href=\"/mycontroller/myaction\">Action!</a>")

问候!



 类似资料:
  • 通过Three.js发开Web3D应用的时候,渲染窗口可能是全屏效果占满web页面整个body区域,也可能是web页面上一个特定位置特定区域,比如渲染区域是一个特定位置、特定宽高的div元素所在区域。 全屏渲染 直接通过Three.js的WebGL渲染器WebGLRenderer的.setSize()方法设置渲染尺寸为浏览器body区域宽高度。 var width = window.innerWi

  • 问题内容: 我刚刚学会了最近的反应,打算将其用于下一个项目。我已经遇到过几次反应服务器端渲染,但是想知道为什么在“现代时代”我们仍然需要它。 在本文中,它认为通过服务器端渲染,用户不必等待从CDN或其他地方加载这些js即可看到初始静态页面,并且该页面将在js到达时恢复功能。 但是在使用webpack生产配置和gzip构建之后,整个捆绑包(包括react,我的代码和许多其他东西)仅占用40kb,而我

  • 问题内容: 在许多Java源代码中(例如),我看到了类似的东西; 我了解基本模式(锁定,最终解锁),但是我的问题是, 为什么在使用它之前先对本地作用域的Lock变量进行赋值? 为什么这样做而不是以下内容? 它会影响优化吗?第一个示例可以防止锁变粗吗? 评论后编辑 :如果您真的不知道为什么会出现这种情况,请不要添加答案。这是从Java来源获得的,@author标记是Doug Lea,所以我很确定它的

  • 我正在将一个项目从(运行在JBoss 4.2.3上的JSF 1.2,Richfaces 3.3.4)迁移到(运行在Wildfly 8.1.0上的JSF2.2,Richface 4.5)。在部分迁移了一些视图之后,我发现使用JSF2的应用程序的性能很差。 当发送ajax请求时,我注意到这个问题,JSF 2正在渲染整个视图,尽管渲染属性指向一个outputText 示例(可从此处下载) 在我的示例中,

  • 我有一个带有对象数组的组件,其中我正在根据字符串进行过滤。问题是当我尝试将此过滤器的返回设置为本地状态时,它会抛出错误,我不太理解原因。 所以,因为我希望这个数组处于我的状态,所以我决定这样做: 插入这一行后发生的事情是这样的: 它开始多次渲染。我假设,每次状态改变时,它都会重新渲染组件(如果我错了,请纠正我)。不过,我不知道它为什么要多次这样做。 因此,我想过使用 useEffect 来实现此处

  • 本文向大家介绍什么渲染劫持?相关面试题,主要包含被问及什么渲染劫持?时的应答技巧和注意事项,需要的朋友参考一下 我的理解: 什么是渲染劫持?来分析一下这个词汇。渲染主要指的是组件中的render函数return的JSX语法部分。劫持呢?如果我们在组件内部去修改JSX语法,这不叫劫持,这是分内的事情。劫持指的是在本不应该修改到JSX语法的地方修改了它。怎么实现呢?一般都是通过继承被劫持的组件。 HO