用xmlhttp更新javascript

时间:2012-12-26 03:19:32

标签: javascript ajax google-visualization xmlhttprequest

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

<!--
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),我的意图是会出现第二个图表。它目前的工作方式是它带来空间来显示另一个图形以及我创建的按钮,以防它不会重绘&#34;自动。当我从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中的代码在复制并粘贴到当前包含的行中时效果很好&#34; div id =&#34; myDiv&#34;)

谢谢。

1 个答案:

答案 0 :(得分: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页面。添加脚本标记后,将立即加载脚本。