4

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

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

4

2 回答 2

3

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

很高兴 Opera 很早就实现了 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);
于 2012-08-24T12:25:05.307 回答
2

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

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

于 2012-08-24T11:01:53.697 回答