1

我来了这样的代码:

<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 常量?

你的想法是什么?

4

4 回答 4

1

我在 json_encode 的 PHP 标志中四处寻找,但找不到任何有用的东西。那么为什么不尝试使用 javascripteval()方法。

像这样:

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

查看这些文档:eval()

我不知道这是否是最好的方法,但我受到这篇文章的启发。尝试使用此函数而不是 eval:

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

如果失败,它将返回eval()-ed 变量值或仅返回字符串。eval()

于 2013-08-03T22:59:15.613 回答
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);

在对象构造之后复制属性的另一种方法可能是设置一个模式,其中所有构造函数都接受一个对象,从中只使用相关属性。

于 2013-08-03T23:00:34.353 回答
0

我也在想别的办法。我不认为这是一种非常“干净”的方式,但由于您在 php 中回显一个字符串,您也可以处理这个字符串并简单地删除引号,例如使用一些 regex 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);

只是一个想法

于 2013-08-03T23:27:46.310 回答
-1

javascript constrant 是客户端和php 服务器端。您可以尝试使用 ajax 调用来传递带有您的常量内容的 get 参数,但这是一种解决方法。

于 2013-08-03T22:52:22.423 回答