2013-08-03 24 views
1

我來代碼是這樣的:json_encode和javascript常數

<script> 
CONT_TEXT = 'Some Text' 

var jsobj = <?php json_encode(array(
    'prop1' => 'something', 
    'prop2' => 'CONT_TEXT', 
    'prop3' => 'location.host', 
)) ; ?>; 


alert(jsobj.prop2); 
alert(jsobj.prop3); 
</script> 

輸出爲:

<script> 
CONT_TEXT = 'Some Text' 

var jsobj = {"prop1":"something","prop2":"CONT_TEXT","prop3":"location.host"}; 


alert(jsobj.prop2); 
alert(jsobj.prop3); 
</script> 

我想第一個警報顯示:Some Text和第二場演出的網站主機屬性。這意味着:

<script> 
CONT_TEXT = 'Some Text' 

var jsobj = {"prop1":"something","prop2":CONT_TEXT,"prop3":location.host}; 


alert(jsobj.prop2); 
alert(jsobj.prop3); 
</script> 

"是我的問題!

我該如何在PHP中通過json_encode傳遞javascript約束?

你的想法是什麼?

+0

你嘗試只顯示prop3? –

+0

JSON只能包含數據。您不能在JSON編碼數據中引用外部變量。您可以將該信息(即對變量的引用)編碼爲(例如)字符串,然後在客戶端對其進行解碼。但是你必須爲此創建自己的邏輯。你如何編碼信息取決於你,沒有最佳做法。 –

回答

-1

javascript constrant是clientsite和php的服務器端。您可以嘗試使用傳遞get參數的ajax調用與您的constrant的內容,但這是一種解決方法。

+0

PHP(服務器端)不需要知道javascript constrant的值。只需回聲'var jsobj = {「prop1」:「something」,「prop2」:CONT_TEXT,「prop3」:location.host};'。 JS自己做工作。 – EmRa228

1

我環顧了json_encode的PHP標誌,但找不到任何有用的東西。那麼,爲什麼你不嘗試使用javascript eval() metode。

這樣的:

alert(eval(jsobj.prop2)); 
alert(eval(jsobj.prop3)); 

查看這些文檔:eval()

我不知道這是不是最好的方式,但我得到這個post啓發。嘗試,而不是使用eval的這一功能:

function safe_eval(prop) 
{ 
    try { 
     return eval(prop); 
    } catch (e) { 
     return prop; 
    } 
} 

它要麼返回eval() -ed變量值或僅在大小寫eval()失敗的字符串。

+0

道具是如此之多,我不知道哪些必須通過eval函數。但+1是因爲這是一個解決方案。 – EmRa228

+0

I c。也許像svidgen一樣添加meta_data,或者像這樣將php數組分段爲2:'$ prop_array = array(「js_variables」=> array(...),「plain_text」=> array(...))'然後處理價值在前端分開。 – Leo

1

沒有「自然」的解決方案。但是,沒有什麼能夠阻止你創建各種「協議」。您可以使用具有特定鍵的內部對象來根據需要替換爲常量值。

{"a":"text", "b":{"_ref":"CONST"}} 

或者給每個物體的類型:

{ 
    "__type": "SomeClass", 
    "propertyA": "valueA", 
    "propertyB": { 
    "__type": "Reference", 
    "value": "CONST" 
    } 
} 

並據此實例化它們。東西此[完全未經測試的代碼]:

function instantiate(o, classRepository) { 
    var rv; 
    var classes = classRepository || window; 

    if (o.__type && classes[o.__type] && typeof(classes[o.__type]) == 'function') { 
    rv = new classes[o.__type](); 
    } else { 
    rv = {}; 
    } 

    // instantiate all potentially instantiable child objects 
    for (var i in o) { 
    if (typeof(o[i]) == 'object') { 
     rv[i] = instantiate(o[i]); 
    } else { 
     rv[i] = o[i]; 
    } 
    } 

    return rv; 
} 

var typedObject = instantiate(untypedObject); 

到對象施工後複製特性上可能是其中所有構造接受從中僅消耗相關屬性的對象設置的圖案的另一種。

+0

如果給我一個小提琴或完整的功能來做到這一點,我點擊這個答案作爲「接受答案」。 – EmRa228

+0

@ EmRa228:難道你不明白答案或你的問題?我們幫助您找到解決方案,但我們不會爲您編碼*全部*。你必須自己做一點。或者付錢給你做。 –

+0

@FelixKling我沒有理解這個答案,並且有一個例子,也許我找到了它! – EmRa228

0

我也在想另一種方式。我不認爲這是一種非常「乾淨」的方式,但由於您在PHP中回顯了一個字符串,您還可以處理該字符串,並簡單地刪除引號,例如與一些正則表達式preg_replace

$json_string = json_encode(array(
    'prop1' => 'something', 
    'prop2' => 'CONT_TEXT', 
    'prop3' => 'location.host', 
)) ; 

echo preg_replace('/("prop2":|"prop3":)"([a-zA-Z_\.]+)"/', '$1$2', $json_string); 

只是一個想法

+1

這可能適用於這種情況,但不是當您真的需要解析JSON時。 –