Javascript / AJAX在Opera中不起作用,在FF / IE / Chrome中运行完美

时间:2012-08-23 17:34:31

标签: javascript ajax opera getelementbyid xmlhttprequest

我目前在名为getresults.js的文件中有这个Javascript:

function getItems(str)
{
if (str=="")
  {
  document.getElementById("getItems").innerHTML="";
  return;
  }
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("getItems").innerHTML=xmlhttp.responseText;
    }
  }
xmlhttp.open("GET","/include/retrieveitems.php?q="+str,true);
xmlhttp.send();
}

这个事件要求它:

onclick="getItems('all')"

它在Firefox,IE,Chrome中完美运行..但Opera拒绝使用。我的访问者中很小一部分是Opera用户,但仍然......我宁愿让它工作。可在此处找到实时网址:http://tf2g.com/gallery

如果有人可以提供帮助,那就非常有帮助!

2 个答案:

答案 0 :(得分:3)

失败的原因是事件处理程序根本没有调用你的getItems()方法。它从Opera的Microdata支持http://www.whatwg.org/specs/web-apps/current-work/multipage/microdata.html)中看到document.getItems()方法并调用它。这是JavaScript范围的问题:元素本身及其文档都在范围内,因此这里定义的方法/属性将能够隐藏您在全局范围中定义的方法/属性。

很高兴Opera早期实现了Microdata,所以你注意到了这一点:)

最简单的解决方法是重命名您的函数以避免名称与Microdata冲突。您还可以使用addEventListener()而不是在标记中编写onclick =“” - 如果您执行该函数的范围是它所创建的范围,那么您不会遇到这样的问题。

window.addEventListener('load', function(){
  for( var i=0,l;l=document.links[i]; i++ )if( l.hash){
    l.addEventListener( 'click', function(){
      getItems(this.hash.substr(1));
    }, false);
  }
}, false);

答案 1 :(得分:2)

我稍微调试了你的链接,发现AJAX请求没有问题。 实际上,jquery.min.js文件中存在未处理的异常,这会阻止其他javascript代码运行。

我做的步骤: 我打开了Opera DragonFly(Ctrl + Shft + I),这就像firebug-a-like并刷新页面。我在'getItems()'中插入了断点,看到代码没有到达那里。 通过Dragonfly控制台,我写了“getItems('all');”而ajax就像预期的那样。

0