2009-12-16 61 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); 
 
相關問題