2017-04-19 4 views
0

PHPでオブジェクトを作成し、json_encode()を実行した後にjQueryによって使用されるオブジェクトを作成するPHPスクリプトがあります。私は、json_encodeを実行した後、jQueryスクリプトで動作するPHPオブジェクトにjQuery傾斜関数を含めるようにしていますが、正しく取得できません。例えばPHPオブジェクト内のインラインjQuery関数をjson_encodeを使用してjQueryに指定

、PHP:

function get_columns_object() { 

    foreach(...) { 
     $columns[ $table ][] = array(
      'data'   => $name === 'cb' ? null : $name, 
      'title'   => $header[ 'title' ], 
      'callback'  =>  <<== HOW TO SPECIFY INLINE FN HERE? 
     ); 
    } 
} 

次に、ページのHTMLを出力するPHPスクリプトに私は、次のとおりです。

<script async> 
    var columns = <?php echo json_encode(get_columns_object()); ?>; 
</script> 

これは、変数のために正常に動作しますが、どのように私は含めることができますjQueryコールバック関数とこのアプローチを使用するインラインjQuery関数または私はできますか? :に際して

PHP

function get_columns_object() { 
    foreach(...) { 
    $columns[ $table ][] = array(
     'data'  => $name === 'cb' ? null : $name, 
     'title' => $header[ 'title' ], 
     'callback' => "function() { alert('Callback Event'); }" 
    ); 
    } 
} 

はJavaScript

var columns = JSON.parse(<?php echo json_encode(get_columns_object()); ?>); 

:S

+0

参照:http://stackoverflow.com/questions/1745248/php-json-encode-and-javascript-functions "JSONでは不可能"と表示され、http://web.archive.org/webにリンクします。 /20080828165256/http://solutoire.com/2008/06/12/sending-javascript-functions-over-json/ – Twisty

+0

'json_encode()'は 'function'を理解できませんので、関数コードを保存して書き直してくださいそれはあなたがJavaScriptを作成するとき。 – Twisty

+0

@twistyしたがって、インライン関数 'string'がエンコードされないようにするという全体的な修正はありますか?多分私は過度に単純化しています。その2番目の記事は優れています。ありがとうございました。 – rwkiii

答えて

1

は、私のコメントを拡張し、また、現代の技術を見て、あなたはこのような何かを行うことができますさらなる研究、私は見つけた:jQuery execute string as function

これも機能する可能性があります。

<?php 
$columns = array(
    "table1" => array(
     "data" => "MyName", 
     "title" => "Name", 
     "callback" => "function(){ alert('Callback Event'); }" 
    ) 
); 

$json_data = json_encode($columns); 
?> 
<html> 
    <head> 
     <title>Test Passing Function</title> 
     <script src="https://code.jquery.com/jquery-3.1.1.js"></script> 
     <script> 
      var columns = <?php echo $json_data; ?>; 
      columns.table1.callback = eval(columns.table1.callback); 
      console.log(columns); 
      $(function(){ 
       var link = $("<a>", { 
        href: "#" 
       }).html("Click Me"); 
       link.click(columns.callback); 
       link.appendTo($("#sandbox")); 
      }); 
     </script> 
    </head> 
    <body> 
     <p>Test Passing:</p> 
     <pre><?php echo $json_data; ?></pre> 
     <div id="sandbox"> 
     </div> 
    </body> 
</html> 

はphpfiddle.orgでテストしていたが、彼らはeval()を見て、それを殺します。

アップデートは

は、ここにテストすることができました:Passing a JavaScript function from JSON encoded PHP

またRicardo Enrique Ibarra Cabreraが言及したことを記事を読んで:https://jsfiddle.net/Twisty/z0xpqorz/2/

var columns = <?php echo json_encode(get_columns_object()); ?>; 
$(function() { 
    var link = $("<a>", { 
    href: "#" 
    }).html("Click Me"); 
    link.click(eval('(' + columns.table1.callback + ')')); 
    link.appendTo($("#sandbox")); 
}); 

は、より参照してください。良い提案。これらの投稿は、正当な理由でeval()をすべて犠牲にすることを避けることを提案しています。

+0

'new Function'を使った別のメソッド:https:// jsfiddle。net/Twisty/z0xpqorz/3/ – Twisty

+0

明白なセキュリティリスクがあるため、私はこのアプリケーションでeval()を使用することができません。あなたはjsfiddleがうまくいっています。私は 'new function()の使い方がうまくいかないことを知ることができません。そのアプローチは簡単なコールバックで動作しますか?インライン関数を指定する代わりに、関数名だけが指定されましたか?明らかに、jQueryの問題は、技術的にはインライン関数が引用符で囲まれていることになります。そうでなければ、json文字列は正しいでしょう。 – rwkiii

+0

@rwkiii more info https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function – Twisty

関連する問題