2012-03-28 9 views
0

eval()を使用してJSONの一部であるJavaScript関数を実行したいのですが、間違いなく正確にどこに間違いがあるのか​​わかりません/ s。私はちょうどしようとするために、2つの非常に簡単なファイルを使用しています - 最初はindex.phpのであり、それはあるである:simpleformSubmi.phpeval()を使用してJSONでJavaScript関数を実行

<!DOCTYPE html> 
<html> 
<head> 
<title>Simple form sending and receiving a JSON object to/from PHP</title> 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> 

<script type="text/javascript"> 
$(document).ready(function(){ 
    var data = 
    { 
    "sales": [ 
     { "firstname" : "John", "lastname" : "Brown" }, 
     { "firstname" : "Marc", "lastname" : "Johnson" } 
    ] // end of sales array 
    } 
    var dataString = JSON.stringify(data); 

    $.post('simpleformSubmi.php', { data: dataString}, showResult, "text"); 
}); 

function showResult(res) 
{ 
    var data = eval('(' + res + ')'); 

    $("#fullresponse").html("Full response: " +data); 
} 
</script> 
<div id="fullresponse"></div> 
</head> 
<body> 

2つ目は、次のとおりです。

<?php 

$logFile = 'logFile'; 
$res = json_decode(stripslashes($_POST['data']), true); 
$arr = "function(){alert('Hi')}"; 
echo json_encode($res); 
echo json_encode($arr); 

だから何私はecho json_encode($ arr)を実行した後でした。取得し、警告する代わりに、私は間違いを取得し、Firebugのコンソールでエラーが表示されます "逃した")。ですから、問題は、このように有効なJS関数を送信し、それを正しく実行する方法です。

おかげ Leron

+2

* "JSONには' eval() '" *を使用したJSONでのJavaScript関数の実行* [JSONには関数がありません。まったく。](http://json.org)サーバレスポンスに関数を含める場合は、JSONではなくJavaScriptコードを返します。私はPHPの 'json_encode'がそれらを渡すとは思っていません。*それは*知らないのですか? –

+0

'echo json_encode($ res)'を削除/コメントアウトし、 'echo json_encode($ arr)'を 'echo $ arr'に変更した場合、どうなりますか? – Stefan

+0

フル・レスポンス:function(){alert( "Hi"); } - プレーンなHTMLとして表示されます。 – Leron

答えて

5

なぜあなたはjson_encode $ arrです。 JavaScript内のecho $arreval('(' + res + ')()')の文字列として返すことができます(JS内の()に関数が実行されています)。これを現在有効にするには、echo json_encode($res)を削除する必要があります。

+0

これは、コードが 'var data = eval("(function(){alert( 'Hi')}) ")"となるため、関数を実行しません。 'var data =(function(){alert( 'Hi')} {...})' – Esailija

+0

実際には動作します。ありがとうbadawym! – Leron

+0

Esailija:いいえ、コードは 'eval( '(function(){alert(' Hi ')})()')'になります。最後に '()'があることに注目してください。それはそれを[IIFE]にします(http://benalman.com/news/2010/11/immediately-invoked-function-expression/)。 – badawym

0

あなたがすることはできません。 JSONオブジェクトには関数のみを含めることはできません。

JavaScriptを実際に印刷する何らかの種類のWebサービスをセットアップする必要があります。このサービスは、<script src="/your/endpoint"></script>宣言クライアント側から呼び出すことができます。

0

データとしてjs関数を送信できます。

$data = array("something"=>"12345"); 
$js = "alert('hi!')"; 
$data["autoexec"] = $js;  
echo json_encode($data); 

次に、クライアント側でeval(data ["autoexec"])のような処理を行います。

関連する問題