【问题标题】:Ajax XML request not working properlyAjax XML 请求无法正常工作
【发布时间】:2011-12-08 03:56:16
【问题描述】:

我正在尝试在选择下拉列表中的值时执行一个简单的ajax请求来加载一些XML。 XML 包含我根据用户选择切换的图像路径。它在 Firefox 中运行良好(我没有收到任何 Javascript 错误),但由于某种原因,Chrome 中没有任何反应。这是我到目前为止所拥有的:

        <script type="text/javascript">
        function loadXMLDoc(url) {

            var xmlhttp;
            var txt, txtBase, txtOverlay1, txtOverlay2, txtBlack, name, img;

            if (window.XMLHttpRequest){
              // code for IE7+, Firefox, Chrome, Opera, & Safari
              xmlhttp=new XMLHttpRequest();
              xmlhttp.overrideMimeType("text/xml");
            }
            else { 
              // code for IE6 & IE5
              xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
            }
            xmlhttp.onreadystatechange=function() {

                if (xmlhttp.readyState==4 && xmlhttp.status==200) { 

                    txtBase='<img id="original"';
                    txtOverlay1='<img id="overlay1" class="overlay"';
                    txtOverlay2='<img id="overlay2" class="overlay"';
                    txtBlack='<img id="opacity" class="overlay"';

                    img=xmlhttp.responseXML.documentElement.getElementsByTagName("IMG");
                    name=img[0].getElementsByTagName("NAME");

                    txtBase = txtBase + name[0].firstChild.nodeValue + '/>';
                    txtOverlay1 = txtOverlay1 + name[1].firstChild.nodeValue + '/>';
                    txtOverlay2 = txtOverlay2 + name[2].firstChild.nodeValue + '/>';
                    txtBlack = txtBlack + name[3].firstChild.nodeValue + '/>';

                    txt = txtBase + txtOverlay1 + txtOverlay2 + txtBlack;
                    document.getElementById('inner_container').innerHTML = txt;
                    $(".red").css({"font-size":"2.0em"});
                    $(".blue, .green").css({"font-size":"1.0em"});
                }
            }
            xmlhttp.open("GET",url,true);
            xmlhttp.send();
        }
    </script>

我用这个来称呼它。

            <select>
                <option id="selected">Select a car</option>
                <option onclick="loadXMLDoc('http://www.brandybrowauto.com/files/nissan.xml')">Nissan</option>
                <option onclick="loadXMLDoc('http://www.brandybrowauto.com/files/mazdaspeed3.xml')">Mazdaspeed3</option>
            </select>

非常感谢任何帮助使其在 Chrome 中工作的帮助,以及任何使代码更好的提示。我是 ajax 的初学者。

【问题讨论】:

  • 您可能会发现使用 jQuery 更容易,它会为您处理 AJAX 跨浏览器兼容性。
  • 鉴于您似乎已经在使用 jQuery 来设置 CSS,您也应该将它用于 Ajax。您可能还想使用它来创建新元素。 (至于 Chrome 中的实际问题 - 我不知道。)
  • 我一直打算尝试将所有内容都切换到所有 jquery,但不幸的是,我刚刚进入 ajax 并且必须做很多研究。但与此同时,我必须做/不做一些愚蠢的事情,导致它甚至无法在 chrome 中加载 xml 文件。我尝试了 overrideMime 技巧,但无济于事。

标签: javascript xml ajax google-chrome


【解决方案1】:

此代码中的任何一段是否适用于您网站上的 Chrome 浏览器?如果是这样,它会走多远?如果您还没有,您应该使用 Chrome 开发人员的工具并在您的 javascript 中设置断点并逐步执行代码,直到它停止按预期工作。

如果我不得不猜测发生了什么——Chrome 可能不喜欢你正在使用的事实

xmlhttp.onreadystatechange

这一行应该是:

xmlhttp.onload

编辑内容:

查看您的代码后(根据您的评论回复),您似乎永远无法触发您选择的 onclick 事件。我玩弄了代码来测试它,确保它不会运行。以下根本不会发生,因为此事件不会触发。

<option onclick="alert('test');">Nissan</option>

改为,不要使用选项中的事件。使用 select 中的 onchange 事件。

<select onchange="alert(options[selectedIndex].text);">

请试试这个并告诉我它是否让你满意。您可以使用此信息来触发您的 xmlhttp 逻辑。

【讨论】:

  • 游乐场样本在这里。 brandybrowauto.com/files/test2.html 页面加载正常,但在选择其中一个值时,该函数不会加载 xml。我尝试将其更改为 .onload ,但仍然没有。
  • 对不起,我没有给你信用,你的回答也完全正确。我只是先阅读莫勒博士的。谢谢!
【解决方案2】:

请检查状态码。之前可能已经请求了 xml 文件并且服务器发送了另一个状态码,例如304

jQuery 自动将随机参数附加到 url 以防止这种情况发生(你也可以这样做)。


编辑:

似乎点击处理程序没有触发。 改为使用此标记进行选择:

<select onchange="if(this.value)loadXMLDoc(this.value)">
  <option value="0" id="selected" selected="selected">Select a car</option>
  <option value="/files/nissan.xml">Nissan</option>
  <option value="/files/mazdaspeed3.xml">Mazdaspeed3</option>
</select>

【讨论】:

  • 如何在本例中附加该参数?我相信在萤火虫它显示响应为 304。
  • url=url+'?'+new Date().getTime(); ,但请参阅我更新的帖子()
  • 您上面的编辑成功了!奇怪为什么 onclick 没有触发,但非常感谢。
  • 这适用于部分选项 (nissan),但当我尝试选择第三个选项时,我收到错误“未捕获的类型错误:无法读取未定义的属性 'firstChild'”。有什么想法吗?
  • 原来错误是我使用的是 .nodeValue 而不是 .data。现在可以使用了。
猜你喜欢
  • 2014-11-03
  • 2014-04-21
  • 1970-01-01
  • 2012-05-10
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
  • 2018-03-28
  • 1970-01-01
相关资源
最近更新 更多