Javascript/AAJAX在Opera中不起作用,在FF/IE/Chrome中完美工作

Javascript/AJAX not working in Opera, works perfect in FF/IE/Chrome

本文关键字:IE Chrome 工作 完美 FF 不起作用 AAJAX Opera Javascript      更新时间:2023-09-26

我目前在一个名为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用户,但仍然。。我宁愿让它发挥作用。可以在此处找到实时url:http://tf2g.com/gallery

如果有人能帮忙的话,非常感谢!

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

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

最简单的修复方法是重命名函数,以避免与Microdata的名称冲突。您也可以使用addEventListener(),而不是在标记中写onclick="-如果您这样做,函数的作用域就是它创建的作用域,所以您不会遇到这样的gotchas。

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);

我调试了一下您的链接,发现AJAX请求没有问题。事实上,在jquery.min.js文件中有一个未处理的异常,它阻止了其他javascript代码的运行。

我所做的步骤:我打开了Opera DragonFly(Ctrl+Shft+I),这是一个类似火球的页面,并刷新了页面。我在"getItems()"中插入了断点,发现代码没有到达那里。通过Dragonfly控制台,我编写了"getItems('all');",ajax正如预期的那样运行。

O