2009-12-16 60 views
1

假设我有很多Javascript页面。在这个时候,通过简单地使用一些Print/Echo语句来初始化JavaScript值,非常容易初始化变量。将许多服务器端信息传递给JavaScript的最佳做法是什么?

Example: var x = <?php echo('This is a value');?> 

我首先想到的是我可以通过功能参数传递的所有变量的值,但它是不可能的,因为我们有很多的值(我们有一个多语种网站和所有的文字都是从服务器(BD))。

Example : initializeValues(<?php echo('Value1,Value2,Value3,Value...');?>);//JS Method that can be external of the page 

更多的问题来了,当我们想从页起飞所有的JavaScript对外部 JavaScript文件移动的一切。什么是初始化所有这些变量的好方法?如果我通过使用文档的OnLoad绑定JavaScript方法,我将无法使用Print/Echo方法来填充所有值。

任何好的模式来解决这个任务?

+0

您能告诉更多的有关变量的内容?他们只是翻译标签吗?他们在请求之间改变吗?或者它们大多是静态的? – Gordon 2009-12-16 19:45:34

回答

7

一个非常流行的模式是使用JSON格式。有库可以生成它,而Javascript直接使用它。

+0

JSON的+1。它简单,简洁,易于阅读,并且具有几乎所有语言的库。 – 2009-12-16 18:55:52

-1

最佳实践的例子吗?将值从服务器传递到客户端js对于单一的最佳实践来说太动荡了。

假设你使用Smarty。然后,最好的做法是:

<script type="text/javascript"> 
var limit = Number("{$limit}"); 
var msg = "{$msg}"; 

{literal} 
// code using the variables 
{/literal} 
</script> 

,但我也可以认为这是一个非常明智的做法:

function to_js_vars(arrray $jsvars) 
{ 
    foreach ($jsvars as $name => $info) { 
     printf(
      "var %s = %s("%s");\n" 
      , $name 
      , $info['type'] 
      , $info['val'] 
     ); 
    } 
} 

其中$info['type']Number之一,Boolean''(空字符串)对于其他事情

0
var x = <?php echo('This is a value');?> 

呃,不,最终会这样:

var x = This is a value 

(语法错误)你想:

var x = <?php echo json_encode('This is a value', JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_QUOT);?> 

的HEX_TAG在PHP 5.3逃逸避免与出现在<script></序列问题。需要使用AMP和QUOT编码,以确保在将代码置于由"或非CDATA XHTML脚本块分隔的属性值中时,"&字符没有问题。如果您只使用HTML脚本块(或XHTML CDATA脚本块),您可以不使用它们(尽管它们也不会造成任何伤害)。

json_encode也将愉快地编码一个值的数组放入一个JS变量,而不仅仅是一个字符串。

More problem come when we want to take off all JavaScript from pages to move everything on external JavaScript file. 

将所有静态代码(包括绑定到事件侦听器的代码)放到外部JavaScript文件中是一个好主意。但是,每页数据仍应保留在页面上,或者放置在文档本身的适当属性中(例如不引人注意的脚本的类名),或者放在简单的<script type="text/javascript">var data= ...;</script>块中,而不包含其他代码。

1

这里是我如何做到这一点:

 

<?php 

$foo = array('bar' => 'gork'); 

?> 
<input id='foo' type='hidden' value='<?= json_encode($foo); ?>' /> 
 

然后客户端(我使用的原型):

 

var foo = $F('foo').jsonParse(); 
alert(foo.bar); 
 
相关问题