【问题标题】:kml loading fails in different browsers - javascript / geoxml3 /google maps在不同的浏览器中,kml 加载失败 - javascript / geoxml3 /google maps
【发布时间】:2025-11-25 07:45:01
【问题描述】:

此代码在 Firefox 中运行良好,在 chrome/Internet Explorer 中尝试加载 kml(从 php 脚本生成)时,控制台“无法打开文件”出现错误

因为它在 FF 中工作,我认为我的代码/kml 没有问题,但可能需要添加才能使其在其他浏览器中工作?嗯...我不是专家,欢迎任何解决代码问题的建议, 非常感谢!

使用geoxml3库/谷歌地图apiv3

参考链接: geoxml库的使用:http://erskinelabs.com/cartography-javascript/

【问题讨论】:

  • 所以问题似乎出在geoxml中。我假设您不想在 Google Maps API 中使用 KmlLayer 选项?需要检查的一件事是,您使用哪种 mime 类型提供服务?
  • 在生成 kml 时我设置了 Content-type: application/vnd.google-earth.kml+xml,我也不想使用 kmllayer 因为当 geoxml 工作时它允许我添加一个监听器kmllayer 中没有的每个标记上的 mouseover 属性
  • 我建议在他们的问题跟踪器上提交一个错误:code.google.com/p/geoxml3/issues/list 它似乎处于活动状态。
  • 我在网站上遇到了他们的一个例子,geocodezip.com/geoxml3_test/…,它适用于所有浏览器,然后我将这段代码与我的代码进行了比较,并更改了我在调用 lib 时传递变量的方式,以匹配这里的例子。成功!非常感谢您让我朝着正确的方向前进!

标签: javascript google-maps cross-browser kml


【解决方案1】:

GeoXML3 库的问题是在 geoXML3.fetchXML 函数中处理 Ajax 请求的方式,这是不推荐使用的代码并且有点狡猾。 如果您在项目中使用 jQuery,您只需将 geoxml3.js 文件中的此函数替换为以下代码:

geoXML3.fetchXML = function (url, callback) {
  function timeoutHandler() {
    callback();
  };
  $.ajax({
    type: "GET",
    url: url,
    success: function(xml) {
        callback(xml);
    }
  });
};

希望对你有帮助!

【讨论】:

    【解决方案2】:

    除了上述答案之外,您还必须考虑 1. IE 在 AJAX 调用(缓存)中的不同行为和 2.你必须将一个DOM(Node)传递给回调函数;否则函数 将失败 3. 在 IE 中使用这种方法的另一个警告是,字符串在 XML DOM 对象中转换是有限制的。这意味着可以通过这种方式加载和呈现的 KML 文件存在大小限制。我在 geoxml3 中使用了这个修改来在 IE 中进行 ajax 调用:

    geoXML3.fetchXML = function (url, callback) {
      function timeoutHandler() {
         callback();
      };
    $.ajax({
        type:       "GET",
        cache:      false,      
        url: url,
        success: function(xml) {
            var xmldom = createXMLDocument(xml);
            callback(xmldom);
        }
    });  
    

    要将字符串转换为 XML DOM,请查看此处http://www.w3schools.com/dom/dom_parser.asp

    function createXMLDocument(strResponse)
    {
       if (window.DOMParser)
       {
         parser=new DOMParser();
         xmlDoc=parser.parseFromString(strResponse,"text/xml");
       } else // Internet Explorer
       {
          xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
          xmlDoc.async=false;
         xmlDoc.loadXML(strResponse);
       } 
       return xmlDoc;
     }
    

    【讨论】: