JQuery:当数据参数是数组时,在Ajax请求中'Uncaught TypeError:Illegal invocation'

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

函数do_ajax应该运行asynchronous请求:

 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文档 , data可以是一个数组(键值对)。 我得到的错误,如果我把:

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

相反,如果我的数据是一个string,我不会得到这个错误:

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

但是我需要variables的“数组版本”,在我的服务器端PHP代码中。

Uncaught TypeError: Illegal invocation位于“jquery-1.7.2.min.js”文件中,全部压缩,所以我找不出哪部分代码会引发错误。

有什么设置我可以改变我的代码,以便它接受数据作为关联数组?

感谢与Sarfraz的谈话,我们可以找出解决scheme。

问题是我正在传递一个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的答案 ,它引用了JQuery doc来解释为什么传递HTML元素导致麻烦。

从processData的jquery文档:

processData布尔值
默认值:true
默认情况下,作为对象传递给数据选项的数据(技术上,除了string以外的任何东西)将被处理并转换为查询string,以适应默认的内容types“application / x-www-form-urlencoded” 。 如果要发送DOMDocument或其他未处理的数据,请将此选项设置为false。

看起来你将不得不使用processData将数据发送到服务器,或者修改你的PHP脚本来支持查询string编码参数。

我读过JQuery文档,数据可以是一个数组(键值对)。 我得到的错误,如果我把:

这不是一个数组对象:

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

你可能想要:

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

最近有同样的问题,通过添加traditional: true,解决traditional: true,

尝试这个:

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