JQuery:ajax请求时出现“未捕获的类型错误:非法调用”-几个元素

问题描述 投票:0回答:13

我有两个选择元素,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
13个回答
183
投票

感谢与 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 元素会引起麻烦。


75
投票

我在发布 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); 
    }
});

53
投票

来自

processData
的 jQuery 文档:

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

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

看起来您将不得不使用

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


13
投票

我在 JQuery 文档中读到数据可以是数组(键值对)。 如果输入以下内容,则会出现错误:

这是对象而不是数组:

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

您可能想要:

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

11
投票

最近遇到了同样的问题,通过添加

traditional: true,

解决了

9
投票

请按照以下步骤解决此问题:

$.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 这两行。你的问题将会得到解决。


6
投票

我遇到了同样的问题,我可以按如下方式纠正它。

var formData = new FormData(document.getElementById('form_id'));
                                
$.ajax({
  type: 'POST',
  url: '/Settings/de_acc',
  data: formData,
  cache: false,
  contentType: false,
  processData: false,
  success: function(res){
    console.log(res);
  }
})

3
投票

我的

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


0
投票
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;
        }
    });
}

0
投票

Ajax 不允许使用 JSON 对象作为数据。使用

JSON.stringify()
可能会解决该问题。像这样的东西:

function do_ajax(elem, mydata, filename)
{
    $.ajax({
        url: filename,
        context: elem,
        data: JSON.stringify(mydata), //Here's the change
        datatype: "html",
        success: function (data, textStatus, xhr) {
            elem.innerHTML = data;
        }
    });
}

0
投票

JQUERY 更改: 在你的 JQUERY 上,你需要将其放入以使你的数据作为数组发送

JSON.stringify(yourArr);

Laravel 变更: 那么你需要在你的 LARAVEL 控制器上执行此操作才能正确获取数组(就像 php 数组一样):

json_decode($request->theArray);

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

-2
投票

试试这个:

            $.ajax({
                    url:"",
                    type: "POST",
                    data: new FormData($('#uploadDatabaseForm')[0]),
                    contentType:false,
                    cache: false,
                    processData:false,
                    success:function (msg) {}
                  });
© www.soinside.com 2019 - 2024. All rights reserved.