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 文件,但在回调后不起作用......我做了一些研究,我知道我应该在代码中使用 SyntaxHighlighter.highlight() 而不是 all() 但我已经完成了那。我的代码结构有问题吗?

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 回答