2011-12-30 20 views
6

Tengo la siguiente función de JavaScript con algunos jquery. Cuando llamo a la createAppointmentConfirm función, se intenta llamar a la SendMail (id) función, pero genera un error:Error de tiempo de ejecución de Microsoft JScript: Función esperada

"Microsoft JScript runtime error: Function expected"

y Firefox depurador genera un error:

SendMail is not a function [Break On This Error] SendMail(data.Message);

Aquí es el código. Gracias por tu ayuda.

function createAppointmentConfirm(data) { 
    if (data.Error) { 
     alert(data.Message); 
    } else { 
     if ($('#sendMail').attr('checked') == 'checked') { 
      SendMail(data.Message); 
     } 
     RefreshAppointmentList(); 
    } 
} 
function SendMail(id) { 
    $.ajax({ 
     url: $('#sendMail').attr('title'), 
     data: { id: id }, 
     type: "POST", 
     beforeSend: function() { 
      $('#sendingMail').dialog({ modal: true }); 
     }, 
     success: function (data) { 
      if (data.Error) { 
       alert(data.Message); 
      } 
      $('#sendingMail').dialog("close"); 
     }, 
     error: function() { 
      alert("Error sending mail"); 
      $('#sendingMail').dialog("close"); 
     } 
    }); 
} 
+1

¿Es posible establecer una [jsFiddle] (http://jsfiddle.net/) para esto? – jabclab

+1

Puede obtener esto, si pierde un corchete de cierre en cualquier lugar de su JS .. ¿Puede verificar todo su JS por el paréntesis faltante ... o intente publicar el JS completo –

+0

¿Dónde se encuentran estas dos funciones en la página? ¿O son parte de los archivos js incluidos? – ShankarSangoli

Respuesta

11

Explicación

Oh chico, me encanta este tipo de preguntas, sobre todo porque tengo la oportunidad de hacer algo de código de la investigación y el ejemplo! :)

Así que, antes que nada, expliquemos qué está pasando con su código.

No hay nada técnicamente mal con su código, es solo que tiene un conflicto de nomenclatura o las funciones a las que intenta llamar están fuera del alcance que las está llamando. También podría ser que esté vinculando dos archivos javascript separados, y uno de ellos no está vinculado en el tiempo de ejecución correctamente, tal vez debido a un error ortográfico.

Éstos son algunos artículos sobre los temas:

Here's a debugging guide, y para ser más precisos, tomar un mirar hacia abajo la parte inferior bajo el título Runtime error messages subpartida xyz is not defined

xyz is not defined
This error occurs when your JavaScript code references a variable or object that does not exist. For example, you get the error with the following. (Note that the assigned variable is Test, whereas the variable used with the alert method is Text.)

var Test="This is a test; alert (Text); 

Another common mistake is to use the wrong capitalization when referring to variables and objects. This code results in an error, even though you have spelled the variable name correctly:

var Test="This is a test; alert (test); 

O, como no mencionan: es posible que haya declarado una función y una variable, ambas con el mismo nombre.


Solución

Los siguientes ejemplos en jsFiddle activarán errores/ejecutar el código cuando se pulsa el botón "go" presentar en el panel HTML.

La solución depende de usted. No publicaste la totalidad del código, así que no puedo ayudarte a encontrar el lugar exacto.

Si tuviera una conjetura, diría que ha declarado una variable en algún lugar con el nombre SendMail, y la secuencia de comandos asume que se está refiriendo a esa.

He creado un ejemplo donde se produce un conflicto de nombres en JSFiddle.

Naming conflict example.

function SendMail(iId) { 
    //Send the mail information to a server page that will pass it along 
    //For this example, we'll pretend it returned an object 

    var oReturned = { 
     "Error": null, 
     "Message": "Mail has been sent." 
    }; 
    SendDebugMessages(oReturned.Message); 
} 


function SendDebugMessage(msg){ 
    $("#debug").prepend("<div>"+msg+"</div>"); 
} 

Aquí, yo estoy tratando de llamar a la función SendDebugMessage(),
pero yo estaba un poco descuidado cuando lo llamé, y añadió una s por lo que se convirtió en SendDebugMessages().
Whops.

También puede suceder con objetos y variables. Simplemente no sabrá de dónde viene.

Por supuesto, todo lo que necesita hacer para resolverlo, es cambiar de nuevo al nombre de la función correcta

Here's an example que creo que representa su problema, una función y una variable que comparten el mismo nombre.

var SendDebugMessage = "something"; 

function SendDebugMessage(msg){ 
    $("#debug").prepend("<div>"+msg+"</div>"); 
} 

Tipo de solución sencilla: cambie el nombre en una de ellas.

Here's a working example, without any errors..

+1

¡Oh chico, me encantan este tipo de respuestas! Buena investigación. – DanM7

+0

Esta respuesta fue útil para ayudarme a descubrir que traje una matriz en una función por parámetro, luego hice un knockout observable con el mismo nombre calificado por "self" y luego intenté ejecutar una función KO util en el matriz de parámetros en lugar de la versión observable KO. – bubbleking

Cuestiones relacionadas