jQuery - 非法调用

时间:2012-04-25 22:15:26

标签: jquery ajax post

jQuery v1.7.2

我有这个功能在执行时给出了以下错误:

Uncaught TypeError: Illegal invocation

这是功能:

$('form[name="twp-tool-distance-form"]').on('submit', function(e) {
    e.preventDefault();

    var from = $('form[name="twp-tool-distance-form"] input[name="from"]');
    var to = $('form[name="twp-tool-distance-form"] input[name="to"]');
    var unit = $('form[name="twp-tool-distance-form"] input[name="unit"]');
    var speed = game.unit.speed($(unit).val());

    if (!/^\d{3}\|\d{3}$/.test($(from).val()))
    {
        $(from).css('border-color', 'red');
        return false;
    }

    if (!/^\d{3}\|\d{3}$/.test($(to).val()))
    {
        $(to).css('border-color', 'red');
        return false;
    }

    var data = {
        from : from,
        to : to,
        speed : speed
    };

    $.ajax({
        url : base_url+'index.php',
        type: 'POST',
        dataType: 'json',
        data: data,
        cache : false
    }).done(function(response) {
        alert(response);
    });

    return false;
});

如果我从ajax调用中移除data,它是否有效..任何建议?

谢谢!

9 个答案:

答案 0 :(得分:104)

我认为您需要将字符串作为数据值。它可能是jQuery内部没有正确编码/序列化To& amp; amp; amp; amp;来自对象。

尝试:

var data = {
    from : from.val(),
    to : to.val(),
    speed : speed
};

另请注意:

$(from).css(...
$(to).css(

你不需要将jQuery包装器作为To& amp;来自已经是jQuery对象。

答案 1 :(得分:90)

尝试在像

这样的ajax设置中设置 processData:false
$.ajax({
    url : base_url+'index.php',
    type: 'POST',
    dataType: 'json',
    data: data,
    cache : false,
    processData: false
}).done(function(response) {
    alert(response);
});

答案 2 :(得分:17)

只是为了记录,如果您尝试在

等数据中使用未声明的变量,也会发生这种情况
var layout = {};
$.ajax({
  ...
  data: {
    layout: laoyut // notice misspelled variable name
  },
  ...
});

答案 3 :(得分:6)

如果您要使用Javascript FormData API提交带有上载文件的表单,则需要设置以下两个选项:

processData: false,
contentType: false

您可以尝试以下操作:

//Ajax Form Submission
$(document).on("click", ".afs", function (e) {
    e.preventDefault();
    e.stopPropagation();
    var thisBtn = $(this);
    var thisForm = thisBtn.closest("form");
    var formData = new FormData(thisForm[0]);
    //var formData = thisForm.serializeArray();

    $.ajax({
        type: "POST",
        url: "<?=base_url();?>assignment/createAssignment",
        data: formData,
        processData: false,
        contentType: false,
        success:function(data){
            if(data=='yes')
            {
                alert('Success! Record inserted successfully');
            }
            else if(data=='no')
            {
                alert('Error! Record not inserted successfully')
            }
            else
            {
                alert('Error! Try again');
            }
        }
    });
});

答案 4 :(得分:0)

我的问题与c无关。这是因为我发送了一个以后不能用processData调用的函数,因为它没有足够的参数。具体来说,我不应该使用apply作为alert回调。

error

有关可能出现问题的详细信息,请参阅此答案:Why are certain function calls termed "illegal invocations" in JavaScript?

我能够发现这一点的方法是向jQuery添加$.ajax({ url: csvApi, success: parseCsvs, dataType: "json", timeout: 5000, processData: false, error: alert }); ,以便我可以跟踪它正在触发的内容。

这是修复:

console.log(list[ firingIndex ])

答案 5 :(得分:0)

就我而言,我只是更改了

注意:这是在Django中的情况,因此我添加了csrftoken。就您而言,您可能不需要它。

  

添加了contentType: falseprocessData: false

     

评论了"Content-Type": "application/json"

$.ajax({
    url: location.pathname, 
    type: "POST",
    crossDomain: true,
    dataType: "json",
    headers: {
        "X-CSRFToken": csrftoken,
        "Content-Type": "application/json"
    },
    data:formData,
    success: (response, textStatus, jQxhr) => {

    },
    error: (jQxhr, textStatus, errorThrown) => {

    }
})

$.ajax({
    url: location.pathname, 
    type: "POST",
    crossDomain: true,
    dataType: "json",
    contentType: false,
    processData: false,
    headers: {
        "X-CSRFToken": csrftoken
        // "Content-Type": "application/json",
    },
    data:formData,
    success: (response, textStatus, jQxhr) => {

    },
    error: (jQxhr, textStatus, errorThrown) => {

    }
})

它奏效了。

答案 6 :(得分:0)

就我而言,我还没有定义要传递给ajax数据的所有变量。

var page = 1;

$.ajax({
    url: 'your_url',
    type: "post",
    data: { 'page' : page, 'search_candidate' : search_candidate }
    success: function(result){
        alert('function called');
    }
)}

我刚刚定义了变量var search_candidate = "candidate name";及其工作原理。

var page = 1;
var search_candidate = "candidate name"; // defined
$.ajax({
    url: 'your_url',
    type: "post",
    data: { 'page' : page, 'search_candidate' : search_candidate }
    success: function(result){
        alert('function called');
    }
)}

答案 7 :(得分:0)

在我使用匿名函数的情况下(使用webpack 4),我将其用作回调。

尽管有以下几点,我仍必须使用window.$.ajax()而不是$.ajax()

import $ from 'jquery';
window.$ = window.jQuery = $;

答案 8 :(得分:0)

这也是一个原因: 如果您构建了jQuery集合(通过.map()或类似的东西),则不应在.ajax()的数据中使用此集合。因为它仍然是 jQuery对象,而不是简单的 JavaScript数组。您应该在和处使用.get()来获取纯js数组,并应在.ajax()的数据设置上使用它。