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) {} });