2011-12-30 17 views
6

Mam następującą funkcję javascript z jquery. Kiedy nazywam createAppointmentConfirm funkcji, stara się wywołać sendmail (ID) funkcję ale zgłasza błąd:Błąd środowiska wykonawczego Microsoft JScript: oczekiwana funkcja

"Microsoft JScript runtime error: Function expected"

i Firefox debugger zgłasza błąd:

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

Oto kod. Dziękuję za pomoc.

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

Czy można skonfigurować w [jsFiddle] (http://jsfiddle.net/) do tego? – jabclab

+1

Możesz dostać to, jeśli przegapisz nawias zamykający w dowolnym miejscu. Możesz sprawdzić cały JS pod kątem brakujących nawiasów .. lub spróbuj zamieścić cały js –

+0

Gdzie te dwie funkcje znajdują się na stronie? Czy są one częścią dołączonych plików js? – ShankarSangoli

Odpowiedz

11

Wyjaśnienie

O rany, uwielbiam tego rodzaju pytania, głównie dlatego, że mogę zrobić rozeznanie i przykładowy kod! :)

Po pierwsze, wyjaśnijmy, co się dzieje z Twoim kodem.

Niepoprawnie z kodem pod względem technicznym , to po prostu konflikt nazw lub funkcje, które próbujesz wywołać, wykraczają poza zakres, który je wywołuje. Może to również oznaczać, że łączysz dwa osobne pliki javascript, a jeden z nich nie jest poprawnie połączony w środowisku wykonawczym, może z powodu błędu pisowni.

Oto kilka artykułów na temat zagadnień:

Here's a debugging guide, a dokładniej, spojrzeć w dół na dno pod nagłówkiem Runtime error messages podpozycją 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); 

Albo, ponieważ nie wspominają o: mógłbyś zadeklarować funkcję i zmienną, obie o tej samej nazwie.


Rozwiązanie

następujące przykłady, w JSFiddle spowodują błędy/uruchomić kod po naciśnięciu przycisku „Go” Umieść przycisk w panelu HTML.

Rozwiązanie zależy w zasadzie od Ciebie. Nie opublikowałeś całego kodu, więc naprawdę nie mogę pomóc ci znaleźć dokładnego miejsca.

Gdybym zgadywał, powiedziałbym, że zadeklarowałeś gdzieś zmienną o nazwie SendMail, a skrypt zakłada, że ​​się do niej odnosisz.

Stworzyłem przykład, w którym występuje konflikt nazw w 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>"); 
} 

Tutaj staram się wywołać funkcję SendDebugMessage(),
ale byłem trochę nieostrożny gdy zadzwoniłem go i dodał s tak stało SendDebugMessages().
Whops.

Może się to również zdarzyć w przypadku obiektów i zmiennych. Po prostu nie wiesz, skąd się bierze.

Oczywiście, wszystko co trzeba zrobić, aby je rozwiązać, to zmienić go z powrotem do właściwej nazwy funkcji

Here's an example że myślę stanowi problemu, funkcję dzielenia i zmienną taką samą nazwę.

var SendDebugMessage = "something"; 

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

Rodzaj prostej poprawki: zmień nazwę na jednym z nich.

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

+1

Och chłopcze, uwielbiam takie odpowiedzi! Niezłe badania. – DanM7

+0

Ta odpowiedź przydała mi się, pomagając mi odkryć, że wprowadziłem tablicę do funkcji według parametru, a następnie wykonałem Knockout obserwowalny z tej samej nazwy kwalifikowanej przez "self", a następnie próbowałem uruchomić funkcję KO util na tablica parametrów zamiast obserwowalnej wersji KO. – bubbleking

Powiązane problemy