【问题标题】:Javascript/AJAX not working in Opera, works perfect in FF/IE/ChromeJavascript/AJAX 在 Opera 中不起作用,在 FF/IE/Chrome 中完美运行
【发布时间】:2012-08-19 07:06:45
【问题描述】:

我目前在一个名为 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

如果有人能提供帮助,非常感谢!

【问题讨论】:

  • 可怕,可怕的缩进!我知道这是 w3schools,但你仍然因为离开它而感到内疚:-p
  • 另外,AJAX 请求本身也有效。是的,即使在 Opera 中也是如此。尝试记录 statusresponseText。不镜像到我的电脑上调试你的页面有点困难。
  • “即使在 Opera 中”?歌剧摇滚。我在本地设置了这段代码,一切正常。同意 - 首先确认回调不会触发。
  • @Utkanos 呃,那是错误的 ;) 我只是想强调我正在 Opera 中进行测试。当然它摇滚!我的主要浏览器:)

标签: javascript ajax opera getelementbyid xmlhttprequest


【解决方案1】:

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

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

最简单的解决方法是重命名函数以避免与微数据发生名称冲突。您还可以使用 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);

【讨论】:

  • 啊,我明白了,它成功了!重命名它就像一个魅力,谢谢!
【解决方案2】:

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

我做的步骤: 我打开了类似于萤火虫的 Opera DragonFly (Ctrl+Shft+I) 并刷新页面。我在“getItems()”中插入了断点,发现代码没有到达那里。 通过 Dragonfly 控制台,我写了“getItems('all');”并且 ajax 按预期进行。

【讨论】:

  • 我明白了.. 任何线索未处理的异常是什么?为什么 Opera 是唯一一个在演戏的?感谢您的回答! --edit:将 jquery.min.js 更新到 1.8.0,也没有任何乐趣。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 2019-12-14
  • 1970-01-01
  • 1970-01-01
  • 2011-03-10
  • 2012-06-11
  • 1970-01-01
相关资源
最近更新 更多