-1

我希望有人能告诉我我做错了什么。我想用 xmlhttp 更新谷歌图表,我的脚本在这里:

<!--
You are free to copy and use this sample in accordance with the terms of the
Apache license (http://www.apache.org/licenses/LICENSE-2.0.html)
-->

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
    <title>
      Google Visualization API Sample
    </title>
    <div id="myDiv">
    <script type="text/javascript">
      function drawVisualization() {
        // Create and populate the data table.
        var data = google.visualization.arrayToDataTable([
          ['Year', 'Austria', 'Belgium', 'Czech Republic', 'Finland', 'France', 'Germany'],
          ['2003',  1336060,   3817614,       974066,       1104797,   6651824,  15727003],
          ['2004',  1538156,   3968305,       928875,       1151983,   5940129,  17356071],
          ['2005',  1576579,   4063225,       1063414,      1156441,   5714009,  16716049],
          ['2006',  1600652,   4604684,       940478,       1167979,   6190532,  18542843],
          ['2007',  1968113,   4013653,       1037079,      1207029,   6420270,  19564053],
          ['2008',  1901067,   6792087,       1037327,      1284795,   6240921,  19830493]
        ]);

        // Create and draw the visualization.
        new google.visualization.ColumnChart(document.getElementById('visualization')).
            draw(data,
                 {title:"Yearly Coffee Consumption by Country",
                  width:600, height:400,
                  hAxis: {title: "Year"}}
            );
      }




    google.setOnLoadCallback(drawVisualization);
    ;
    </script>
    </div>

    <script>
function loadXMLDoc()
{
var xmlhttp;
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
    }
  }
xmlhttp.open("GET","UpdateGraph.php",true);
xmlhttp.send();
}
</script>

  </head>
  <body style="font-family: Arial;border: 0 none;">
    <div id="visualization" style="width: 600px; height: 400px;"></div>



<button type="button" onclick="loadXMLDoc()">Change Content</button>


  </body>
</html>

下面是我想用来更新内容的 php 文件 (UpdateGraph.php),我的意图是显示第二个图表。它目前的工作方式是它带来了空间来显示另一个图形以及我创建的一个按钮,以防它不会自动“重绘”。当我从 UpdateGraph.php 文件中删除脚本标签时,我希望新图形出现的区域中只显示文本。

<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
  google.load('visualization', '1', {packages: ['corechart']});

</script>
<script type="text/javascript">
      function drawVisualization2() {
        // Create and populate the data table.
        var data = google.visualization.arrayToDataTable([
          ['Year', 'Austria', 'Belgium', 'Czech Republic', 'Finland', 'France', 'Germany'],
          ['2003',  1336060,   3817614,       974066,       1104797,   6651824,  15727003],
          ['2004',  1538156,   3968305,       928875,       1151983,   5940129,  17356071],
          ['2005',  1576579,   4063225,       1063414,      1156441,   5714009,  16716049],
          ['2006',  1600652,   4604684,       940478,       1167979,   6190532,  18542843],
          ['2007',  1968113,   4013653,       1037079,      1207029,   6420270,  19564053],
          ['2008',  1901067,   6792087,       1037327,      1284795,   6240921,  19830493]
        ]);

        // Create and draw the visualization.
        new google.visualization.ColumnChart(document.getElementById('visualization2')).
            draw(data,
                 {title:"Yearly Coffee Consumption by Country",
                  width:600, height:400,
                  hAxis: {title: "Year"}}
            );
      }
      google.setOnLoadCallback(drawVisualization2)
</script>
<button onclick="drawVisualization2()">Redraw 2nd Graph</button>
<div id="visualization2" style="width: 600px; height: 400px;"></div>

我在引入文本时没有问题,但我很困惑为什么我不能引入新的 javascript 或更新 javascript。(顺便说一句,UpdateGraph.php 中的代码在被复制并粘贴到当前包含“div id="myDiv" 的行时工作得很好)

谢谢你。

4

1 回答 1

0

在 innerHTML 分配中允许脚本标记将是一个安全威胁。假设您要下载的数据是用户在表单中提供的内容,并且该内容是由另一个用户加载的。用户 Bob 可以在表单中插入一个脚本标签,这将从服务器 X 加载恶意代码。用户 Charlie 加载具有指定内容的页面,并且该恶意代码运行。这是跨站点脚本的一种形式,您的浏览器在使用 innerHTML 赋值时可能会禁用它也就不足为奇了。但是,不能保证每个浏览器都会这样做。

这里有更多信息:https ://developer.mozilla.org/en-US/docs/DOM/element.innerHTML#Security_consideration

也就是说,有两种更简单的方法可以做你想做的事情。我推荐第一个作为最好的方法:

1) 将大部分脚本(而不是更新详细信息)移动到与页面一起加载但不一定运行的函数中。无需通过 xmlhttp 检索整个脚本文本,只需以某种易于解析的格式(例如 JSON)返回数据本身,然后将该数据作为参数传递给对更新函数的调用

2)如果你绝对需要传递函数调用,那么你甚至不需要xmlhttp。只需在 DOM 中动态创建一个脚本标记,并将其源指向生成脚本的 PHP 页面。添加脚本标签后,将立即加载脚本。

于 2012-12-26T05:40:24.530 回答