Jquery và HTML FormData trả về "Uncaught TypeError: Illegal invocation"


82

Tôi đang sử dụng tập lệnh này để tải lên các tệp hình ảnh của mình: http://jsfiddle.net/eHmSr/

$('.uploader input:file').on('change', function() {
  $this = $(this);

  $('.alert').remove();

  $.each($this[0].files, function(key, file) {
    $('.files').append('<li>' + file.name + '</li>');

    data = new FormData();
    data.append(file.name, file);

    $.ajax({
      url: $('.uploader').attr('action'),
      type: 'POST',
      dataType: 'json',
      data: data
    });
  });
});

Nhưng khi tôi nhấp vào nút tải lên, bảng điều khiển JavaScript trả về lỗi này:

Uncaught TypeError: Illegal invocation 

Lỗi jQuery

Bạn có thể giúp tôi được không?


Bạn có chắc về điều này? dataType: 'json',???
Praveen Kumar Purushothaman

1
Có, URL sẽ trả về ở định dạng này.
Caio Tarifa

Trong trường hợp của tôi, tôi muốn gửi tệp như một phần của tập dữ liệu lớn hơn tới Bộ điều khiển .NET MVC chấp nhận một đối tượng được tuần tự hóa làm tham số cho hành động của nó. Cần phải sử dụng một đối tượng FormData, theo đề xuất của lilalinux , cũng như processData: false, theo đề xuất của Blender , contentType: false theo đề xuất của Caio Tarifa . Bất cứ điều gì ít hơn cả ba đều không hoạt động. Xem [câu trả lời này] ( stackoverflow.com/a/3
nbrosz

Câu trả lời:


169

jQuery xử lý datathuộc tính và chuyển đổi các giá trị thành chuỗi.

Việc thêmprocessData: false vào đối tượng tùy chọn của bạn sẽ khắc phục được lỗi, nhưng tôi không chắc liệu nó có khắc phục được sự cố hay không.

Demo: http://jsfiddle.net/eHmSr/1/


Cảm ơn, nhưng tôi cần xóa thuộc tính này, hãy xem câu hỏi sau: stackoverflow.com/questions/12431760/… .
Caio Tarifa

21
Tôi sửa nó, chỉ thêm contentType: false. Cảm ơn một lần nữa!
Caio Tarifa

@Blender Mã này tương tự đang hoạt động trong hệ thống của tôi nhưng không hoạt động trong hệ thống của bạn tôi (cả hai đều đang sử dụng windows 10), tệp không được đăng. Không có lỗi trong bảng điều khiển.
Suchit kumar,

3
Trong trường hợp của tôi, vấn đề là tôi đã sử dụng var data = {}; Tuy nhiên, bạn phải sử dụng var data = new FormData ();
lilalinux

Tôi không thể tìm ra lý do tại sao điều này không hoạt động ... cho đến khi tôi nhận ra rằng quá trình đó được viết bằng một c, không phải hai.
Yaakov Ainspan

16

tôi đã gặp vấn đề tương tự, tôi đã khắc phục vấn đề đó bằng cách sử dụng hai tùy chọn

contentType: false
processData: false

Trên thực tế, tôi đã thêm hai lệnh này vào hàm $ .ajax ({}) của mình


1
Có thể sử dụng chúng với $ .post không? nếu vậy làm thế nào ??
alex

8

Thêm processData: falsevào các $.ajaxtùy chọn sẽ khắc phục sự cố này.


3

Kinh nghiệm của tôi:

  var text = $('#myInputField');  
  var myObj = {title: 'Some title', content: text};  
  $.post(myUrl, myObj, callback);

Vấn đề là tôi quên thêm .val () vào cuối $ ('# myInputField'); hành động này khiến tôi lãng phí thời gian khi cố gắng tìm ra điều gì sai, gây ra Lỗi mời gọi bất hợp pháp , vì $ ('# myInputField') nằm trong một tệp khác với hệ thống đã chỉ ra mã không chính xác. Mong câu trả lời này giúp các bạn cùng cảnh ngộ tránh để mất thời gian.


-1

Trong trường hợp của tôi, có một lỗi trong danh sách các tham số không được hình thành tốt. Vì vậy, hãy đảm bảo rằng các thông số được hình thành tốt. Ví dụ: định dạng chính xác của các tham số

data: {'reporter': reporter,'partner': partner,'product': product}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.