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 ユーザーですが、それでも.. 私はそれを機能させたいと思っています。ライブ URL は次の場所にあります: 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 を早期に実装したことを嬉しく思います。

最も簡単な修正方法は、関数の名前を変更して、Microdata との名前の衝突を避けることです。マークアップに onclick="" を記述する代わりに addEventListener() を使用することもできます。その場合、関数のスコープは関数が作成されたスコープであるため、そのような問題に遭遇することはありません。

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 コードの実行を妨げています。

私が行った手順: Firebug のような Opera DragonFly (Ctrl+Shft+I) を開き、ページを更新しました。「getItems()」にブレークポイントを挿入したところ、コードがそこに到達していないことがわかりました。Dragonfly コンソール経由で「getItems('all');」と書きました。ajaxは期待どおりに進みました。

于 2012-08-24T11:01:53.697 に答える