0

だから私はJsとphpが初めてで、コールバック関数からコードを出力しようとしています

<!DOCTYPE html>
<html lang="en">
    <head>
        <script>
            function loadXMLDoc()
            {
                var xmlhttp;
                if (window.XMLHttpRequest){
                  xmlhttp=new XMLHttpRequest();
                }
                else{
                  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
                }
                xmlhttp.onreadystatechange=function(){
                    if (xmlhttp.readyState==4 && xmlhttp.status==200){
                        document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
                    }
                }

                xmlhttp.open("GET","callback_json.php",true);
                xmlhttp.send();
            }
        </script>

        <title>Simple Cross Domain Ajax</title>

      </head>
  <body>

      <h1>.....</h1>
      <h2>.....</h2>
      <button onclick="loadXMLDoc();">Get Data</button>
      <div id="myDiv"><h2>...</h2></div>

  </body>
</html>

私のphpファイルは次のようになります

<?php
    $ch = curl_init();
    $url='someurl';
    $timeout = 5;
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    $data = curl_exec($ch);
    curl_close($ch);
    echo "<script type='text/javascript' src='syntaxhighlighter/scripts/shCore.js'></script><script type='text/javascript' src='syntaxhighlighter/scripts/shBrushJava.js'></script><link href='syntaxhighlighter/styles/shCore.css' rel='stylesheet' type='text/css' /><link href='syntaxhighlighter/styles/shThemeDefault.css' rel='stylesheet' type='text/css' />";
    echo "<pre class='brush:java;'>";
    echo $data;
    echo "</pre>";
    echo '<script type="text/javascript">SyntaxHighlighter.highlight();</script>';
 ?>

そして、構文ハイライターは私のphpファイルでは機能するようですが、コールバック後では機能しません...私はいくつかの調査を行い、コードで all() の代わりに SyntaxHighlighter.highlight() を使用することになっていることを知っていますが、すでに行っていますそれ。コード構造に問題はありますか?

4

1 に答える 1

1

<script>innerHTML によって追加されたタグは、ブラウザーによって実行されません。それらを手動で実行する必要があります:

var scripts = document.getElementById("myDiv").getElementsByTagName("script");
if (scripts && scripts.length) {
  for (var i =0; i<scripts.length; i++) {
    eval(scripts[i].innerHTML);
  }
}

別の方法として、スクリプト ノードを評価する代わりに、ページに再度追加することもできます。

// ...
for (var i =0; i<scripts.length; i++) {
  var s = document.createElement('script');
  s.innerHTML = eval(scripts[i].innerHTML);
  document.body.appendChild(s);
}

しかし、これはとにかくコードを評価することとまったく同じです (いいえ、両方のメソッドがコードをチェックせずに実行することについてよく考えてください)。

より良い方法は、Syntaxhighlighter ファイルをページの上部に追加しSyntaxHighlighter.highlight()、コードを innerHTML 化した後に呼び出すことにより、スクリプト インジェクションを完全に回避することです。

于 2012-11-01T22:07:46.570 に答える