Javascript/AJAX не работает в Opera, отлично работает в FF/IE/Chrome

В настоящее время у меня есть этот Javascript в файле с именем getresults.js:

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.

Если кто может помочь, очень обязан!


person Mave    schedule 23.08.2012    source источник
comment
Ужасный, ужасный зазор! Я знаю, что это w3schools, но ты все равно виноват, что так оставил :-p   -  person Imp    schedule 23.08.2012
comment
Также работает сам запрос AJAX. Да хоть в Опере. Попробуйте зарегистрировать status и responseText. Немного сложно отлаживать вашу страницу, не отражая ее на моем компьютере.   -  person Imp    schedule 23.08.2012
comment
Даже в Опере? Опера рулит. Я установил этот код локально, и все работало нормально. Согласен - сначала подтвердите, что обратный вызов не срабатывает.   -  person Mitya    schedule 23.08.2012
comment
@Utkanos Эх, получилось неправильно ;) Я просто хотел подчеркнуть, что тестировал в Opera. Конечно, это качает! Мой основной браузер :)   -  person Imp    schedule 23.08.2012


Ответы (2)


Причина, по которой это не удается, заключается в том, что обработчик событий вообще не вызывает ваш метод getItems(). Он видит метод document.getItems() из поддержки микроданных Opera ( 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);
person hallvors    schedule 24.08.2012
comment
А, вижу, получилось! Переименование сработало как волшебство, спасибо! - person Mave; 25.08.2012

Я немного отладил вашу ссылку и обнаружил, что с запросом AJAX проблем нет. Фактически, в файле jquery.min.js есть необработанное исключение, которое препятствует запуску другого кода javascript.

Шаги, которые я сделал: я открыл Opera DragonFly (Ctrl+Shft+I), которая похожа на firebug, и обновил страницу. Я вставил точки останова в getItems() и увидел, что код туда не доходит. Через консоль Dragonfly я написал "getItems('all');" и ajax пошел, как и ожидалось.

O

person Omeriko    schedule 24.08.2012
comment
Ясно... какая-нибудь подсказка, что это за необработанное исключение? И почему барахлит только Opera? Спасибо за Ваш ответ! --edit: обновил jquery.min.js до 1.8.0, тоже без радости. - person Mave; 25.08.2012