2011-12-30 38 views
6

tôi có hàm javascript sau đây với một số jquery trong đó. Khi tôi gọi là createAppointmentConfirm chức năng, nó cố gắng gọi SendMail (id) chức năng nhưng ném một lỗi:Lỗi thời gian chạy Microsoft JScript: Chức năng được mong đợi

"Microsoft JScript runtime error: Function expected"

Và Firefox debugger ném một lỗi:

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

Đây là mã. Cảm ơn sự giúp đỡ của bạn.

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

Có thể thiết lập [jsFiddle] (http://jsfiddle.net/) cho việc này không? – jabclab

+1

Bạn có thể nhận được điều này, nếu bạn bỏ lỡ một khung đóng bất cứ nơi nào trong js của bạn .. Bạn có thể kiểm tra toàn bộ JS của bạn cho bất kỳ khung còn thiếu .. hoặc thử đăng toàn bộ js –

+0

Cả hai chức năng này nằm ở đâu? Hoặc chúng là một phần của các tệp js được bao gồm? – ShankarSangoli

Trả lời

11

Giải thích

Oh cậu bé, tôi thích những loại câu hỏi, chủ yếu là vì tôi nhận được để làm một số nghiên cứu và mã ví dụ! :)

Vì vậy, trước hết, hãy giải thích những gì đang xảy ra với mã của bạn.

Không có gì là về mặt kỹ thuật sai với mã của bạn, chỉ là bạn đã có xung đột đặt tên hoặc các chức năng bạn đang cố gắng gọi nằm ngoài phạm vi đang gọi chúng. Nó cũng có thể là bạn đang liên kết hai tệp javascript riêng biệt và một trong số chúng không được liên kết trong thời gian chạy đúng cách, có thể do lỗi chính tả.

Dưới đây là một số bài viết về các vấn đề:

Here's a debugging guide, và chính xác hơn, hãy nhìn xuống phía dưới dưới tiêu đề Runtime error messages phân nhóm 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); 

Hoặc, vì chúng không đề cập đến: bạn có thể đã khai báo một hàm và một biến, cả hai đều có cùng tên.


Giải pháp

Các ví dụ sau đây trong JSFiddle sẽ kích hoạt lỗi/chạy mã khi bạn nhấn vào nút "go" submit trong bảng điều khiển HTML.

Giải pháp này tùy thuộc vào bạn. Bạn đã không đăng toàn bộ mã, vì vậy tôi không thể giúp bạn phát hiện chính xác địa điểm.

Nếu tôi đoán, tôi cho rằng bạn đã khai báo biến ở đâu đó với tên SendMail và tập lệnh giả sử bạn đang đề cập đến biến đó.

Tôi đã tạo một ví dụ trong đó xung đột đặt tên xảy ra trong 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>"); 
} 

Ở đây, tôi đang cố gắng để gọi SendDebugMessage() chức năng,
nhưng tôi là một chút bất cẩn khi tôi gọi nó, và thêm một s để nó trở thành SendDebugMessages().
Whops.

Điều này cũng có thể xảy ra với các đối tượng và biến. Bạn sẽ không biết nó đến từ đâu.

Tất nhiên, tất cả các bạn cần phải làm gì để giải quyết nó, là thay đổi nó trở lại tên hàm đúng

Here's an example mà tôi nghĩ rằng đại diện cho vấn đề của bạn, một chức năng và một biến chia sẻ cùng tên.

var SendDebugMessage = "something"; 

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

Loại sửa chữa đơn giản: thay đổi tên trên một trong số chúng.

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

+1

Oh boy, tôi thích những loại câu trả lời! Nghiên cứu tốt. – DanM7

+0

Câu trả lời này có ích cho tôi trong việc giúp tôi khám phá ra rằng tôi đã đưa mảng vào một hàm theo tham số, sau đó tạo ra một Knockout có thể quan sát được từ nó với cùng tên được "tự" kiểm tra và sau đó thử chạy hàm KO util trên mảng tham số thay vì phiên bản quan sát KO. – bubbleking

Các vấn đề liên quan