【问题标题】:What is causing "Uncaught TypeError: Illegal Invocation" in this code?是什么导致此代码中的“Uncaught TypeError: Illegal Invocation”?
【发布时间】:2015-06-10 01:19:06
【问题描述】:

谷歌浏览器的控制台告诉我

未捕获的类型错误:非法调用

当下面的函数被调用时

   $('#txtUploadFile').on('change', function (e) {
        var files = e.target.files;
        if (files.length > 0) {
            if (window.FormData !== undefined) {
                var data = new FormData();
                for (var x = 0; x < files.length; x++) {
                    data.append("file" + x, files[x]);
                }

                $.ajax({
                    xhr: function() {
                        var xhr = new window.XMLHttpRequest();
                        xhr.upload.addEventListener("progress", function(evt) {
                            if (evt.lengthComputable) {
                                var percentComplete = evt.loaded / evt.total * 100;
                                console.log("percentComplete = " + percentComplete);
                            }
                            else
                            {
                                console.log("lengthComputable evaluated to false;")
                            }
                        }, false);

                        xhr.addEventListener("progress", function(evt) {
                            if (evt.lengthComputable) {
                                var percentComplete = evt.loaded / evt.total * 100;
                                console.log("percentComplete = " + percentComplete);
                            }
                            else
                            {
                                console.log("lengthComputable evaluated to false;")
                            }
                        }, false);

                        return xhr;
                    },
                    type: 'POST',
                    url: '@Url.Action("upload","FileUploadAsync")',
                    data: data,
                    success: function(data){
                        console.log("success!");
                    }
                });
            } else {
                alert("This browser doesn't support HTML5 file uploads!");
            }
        }
    });

我查看了有关此问题的 StackOverflow 帖子,但没有任何原因与我在我的文章中看到的任何内容有关。我不确定这是否重要,但如果这可能是问题的一部分,我可以发布 HTML 和控制器。

【问题讨论】:

  • 您是否已将范围缩小到所有代码中发生错误的位置?

标签: javascript jquery asp.net ajax asp.net-mvc


【解决方案1】:

$.ajax 调用缺少两个选项,这些

contentType: false,
processData: false,

变成这样

$.ajax({
    xhr: function () {
        var xhr = new window.XMLHttpRequest();
        xhr.upload.addEventListener("progress", function (evt) {
            if (evt.lengthComputable) {
                var percentComplete = evt.loaded / evt.total * 100;
                console.log("percentComplete = " + percentComplete);
            } else {
                console.log("lengthComputable evaluated to false;")
            }
        }, false);

        xhr.addEventListener("progress", function (evt) {
            if (evt.lengthComputable) {
                var percentComplete = evt.loaded / evt.total * 100;
                console.log("percentComplete = " + percentComplete);
            } else {
                console.log("lengthComputable evaluated to false;")
            }
        }, false);

        return xhr;
    },
    type: 'POST',
    url: '@Url.Action("upload","FileUploadAsync")',
    data: data,
    contentType: false,
    processData: false,
    success: function (data) {
        console.log("success!");
    }
});

如果让 jQuery 在内部处理文件,则会引发 Illegal invocation 错误。

【讨论】:

  • 抛出的具体错误是因为 jQuery 将 data.append 保存为引用,并尝试稍后将该引用作为函数调用,Chrome 不会让这种情况发生。
  • @PawelVeselov - 实际上是 jQuery 的 $.param 抛出错误,因为它试图 “将表单元素数组或一组键/值序列化为查询字符串”,这对文件不太适用。
  • 我的错。 $.param() 将数据视为一个对象,尝试从中提取键/值对,然后找到作为函数的键,并将这些键视为会生成数据的函数,调用它们,并且没有 this 上下文。 FormData 实现不喜欢那样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 2016-06-22
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多