2012-04-25 40 views
73

jQuery v1.7.2jQuery - trái phép gọi

Tôi có funcion này được đưa ra cho tôi những lỗi sau trong khi thực hiện:

Uncaught TypeError: Illegal invocation 

Dưới đây là các chức năng:

$('form[name="twp-tool-distance-form"]').on('submit', function(e) { 
    e.preventDefault(); 

    var from = $('form[name="twp-tool-distance-form"] input[name="from"]'); 
    var to = $('form[name="twp-tool-distance-form"] input[name="to"]'); 
    var unit = $('form[name="twp-tool-distance-form"] input[name="unit"]'); 
    var speed = game.unit.speed($(unit).val()); 

    if (!/^\d{3}\|\d{3}$/.test($(from).val())) 
    { 
     $(from).css('border-color', 'red'); 
     return false; 
    } 

    if (!/^\d{3}\|\d{3}$/.test($(to).val())) 
    { 
     $(to).css('border-color', 'red'); 
     return false; 
    } 

    var data = { 
     from : from, 
     to : to, 
     speed : speed 
    }; 

    $.ajax({ 
     url : base_url+'index.php', 
     type: 'POST', 
     dataType: 'json', 
     data: data, 
     cache : false 
    }).done(function(response) { 
     alert(response); 
    }); 

    return false; 
}); 

Nếu Tôi xóa data khỏi cuộc gọi ajax, nó hoạt động .. bất kỳ đề xuất nào?

Cảm ơn!

+0

thử loại bỏ 'from' từ dữ liệu. Có lẽ nó xung đột với jquery's từ – gopi1410

+5

Bạn nhận ra rằng bạn đang cố gắng đẩy các đối tượng jQuery, chứ không phải JSON phải không? – asawyer

+8

Xảy ra cho tôi thường xuyên khi tôi quên .val() trên một số đối tượng jQuery ... – userfuser

Trả lời

84

Tôi nghĩ bạn cần có chuỗi như giá trị dữ liệu. Có khả năng một cái gì đó nội bộ của nó trong jQuery không mã hóa/serializing chính xác các Để & Từ các đối tượng.

thử:

var data = { 
    from : from.val(), 
    to : to.val(), 
    speed : speed 
}; 

Cũng thông báo trên các dòng

$(from).css(... 
$(to).css(

bạn không cần các wrapper jQuery như Để & Từ đã là đối tượng jQuery.

+2

Cảm ơn, quên tôi đã nạp các đối tượng thay vì chuỗi, thường tôi tải chuỗi :) – yoda

+3

Cách tiếp cận này giúp tôi. Tôi đặt tên biến của tôi là '$ from = $ ('# from');' Điều này giúp tôi nhớ rằng nó đại diện cho đối tượng jQuery giúp tránh gọi phương thức trên một chuỗi ký tự hoặc cố gắng thao tác chuỗi bằng '.toString () 'hoặc một cái gì đó khi nó là một đối tượng jQuery. – timbrown

+0

Tôi thiếu phần '.val()', vì vậy nó không truyền giá trị. – SharpC

61

Cố gắng thiết lập processData: false trong cài đặt ajax như thế này

$.ajax({ 
    url : base_url+'index.php', 
    type: 'POST', 
    dataType: 'json', 
    data: data, 
    cache : false, 
    processData: false 
}).done(function(response) { 
    alert(response); 
}); 
+6

tại sao tính năng này hoạt động? – aandis

+3

'Theo mặc định, dữ liệu được chuyển vào tùy chọn dữ liệu dưới dạng đối tượng (về mặt kỹ thuật, bất kỳ thứ gì ngoài chuỗi) sẽ được xử lý và chuyển thành chuỗi truy vấn, phù hợp với loại nội dung mặc định" application/x-www-form- urlencoded ". Nếu bạn muốn gửi DOMDocument hoặc dữ liệu không được xử lý khác, hãy đặt tùy chọn này thành false.' –

+0

Cảm ơn bạn đã hoạt động hoàn hảo. –

14

Chỉ cần cho các hồ sơ nó cũng có thể xảy ra nếu bạn cố gắng sử dụng biến chưa được khai báo trong dữ liệu như

var layout = {}; 
$.ajax({ 
    ... 
    data: { 
    layout: laoyut // notice misspelled variable name 
    }, 
    ... 
}); 
+1

Cảm ơn vì điều đó !! Đó hoàn toàn là nơi tôi bị chặn lại. –

0

My vấn đề không liên quan đến processData. Đó là bởi vì tôi đã gửi một hàm không thể gọi sau bằng apply vì nó không có đủ đối số. Cụ thể tôi không nên sử dụng alert làm gọi lại error.

$.ajax({ 
    url: csvApi, 
    success: parseCsvs, 
    dataType: "json", 
    timeout: 5000, 
    processData: false, 
    error: alert 
}); 

Xem câu trả lời này để biết thêm thông tin về lý do tại sao mà có thể là một vấn đề: Why are certain function calls termed "illegal invocations" in JavaScript?

Con đường tôi đã có thể khám phá này là bằng cách thêm một console.log(list[ firingIndex ]) để jQuery để tôi có thể theo dõi những gì nó được bắn.

Đây là sửa chữa:

function myError(jqx, textStatus, errStr) { 
    alert(errStr); 
} 

$.ajax({ 
    url: csvApi, 
    success: parseCsvs, 
    dataType: "json", 
    timeout: 5000, 
    error: myError // Note that passing `alert` instead can cause a "jquery.js:3189 Uncaught TypeError: Illegal invocation" sometimes 
}); 
Các vấn đề liên quan