2010-05-26 19 views
7

Ho il codice qui sotto che non sembra funzionare affatto :(continuo a ricevere:"errore di runtime Microsoft JScript: Previsto oggetto" jQuery

Microsoft JScript runtime error: Object expected 

L'errore sembra verificarsi quando il timeout è fatto. Quindi, se alzo il timeout di 10 secondi l'errore vale per altri 10 secondi

voglio essere in grado di aggiornare il numero di amici asincrone on-line il numero viene visualizzato con il seguente codice HTML:..

<a href="" id="showChat" >Friends online <strong id="friendsOnline">(?)</strong></a> 

La parte amici è impostata alla prima esecuzione, ma quando il timeout richiama non si attiva nuovamente. Inoltre, non riesco a vedere su quale riga si verifica l'errore perché se voglio rompere l'errore mostra semplicemente "nessun codice sorgente" ecc.

Il codice sotto è il codice che sto usando. Grazie!

<script src="http://ajax.microsoft.com/ajax/jquery/jquery-1.3.2.js" type="text/javascript"></script> 
<script src='/Scripts/MicrosoftAjax.js' type="text/javascript"></script> 
<script src='/Scripts/MicrosoftMvcAjax.js' type="text/javascript"></script> 
<script src='/Scripts/jquery.autocomplete.js' type="text/javascript"></script> 

<script type="text/javascript"> 
$(document).ready(function() { 
    UpdateFriendsOnline(); 
    function UpdateFriendsOnline() { 
     window.setTimeout("UpdateFriendsOnline()", 1000); 
     $.get("/Account/GetFriendsOnline", function(data) { 
      $("#friendsOnline").html("(" + data + ")"); 

     }); 
    } 
}); 
</script> 

risposta

3

Cambia la tua setTimeout() in questo modo:

window.setTimeout(UpdateFriendsOnline, 1000); 

Attualmente la tua funzione ion non è disponibile al di fuori del document.ready, quindi non è accessibile come funzione globale, che passandolo come una stringa sta cercando di accedervi come. Come regola generale, mai mai passare setTimeout() una stringa se puoi evitarlo ... può causare problemi come questo caso, e non riesco a pensare ad un esempio (che se evitabile) è reso migliore essendo un stringa.

Inoltre, vi suggerisco di sparare quando si ottiene la risposta indietro, altrimenti si avvia la fila sovrapposte richieste Ajax, è possibile farlo regolando la funzione a questo:

function UpdateFriendsOnline() { 
    $.get("/Account/GetFriendsOnline", function(data) { 
    $("#friendsOnline").html("(" + data + ")"); 
    window.setTimeout(UpdateFriendsOnline, 1000); 
    }); 
} 
+0

@Nick Grazie. Ho modificato il mio codice per abbinarlo ora. Hai idea del motivo per cui la mia richiesta viene chiamata una sola volta? Non sembra aggiornarsi ogni secondo :(Se imposto un breakpoint nel mio controller, lo colpisco solo una volta: –

+0

@Oskar - Stai dicendo che non verrà chiamato dopo il timeout o solo una volta? Inoltre, ci sono javascript errori –

+0

@Nick Ora sembra che si interrompa solo una volta, quindi non dopo il timeout. Sembrava essere almeno una volta dopo il timeout precedente, ma non più No, non ricevo errori js dal debugger.Modifica: ho notato che funziona esattamente come previsto in firefox, ma non in IE8 –

3

Prova questo:

window.setTimeout(UpdateFriendsOnline, 1000); 

La versione aveste avrebbe funzionato se la funzione è stata definita nel namespace globale.

In questo modo, si passa a un riferimento locale alla funzione, che verrà chiamata ogni secondo.


EDIT:

Se avete bisogno di cancellare la precedente richiesta prima che il nuovo si parte, si può fare qualcosa di simile:

<script type="text/javascript"> 
$(document).ready(function() { 
    var request; // Stores XMLHTTPRequest object 
    UpdateFriendsOnline(); 
    function UpdateFriendsOnline() { 
     if(request) request.abort(); // Abort current request if there is one 

     window.setTimeout(UpdateFriendsOnline, 1000); 

      // Store new XMLHTTPRequest object 
     request = $.get("/Account/GetFriendsOnline", function(data) { 
      request = null; // Clear request object upon success 
      $("#friendsOnline").html("(" + data + ")"); 
     }); 
    } 
}); 
</script> 
+0

Vi ringrazio entrambi, che sembrava funzionare! :) mi ha fatto sentire stupido :( –

+0

@Oskar Kjellin - Nah. Sono sicuro che tutti qui sono rimasti bloccati su quello in una volta o l'altra!: o) – user113716

+0

Sì, non lo sapevo che quando passava come una stringa doveva essere definito come globale: O –

Problemi correlati