GM_xmlhttpRequest的responsetext缺少一些HTML

时间:2013-04-09 22:39:52

标签: javascript xmlhttprequest greasemonkey gm-xmlhttprequest

如果我转到this Google Maps page查看来源中缺少部分HTML,但会显示在Firebug中。

同样,当同一个URL传递给我的函数时,以下HTML不会显示在responseText中,但是当我打开页面时它会显示在Firebug中。

<a id="mapmaker-link" class="kd-button mini left" style="" href="https://www.google.com/mapmaker?ll=41.06877,-112.047203&spn=0.038696,0.132093&t=h&z=14&vpsrc=0&q=1093+W+3090+S,Syracuse,+UT&utm_medium=website&utm_campaign=relatedproducts_maps&utm_source=mapseditbutton_normal">

这是我正在使用的功能:

function updateMap(url) {
     GM_xmlhttpRequest(
    {
        method: 'GET',
        url: url,
        onload: function(resp) {
            var ll = resp.responseText.split("mapmaker?")[1];
            ll     = ll.split("&")[0];
            document.getElementById('googlemap').href = url+"&"+ll;
        }
    });
}


我已将responseText的样本值放在pastebin.com/Tt8nrzG8

1 个答案:

答案 0 :(得分:2)

响应是“缺少”HTML,因为被调用的页面通过AJAX加载HTML(以及几乎所有页面的内容)。
GM_xmlhttpRequest(以及所有其他当前的AJAX方法)仅获取给定页面的静态源。此类XHR请求无法处理请求页面的javascript,就像浏览页面时浏览器所做的那样。

实际上,如果将that sample responseText, that you linked,保存为HTML文件;你会看到它看起来像这样:

The OP's sample response


请参阅"How to get an AJAX get-request to wait for the page to be rendered before returning a response?",了解相同类型的问题。但请注意,答案建议您使用 API,如果有的话。

因此,使用the Google Maps API获取您想要的网址的纬度/经度。

或者,最简单的方法仍然是让脚本也在Google地图页面上运行,并使用您的特殊网址参数对链接进行一次性缩放 - 就像我在{{3 }}。这样做的另一个好处是,在您真正决定点击Google地图链接之前,不会向Google发送任何电话。

如果您 选择iframe方法(同样,不建议在任何Google网站上使用),请注意您需要your previous question并且纬度/经度信息将在页面的不同部分。