jQuery和HTML FormData返回“未捕获的TypeError:非法调用”


82

我正在使用此脚本上传我的图像文件: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
    });
  });
});

但是,当我单击“上传”按钮时,JavaScript控制台将返回以下错误:

Uncaught TypeError: Illegal invocation 

jQuery错误

你能帮助我吗?


你确定吗?dataType: 'json',???
Praveen Kumar Purushothaman 2012年

1
是的,URL将以这种格式返回。
Caio Tarifa

就我而言,我想将文件作为更大数据集的一部分提交给.NET MVC控制器,该控制器接受序列化对象作为其操作的参数。根据lilalinux的建议,以及Blender的processData: false建议,以及Caio Tarifa的建议,必须使用FormData对象。少于所有这三项的所有内容均无效。参见[this answer](stackoverflow.com/a/3 contentType: false
nbrosz

Answers:


168

jQuery处理data属性并将值转换为字符串。

添加processData: false到您的选项对象可以解决该错误,但是我不确定是否可以解决该问题。

演示:http//jsfiddle.net/eHmSr/1/


谢谢,但是我需要删除此属性,请参见以下问题:stackoverflow.com/questions/12431760/…
Caio Tarifa

21
我解决了,只是添加了contentType: false。再次感谢!
Caio Tarifa

@Blender相同的代码在我的系统中有效,但在我的朋友中则无效(均使用Windows 10),文件未发布。控制台中没有错误。
Suchit kumar,2016年

3
就我而言,问题是我使用了var data = {}; 但是,必须使用var data = new FormData();。
lilalinux

我不知道为什么这行不通...直到我意识到这个过程是一个拼写c,而不是两个拼写。
Yaakov Ainspan '17

16

我有同样的问题,我通过使用两个选项解决了

contentType: false
processData: false

实际上,我将这两个命令添加到了$ .ajax({})函数中


1
这些可以与$ .post一起使用吗?如果是这样怎么办?
alex


3

我的经验:

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

问题是我忘了在$('#myInputField');的末尾添加.val();由于$('#myInputField')与系统指出错误代码的文件位于不同的文件中,因此此操作使我浪费时间试图找出错误所在,从而导致了非法调用错误。希望这个答案可以帮助同一个错误的同学避免浪费时间。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.