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>

最初にアラート show:Some Textを表示し、2 番目にウェブサイトのホスト プロパティを表示します。つまり、次のようになります。

<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 フラグを調べましたが、役立つものは見つかりませんでした。それでは、javascript メソッドを使用してみませんかeval()

このような:

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

これらのドキュメントを表示: eval()

これが最善の方法かどうかはわかりませんが、この投稿に触発されました。eval の代わりにこの関数を使用してみてください。

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

-ed 変数の値を返すか、失敗eval()した場合は文字列のみを返し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で文字列をエコーし​​ているので、この文字列を処理して引用符を単に削除することもできます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 定数は clientsite と php serverside です。コンストラントの内容を含む get パラメータを渡す ajax 呼び出しを使用してみることができますが、それはちょっとした回避策です。

于 2013-08-03T22:52:22.423 に答える