2011-01-18 2 views
1

Я не могу понять, почему все внутри функции request.onreadystate работает до комментария, но следующие предупреждения() этого не делают. Сценарий, кажется, ломается после утверждения if.Javascript break после оператора if

Я бы очень признателен, если кто-то посмотрит на мой код для меня. Большое спасибо.

function positionHandler(position) { 
     if (!document.getElementById("span")) document.body.appendChild(document.createElement("span"));    
     document.getElementsByTagName("span")[0].innerHTML = "("+position.coords.latitude+","+position.coords.longitude+")"; 
     request = new XMLHttpRequest(); 
     request.asycnc = false; 
     request.open('GET','get.php?latitude='+position.coords.latitude+'&longitude='+position.coords.longitude); 
     request.onreadystatechange = function() { 
      if (request.readyState != 4) return false; 
      else if (request.readyState == 4 && request.status == 200) { 
       var results = request.responseXML.getElementsByTagName('note'); 
       for (var i in results) { 
        if (!document.getElementById(results[i].getAttribute('id'))) { 
         var note = document.createElement('div'); 
         note.innerHTML = results[i].childNodes[2].childNodes[0].nodeValue; 
         note.id = results[i].getAttribute('id'); 
         document.getElementById('main').appendChild(note); 
         //everything up until this point works 
        } 
       } 
       alert("this doesn't work 1"); 
      } 
      alert("this doesn't work 2"); 
     } 
     request.send(null); 
     alert("this does work!"); 
    } 

    var position = navigator.geolocation.watchPosition(positionHandler); 
+0

Все, что видимо в журнале ошибок? – Shadikka

+1

Попробуйте добавить другие предупреждения, например, где вы написали комментарий и сразу после инструкции if. Кроме того Firebug поможет вам (вкладка Console). – bluish

+0

Вы получаете какие-либо конкретные ошибки? –

ответ

-1

Эта строка -> предупреждение («это не работает 1»); не будет работать, потому что, вероятно, цикл бесконечен. Эта строка -> предупреждение («это не работает 2»); будет работать, только если это условие else if (request.readyState == 4 && request.status == 200) является ложным.

Третье предупреждение должно работать, если вы исправите первую проблему с предупреждением. Проверьте свою петлю.

Лучшее,

+0

Я думаю, вы неправильно понимаете код. 'for (var i in results)' будет перечислять через конечное число элементов. Поэтому первое предупреждение * должно * срабатывать. Второе предупреждение не регулируется оператором 'else if', поэтому * должен * срабатывать независимо. –

+0

Вы пытались использовать «$ .each()» вместо этого? –

+0

* javascript * не имеет объекта $ ... – annakata

0

Попытайтесь изменить порядок своих заявлений.

function positionHandler(position) { 
    if (!document.getElementById("span")) document.body.appendChild(document.createElement("span"));    
    document.getElementsByTagName("span")[0].innerHTML = "("+position.coords.latitude+","+position.coords.longitude+")"; 
    request = new XMLHttpRequest(); 
    request.asycnc = false; 
    // set the eventhandler logic 
    request.onreadystatechange = function() { 
     if (request.readyState != 4) return false; 
     else if (request.readyState == 4 && request.status == 200) { 
      var results = request.responseXML.getElementsByTagName('note'); 
      for (var i in results) { 
       if (!document.getElementById(results[i].getAttribute('id'))) { 
        var note = document.createElement('div'); 
        note.innerHTML = results[i].childNodes[2].childNodes[0].nodeValue; 
        note.id = results[i].getAttribute('id'); 
        document.getElementById('main').appendChild(note); 
        //everything up until this point works 
       } 
      } 
      alert("this doesn't work 1"); 
     } 
     alert("this doesn't work 2"); 
    } 
    // the event will be triggered here 
    request.open('GET','get.php?latitude='+position.coords.latitude+'&longitude='+position.coords.longitude); 
    request.send(null); 
    alert("this does work!"); 
} 

var position = navigator.geolocation.watchPosition(positionHandler); 

Причина заключается в том, что вы устанавливаете обработчик после того, как он уже был вызван в request.open(...) заявлении.

Надеюсь, это поможет.

+0

Блестящий, спасибо кучу – Tom

+0

Всегда приятно помочь. – Peter

Смежные вопросы