2013-08-03 20 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时。 –