【问题标题】:JQuery: 'Uncaught TypeError: Illegal invocation' at ajax request - several elementsJQuery: 'Uncaught TypeError: Illegal invocation' at ajax request - 几个元素
【发布时间】:2012-06-19 17:30:18
【问题描述】:

我有两个选择元素,A 和 B:当 A 的选择选项发生变化时,B 的选项必须相应更新。 A 中的每个元素都意味着 B 中的许多元素,这是一对多的关系(A 包含国家,B 应该包含位于给定国家的城市)。

函数do_ajax应该运行异步请求:

function do_ajax(elem, mydata, filename)
{
    $.ajax({
        url: filename,
        context: elem,
        data: mydata,
        datatype: "html",
        success: function (data, textStatus, xhr) {
            elem.innerHTML = data;
        }
    });
}

为了更新 B 的选项,我在 A 的 onChange 事件中添加了一个函数调用。以下是触发 onChange 事件(A)时运行的函数:

function my_onchange(e) // "e" is element "A"
{
    var sel_B = ... ; // get select element "B"

    // I skipped some code here
    // ...

    var data = {
        'mode': 'filter_city',
        'id_A': e[e.selectedIndex]
    };
    do_ajax(city_sel, data, 'ajax_handler.php');
}

}

我在JQuery docs 中读到data 可以是一个数组(键值对)。如果我输入,我会收到错误:

var data = {
        'mode': 'filter_city',
        'id_A': e[e.selectedIndex]
};

相反,如果我的数据是字符串,我不会收到该错误:

var data = 'mode=filter_city&id_A=' + e[e.selectedIndex];

但我需要变量的“数组版本”,在我的服务器端 php 代码中。

Uncaught TypeError: Illegal invocation 位于“jquery-1.7.2.min.js”文件中,该文件全部被压缩,所以我无法弄清楚是哪部分代码引发了错误。

我可以在我的代码中更改任何设置,以便它接受数据作为关联数组吗?

【问题讨论】:

    标签: html ajax jquery


    【解决方案1】:

    $.getJSON 上的 illegal invocation 错误是由于将 undefined 作为 data 对象的值之一传递而引起的。修复解决了错误。

    【讨论】:

      【解决方案2】:

      请按照程序解决此问题:

      $.ajax({
         url: 'https://your-api-endpoint',
         type: 'post',
         data: new formData(this),
         processData: false,
         contentType: false,
         success: function(response) {
            console.log(response)
         }
      })
      

      你必须使用 processData: false 和 contentType: false,这两行。您的问题将得到解决。

      【讨论】:

        【解决方案3】:

        我在发布 FormData 对象时收到此错误,因为我没有正确设置 ajax 调用。下面的设置解决了我的问题。

        var myformData = new FormData();        
        myformData.append('leadid', $("#leadid").val());
        myformData.append('date', $(this).val());
        myformData.append('time', $(e.target).prev().val());
        
        $.ajax({
            method: 'post',
            processData: false,
            contentType: false,
            cache: false,
            data: myformData,
            enctype: 'multipart/form-data',
            url: 'include/ajax.php',
            success: function (response) {
                $("#subform").html(response).delay(4000).hide(1); 
            }
        });
        

        【讨论】:

        • 谢谢你。你拯救了我的一天,我的问题通过在我的 ajax 正文中添加“processData:false,contentType:false,cache:false”来解决。非常感谢。
        • processData: false, contentType: false, cache: false, 解决了我的问题。
        • 嗯,谢谢你救了我半天
        【解决方案4】:

        感谢与 Sarfraz 的谈话,我们可以找到解决方案。

        问题是我传递了一个 HTML 元素而不是它的值,这实际上是我想要做的(事实上,在我的 php 代码中,我需要该值作为外键来查询我的 cities 表和过滤器正确的条目)。

        所以,而不是:

        var data = {
                'mode': 'filter_city',
                'id_A': e[e.selectedIndex]
        };
        

        应该是:

        var data = {
                'mode': 'filter_city',
                'id_A': e[e.selectedIndex].value
        };
        

        注意:查看 Jason Kulatunga 的 answer,它引用了 JQuery 文档来解释为什么传递 HTML 元素会导致问题。

        【讨论】:

        • 正是我在做什么。忘记使用 .val()
        • 我传递了变量中选择 html 元素的选项。没注意到不是纯文本而是html。
        【解决方案5】:

        来自processData 的 jQuery 文档:

        processData 布尔值
        默认值:true
        默认情况下,作为对象(从技术上讲,除了字符串之外的任何内容)传入 data 选项的数据将被处理并转换为查询字符串,适合默认的内容类型“application/x-www-form-urlencoded” .如果要发送 DOMDocument 或其他未处理的数据,请将此选项设置为 false。

        来源:http://api.jquery.com/jquery.ajax

        看来您将不得不使用processData 将数据发送到服务器,或者修改您的 php 脚本以支持查询字符串编码参数。

        【讨论】:

        • 这是真的。如果我能在它指出我的代码中的实际错误之前看到它。谢谢,我会在回答中添加注释。
        【解决方案6】:
        function do_ajax(elem, mydata, filename)
        {
            $.ajax({
                url: filename,
                context: elem,
                data: mydata,
                **contentType: false,
                processData: false**
                datatype: "html",
                success: function (data, textStatus, xhr) {
                    elem.innerHTML = data;
                }
            });
        }
        

        【讨论】:

        • good answer 不仅仅是一个代码 sn-p。它应该解释为什么这会回答最初的问题,并提供相关文档的链接(如果有)。
        • 没有contentTypeprocessData这两个字段,错误会一直显示。我添加了这两个字段,它对我有用。我认为 op 试图指出这两个重要领域。
        【解决方案7】:
        $.ajax({
                            url:"",
                            type: "POST",
                            data: new FormData($('#uploadDatabaseForm')[0]),
                            contentType:false,
                            cache: false,
                            processData:false,
                            success:function (msg) {}
                          });
        

        【讨论】:

        • 如果您包含解释,答案会更有帮助。
        【解决方案8】:

        最近遇到同样的问题,加traditional: true,解决了

        【讨论】:

        • 这确实有效,但我假设仅适用于现代浏览器
        • 看起来这成功了。 ..不知道为什么。 .. 也不知道为什么它首先停止工作 - 之前一切都很好!
        【解决方案9】:

        试试这个:

                    $.ajax({
                            url:"",
                            type: "POST",
                            data: new FormData($('#uploadDatabaseForm')[0]),
                            contentType:false,
                            cache: false,
                            processData:false,
                            success:function (msg) {}
                          });
        

        【讨论】:

          【解决方案10】:

          我在 JQuery 文档中读到数据可以是一个数组(键值对)。 如果我输入,我会收到错误:

          这是对象而不是数组:

          var data = {
                  'mode': 'filter_city',
                  'id_A': e[e.selectedIndex]
          };
          

          你可能想要:

          var data = [{
                  'mode': 'filter_city',
                  'id_A': e[e.selectedIndex]
          }];
          

          【讨论】:

          • 它不再抛出那个错误,但似乎这个数据没有被传递到我的$_GET数组服务器端(var_export($_GET)输出array ( 'undefined' => 'undefined', )
          • @nadirs:尝试在 $.ajax 处理程序中定义方法类型:type:'get',
          • @Sarfraz 结果是一样的。服务器端,data 键应该在 GET 数组中找到,对吧?或者它们可能是通过另一种请求方法发送的?
          • @nadirs:像这样的东西data: {foo:'myfoo', bar:'mybar'},我认为可能还有其他问题。
          • @Sarfraz 我是个白痴,我发送了一个 HTML 对象e[e.selectedIndex],而我应该传递它的值e[e.selectedIndex].value。修复此缺陷后,对象表示法工作正常。
          猜你喜欢
          • 2021-04-09
          • 2016-06-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多