Magento JavaScript转义字符串

6
有没有一个辅助函数可以正确地转义字符串,以便作为单引号引用的JavaScript字符串文字呈现?
我知道jsQuoteEscape,但它只处理引号,不处理\n和\r等。
所以如果我的字符串是'line1\nlineb'(即两行之间有一个换行符)
并且我使用

var jsvar='<?php echo $this->helper('myextension')->jsQuoteEscape($mystring); ?>';

我将翻译以下内容:

我会得到渲染后的内容

    var jsvar='line1
line2';

这是一种语法错误。

谢谢, Eyal

1个回答

5

是的

$string = 'Hello
There';                     
var_dump( Mage::helper('core')->jsonEncode($string) );
var_dump( json_encode($string) );

我一直不确定将非对象字符串数据类型编码为JavaScript字符串是JSON编码的副作用,还是根据[Crockford] JSON来说是真的,因此在传递它们时,我总是喜欢将我的字符串包装在对象中。

$o = new stdClass();
$o->param = 'This is my 
Param';         
$json = json_encode($o);            
echo 'var data = ' . $json . ';' . "\n";
echo 'var jsdata = data.param';

这是如何使用JavaScript处理它的方法。没有专门为此构建的方法。如果您想查看块中可用的辅助方法,请查看方法。
app/code/core/Mage/Core/Block/Abstract.php        
app/code/core/Mage/Core/Block/Template.php        

如果您正在处理的模板是上级块的一部分,请获取其类,然后检查其定义。
var_dump get_class($this);

虽然我在你的问题中回答过,字符串似乎不符合json的要求,但我感觉这有点过了(至少在javascript方面的开销上)。如果你担心使用非对象调用json_encode,我个人更喜欢将字符串作为数组中的单个成员传递,然后从结果中修剪掉第一个[及其之前的任何内容以及最后一个]及其之后的任何内容。这将产生完全符合您要求且没有多余内容的JS代码。实际上,我怀疑如此广泛使用的东西是否会被打破。 - epeleg
话虽如此,你会选择 Mage::helper('core')->jsonEncode($string) 还是 json_encode($string) ? 我倾向于选择第二个,因为它更简短,看起来开销更小,所以性能会更好。(我假设第二个只是 PHP 的一部分?还是不是?) - epeleg
1
你可能是对的,尽管每次我对自己说“我只是写一个简单的字符串替换,肯定不会有意外情况”,但最终我总是被边缘情况所困扰。因此,我已经养成了通过上述方式将任何动态JS变量传递为JSON的习惯。 - Alana Storm
@epeleg 是的,第二个是原生的PHP函数。第一个是Zend_Json中包装器的JSON编码方法,最终仍然会调用json_encode。这是如果json_encode存在的情况。如果没有(PHP <5.2或奇怪的自定义php安装),Zend编码使用用原生PHP编写的自定义解析器。我会使用辅助方法,但现在我更关心抽象化而不是原始的PHP性能。 - Alana Storm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接