【问题标题】:Getting error "Cannot read property 'documentElement' of null" in PHP/XML/JavaScript communication在 PHP/XML/JavaScript 通信中出现错误“无法读取 null 的属性‘documentElement’”
【发布时间】:2016-10-18 01:36:36
【问题描述】:

所以我正在尝试按照此处找到的教程进行操作:https://developers.google.com/maps/articles/phpsqlajax_v3

目前我已经正确设置了数据库通信,并且具有所需结果的 XML 由另一个文件 phpsqlajax_genxml2.php 生成。

但是,当它与 Google Map API 集成时,控制台会在读取“var markers = xml.documentElement.getElementsByTagName("marker");”的行记录错误“Cannot read property 'documentElement' of null”,这是在 downloadUrl 函数调用下。

这是 index.html 的 JS 部分的 sn-p:

var customIcons = {
      restaurant: {
        icon: 'http://labs.google.com/ridefinder/images/mm_20_blue.png'
      },
      bar: {
        icon: 'http://labs.google.com/ridefinder/images/mm_20_red.png'
      }
    };

    function load() {
      var map = new google.maps.Map(document.getElementById("map"), {
        center: new google.maps.LatLng(47.6145, -122.3418),
        zoom: 13,
        mapTypeId: 'roadmap'
      });
      var infoWindow = new google.maps.InfoWindow;

      // Change this depending on the name of your PHP file
      downloadUrl("phpsqlajax_genxml2.php", function(data) {
        var xml = data.responseXML;
        var markers = xml.documentElement.getElementsByTagName("marker");
        for (var i = 0; i < markers.length; i++) {
          var name = markers[i].getAttribute("name");
          var address = markers[i].getAttribute("address");
          var type = markers[i].getAttribute("type");
          var point = new google.maps.LatLng(
              parseFloat(markers[i].getAttribute("lat")),
              parseFloat(markers[i].getAttribute("lng")));
          var html = "<b>" + name + "</b> <br/>" + address;
          var icon = customIcons[type] || {};
          var marker = new google.maps.Marker({
            map: map,
            position: point,
            icon: icon.icon
          });
          bindInfoWindow(marker, map, infoWindow, html);
        }
      });
    }

    function bindInfoWindow(marker, map, infoWindow, html) {
      google.maps.event.addListener(marker, 'click', function() {
        infoWindow.setContent(html);
        infoWindow.open(map, marker);
      });
    }

    function downloadUrl(url, callback) {
      var request = window.ActiveXObject ?
          new ActiveXObject('Microsoft.XMLHTTP') :
          new XMLHttpRequest;

      request.onreadystatechange = function() {
        if (request.readyState == 4) {
          request.onreadystatechange = doNothing;
          callback(request, request.status);
        }
      };

      request.open('GET', url, true);
      request.send(null);
    }

如果有帮助,这里是 phpsqlajax_genxml2.php 文件:

<?php
require("phpsqlajax_dbinfo.php");

function parseToXML($htmlStr)
{
$xmlStr=str_replace('<','&lt;',$htmlStr);
$xmlStr=str_replace('>','&gt;',$xmlStr);
$xmlStr=str_replace('"','&quot;',$xmlStr);
$xmlStr=str_replace("'",'&#39;',$xmlStr);
$xmlStr=str_replace("&",'&amp;',$xmlStr);
return $xmlStr;
}

// Opens a connection to a MySQL server
$connection=mysql_connect ('creeptrekcom.domaincommysql.com', $username, $password);
if (!$connection) {
  die('Not connected : ' . mysql_error());
}

// Set the active MySQL database
$db_selected = mysql_select_db($database, $connection);
if (!$db_selected) {
  die ('Can\'t use db : ' . mysql_error());
}

// Select all the rows in the markers table
$query = "SELECT * FROM markers WHERE 1";
$result = mysql_query($query);
if (!$result) {
  die('Invalid query: ' . mysql_error());
}

header("Content-type: text/xml");

// Start XML file, echo parent node
echo '<markers>';

// Iterate through the rows, printing XML nodes for each
while ($row = @mysql_fetch_assoc($result)){
  // ADD TO XML DOCUMENT NODE
  echo '<marker ';
  echo 'name="' . parseToXML($row['name']) . '" ';
  echo 'address="' . parseToXML($row['address']) . '" ';
  echo 'lat="' . $row['lat'] . '" ';
  echo 'lng="' . $row['lng'] . '" ';
  echo 'type="' . $row['type'] . '" ';
  echo '/>';
}

// End XML file
echo '</markers>';

?>

检查时有哪些来源:

<markers>
<marker name="Pan Africa Market" address="1521 1st Ave, Seattle, WA" lat="47.608940" lng="-122.340141" type="restaurant"/>
<marker name="Buddha Thai & Bar" address="2222 2nd Ave, Seattle, WA" lat="47.613590" lng="-122.344391" type="bar"/>
<marker name="The Melting Pot" address="14 Mercer St, Seattle, WA" lat="47.624561" lng="-122.356445" type="restaurant"/>
...

</markers>

【问题讨论】:

  • 您的xml 似乎没有documentElement。你确定你在data.responseXML 中得到正确的结果吗?您是否已将数据记录到控制台以进行检查?
  • 呵呵,好像是返回null。虽然当我自己加载 XML 生成文件时,它似乎与数据库正确通信并为我提供了所需的 XML。任何想法可能是什么原因?
  • 你给你的回调一个request.status。它说什么?可能会有所帮助。
  • 这意味着 data.responseXML 为空,这可能意味着您的 XML 无效。
  • @Dario - request.status 返回 0。epascarello,它应该是有效的;检查返回文件上的源会显示我正在寻找的数据。

标签: javascript php xml google-maps


【解决方案1】:

您需要允许跨域访问。您可以通过在您的 php 脚本顶部发送正确的标头来做到这一点:

 <?php
 header("Access-Control-Allow-Origin: *");

但要小心,因为您允许所有人访问此资源,而不仅仅是您!

【讨论】:

  • 嗯,我添加了这个(如果你没有看到,我还用新代码编辑了我的原始帖子),但它仍然返回相同的错误,因此标记没有出现。无论如何,感谢您花时间和精力提供帮助,我很高兴成为这样一个乐于助人的社区的一员 :)
  • 注意 - 我没有提到只涉及一个域。完全是我的错。
【解决方案2】:

$result = mysql_query($query); 的 php 脚本中,在查询参数之前添加连接变量。

类似这样的:$result = mysqli_query($conn, $query);

确保数据库连接文件中的变量名称为$conn

例如:$conn = mysqli_connect("HOST", "USERNAME", "PASSWORD", "DATABASE");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-13
    • 2016-11-30
    • 2015-06-18
    • 1970-01-01
    • 2022-09-28
    • 2017-12-08
    • 2021-08-31
    • 2018-05-11
    相关资源
    最近更新 更多