【问题标题】:rails to_json always with double quote, how can i delete them?rails to_json 总是带有双引号,我该如何删除它们?
【发布时间】:2010-12-28 02:47:42
【问题描述】:

说我有一个像这样的哈希 {"onDoubleClick"=>"function(e){alert(e.message);}"} 当我在客户端获取 json 时,如何获取函数而不是字符串。

像这样:

{"onDoubleClick":function(e){alert(e.message);}}

我尝试将 # 放在开头但不起作用。{"onDoubleClick"=>"#function(e){alert(e.message);}"}

有人遇到过这个问题吗? 谢谢

【问题讨论】:

  • {"onDoubleClick":function(e){alert(e.message);}} 不是有效的 JSON,因此序列化为 JSON 是错误的做法。看起来你想序列化为 JavaScript。
  • JSON 是一种数据传输格式,如果你想要 JavaScript,就使用 JavaScript。如果删除引号,则不会生成 JSON。您几乎可以肯定应该进行认真的重构,以便将函数存储在静态 JavaScript 文件中并在加载时包含在页面中 - 然后将纯数据传递给客户端,并使用该数据来决定调用哪个函数。跨度>
  • 感谢大卫,这很合理。

标签: javascript ruby-on-rails json function


【解决方案1】:

如果可能,您应该将其作为文本函数从服务器输出,而不是字符串。这将为您节省解析为字符串,然后在客户端上保存 eval()。

如果不能输出字面量函数,可以调用 eval() 把它变成一个函数。如果名为 o 的变量存储了 JSON 的结果,则可以运行:

o["onDoubleClick"] = eval(o["onDoubleClick"]);

将字符串评估为一个函数并将其存储回同一个变量中。

【讨论】:

  • 好吧,它似乎没有我想要的那么优雅。我认为这将是消除引号的方法 to_json 的一个选项。
  • IE 6,当字符串主体是函数定义时,eval 会做奇怪的事情。它将为此返回undefined。一种解决方法是改为eval('0,' + o.onDoubleClick)。这使得顶级表达式成为 IE 正确处理的逗号表达式。
  • 我这样做是因为我在服务器上使用 jqgrid,并且我将连接 "onDoubleClick:function()...." 而不仅仅是 to_json ,json 问题 eval 问题将没事。我说的对吗?
【解决方案2】:

为了解决这个问题,我创建了一个对象来保存“未引用”的 Javascript 项(例如函数输出),然后将“to_javascript”添加到 Hash 中,该对象使用未引用版本的对象使其可用。

例如,这对我有用: 选项[:控件] = { :bold => {:visible => true}, :italic => {:visible => true}, :underline => {:visible => true}, :insertUnorderedList => {:visible => true}, :lol => { :可见=>真, :exec => JavascriptUnquoted.new("function() { $('##{html_id}').wysiwyg('insertImage', '/images/lol_emoticon.jpg'); }") }

options.to_javascript ==> { "controls":{"italic":{"visible":true},"underline":{"visible":true},"insertUnorderedList":{"visible":true} ,"lol":{"visible":true,"exec":function() { $('#review_text').wysiwyg('insertImage', '/images/lol_emoticon.jpg'); } } }

https://gist.github.com/771749

【讨论】:

  • 谢谢。最后我使用了自定义的 to_json 方法,我在字符串中添加了一些特殊字符,例如“--#function(){....}#--”,并转义了/“--#人员。
  • 在我花更多时间阅读有关 jQuery 并盯着我的代码之后,我意识到在大多数情况下,使用服务器端初始化的自定义 Javascript 文件或 jQuery 扩展是一种更好的模式价值观。您仍然可以使用上述方法进行初始化,但有时您正在用 Ruby 编写 Javascript,感觉效率非常低。
【解决方案3】:

尝试使用 eval():

var key = "OnDoubleClick";
var value = "function(e){alert(e.message);}";
eval("var " + key + "=" + value);

【讨论】:

  • 没有必要eval引入变量,这将不兼容ES5严格模式,所以如果你必须eval,我会改用Zach的方法。
猜你喜欢
  • 1970-01-01
  • 2017-06-13
  • 2016-03-05
  • 2021-06-30
  • 2012-12-27
  • 1970-01-01
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多