jQuery-不正な呼び出し


107

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

dataajax呼び出しから削除した場合、機能します。

ありがとう!


fromデータから削除してみてください。多分それはjQueryのからと競合して
gopi1410

6
JSONではなく、jQueryオブジェクトをプッシュしようとしていることに気付きましたか?
asawyer

18
一部のjQueryオブジェクトで.val()を忘れたとき、私に定期的に起こります...
userfuser

回答:


117

データ値として文字列が必要だと思います。これは、jQueryの内部で、ToおよびFromオブジェクトを正しくエンコード/シリアライズしていない可能性があります。

試してください:

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

次の行にも注意してください。

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

To&FromはすでにjQueryオブジェクトであるため、jQueryラッパーは必要ありません。


2
おかげで、文字列ではなくオブジェクトを読み込んだことを忘れて
しまいました。

3
このアプローチは私に役立ちます。変数に名前を付けます。$from = $('#from');これは、jQueryオブジェクトを表していることを思い出すのに役立ちます。これは、文字列であるものに対してメソッドを呼び出し.toString()たり、jQueryオブジェクトであるときに何かを使用して文字列を操作したりすることを回避するのに役立ちます。
ティムブラウン、2013

.val()一部欠けていたので、値を渡していない。
SharpC、2015年

109

このようなajax設定でprocessData:falseを設定してみてください

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

8
By default, data passed in to the data option as an object (technically, anything other than a string) will be processed and transformed into a query string, fitting to the default content-type "application/x-www-form-urlencoded". If you want to send a DOMDocument, or other non-processed data, set this option to false.
BOTJr。

追加する必要がある場合もありcontentType: falseます。ファイルをアップロードするときに行った。stackoverflow.com/questions/21044798/…を
khylo

18

記録のためだけに、宣言されていない変数をデータで使用しようとした場合にも発生する可能性があります

var layout = {};
$.ajax({
  ...
  data: {
    layout: laoyut // notice misspelled variable name
  },
  ...
});

1
ありがとうございます!! それは完全に私がブロックされていた場所でした。
Matt Zelenak、2015

13

ファイルをアップロードするJavaScript FormData APIを使用してフォームを送信する場合は、以下の2つのオプションを設定する必要があります。

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

これらの2つのオプションは何をしていますか、説明できますか?
rahim.nagori

2

私の場合、私はちょうど変わりました

注:これは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) => {

    }
})

そしてそれは働いた。


2

私の場合、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');
    }
)}

0

私の問題はとは無関係でしたprocessDataapply十分な引数がなかったため、後で呼び出すことができない関数を送信したためです。具体的にはalerterrorコールバックとして使用するべきではありませんでした。

$.ajax({
    url: csvApi,
    success: parseCsvs,
    dataType: "json",
    timeout: 5000,
    processData: false,
    error: alert
});

これが問題になる理由の詳細については、この回答を参照してください。JavaScriptで特定の関数呼び出しが「不正な呼び出し」と呼ばれるのはなぜですか?

console.log(list[ firingIndex ])これを見つけることができた方法は、jQueryにa を追加して、何が起動しているかを追跡できるようにすることでした。

これは修正でした:

function myError(jqx, textStatus, errStr) {
    alert(errStr);
}

$.ajax({
    url: csvApi,
    success: parseCsvs,
    dataType: "json",
    timeout: 5000,
    error: myError // Note that passing `alert` instead can cause a "jquery.js:3189 Uncaught TypeError: Illegal invocation" sometimes
});

0

私の場合(webpack 4を使用して)匿名関数内で、コールバックとして使用していました。

私が持っているwindow.$.ajax()にも$.ajax()かかわらず、代わりに使用する必要がありました:

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

0

これも原因です。jQueryコレクションを(.map()または同様の方法で)作成した場合、このコレクションを.ajax()のデータで使用しないでください。それはまだjQueryオブジェクトであるため、単純なJavaScript配列ではありません。で.get()を使用してプレーンなjs配列を取得し、それを.ajax()のデータ設定で使用する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.