2010-05-26 12 views
7

que tienen el código de abajo que no parece funcionar en absoluto :(me siguen dando: parece ocurrir cuando se hace el tiempo de espera"error de ejecución Microsoft JScript: Objeto esperado" jQuery

Microsoft JScript runtime error: Object expected 

El error. Así que si levanto el tiempo de espera de 10 segundos el error mantiene durante otros 10 segundos

Quiero ser capaz de actualizar el número de amigos asíncrono en línea el número se muestra con el código hTML siguiente:..

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

La parte de amigos se establece en la primera ejecución, pero cuando se devuelve el tiempo de espera, no se vuelve a iniciar. Además, no puedo ver en qué línea se produce el error porque si quiero romper el error, simplemente muestra "sin código fuente", etc.

El siguiente código es el código que estoy usando. ¡Gracias!

<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> 

Respuesta

3

Cambiar la setTimeout() así:

window.setTimeout(UpdateFriendsOnline, 1000); 

Actualmente su funct ion no está disponible fuera del document.ready, por lo que no se puede acceder a él como una función global, que al pasarlo como una cadena intenta acceder a él como. Como regla general, nunca siempre pase setTimeout() una cadena si puede evitarla ... puede causar problemas como este caso, y no puedo pensar en un ejemplo (que si es evitable) se mejora al ser un cuerda.

Además, sugiero disparar cuando llegue la respuesta de vuelta, de lo contrario comenzará a hacer la fila superposición peticiones Ajax, puede hacerlo mediante el ajuste de su función para esto:

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

@Nick Gracias. Modifiqué mi código para que coincida con ese ahora. ¿Tiene alguna idea de por qué mi solicitud solo se llama una sola vez? No parece actualizarse cada segundo :(Si configuro un punto de interrupción en mi controlador, solo lo golpeo una vez. –

+0

@Oskar - ¿Está diciendo que no se llamará después del tiempo de espera, o solo una vez? Además, ¿hay algún javascript? errors? –

+0

@Nick Ahora parece que se rompe solo una vez. Por lo tanto, no después del tiempo de espera. Parecía ser al menos una vez después del tiempo de espera anterior, pero ya no. No, no obtengo errores js del depurador.Editar: se dio cuenta de que funciona como se pretendía en Firefox, pero no en IE8 –

3

Prueba esto:

window.setTimeout(UpdateFriendsOnline, 1000); 

La versión que tenía hubiera funcionado si la función se define en el espacio de nombres global.

De esta manera, está pasando una referencia local a la función, que se llamará cada segundo.


EDIT:

Si necesita cancelar la solicitud anterior antes de que comience el nuevo, se puede hacer algo como esto:

<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

gracias a los dos, que ¡Pareció funcionar! :) me hizo sentir estúpido :( –

+0

@Oskar Kjellin - Nah. ¡Estoy seguro de que todos aquí se quedaron atrapados en eso en un momento u otro!: o) – user113716

+0

Sí, no sabía que al pasar como una cuerda tenía que definirse como global: O –

Cuestiones relacionadas