jQuery:ajaxリクエストでの「Uncaught TypeError:Illegal invocation」-いくつかの要素


112

AとBの2つの選択要素があります。Aの選択されたオプションが変更されると、それに応じてBのオプションを更新する必要があります。Aの各要素はBの多くの要素を意味します。これは1対多の関係です(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イベントに関数呼び出しを追加しました。これは、(のA)onChangeイベントがトリガーされたときに実行される関数です。

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

代わりに、データが文字列の場合、そのエラーは発生しません。

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

しかし、サーバー側のphpコードに、変数の「配列バージョン」が必要です。

Uncaught TypeError: Illegal invocationは「jquery-1.7.2.min.js」ファイルにあり、すべて圧縮されているため、コードのどの部分でエラーが発生したのかわかりませんでした。

データを連想配列として受け入れるようにコードで変更できる設定はありますか?

回答:


151

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の回答を確認してください。JQuery ドキュメントを引用して、HTML要素を渡すと問題が発生する理由を説明しています。


まさに私がやっていたこと。.val()の使用を忘れた
Usman Shaukat

変数で選択したhtml要素のオプションを渡していました。プレーンテキストではなくhtmlであることに気付きませんでした。
スターリングディアス

46

のjQueryドキュメントからprocessData

processDataブール値
デフォルト:true
デフォルトでは、データオプションにオブジェクトとして渡されたデータ(技術的には文字列以外のもの)が処理され、クエリ文字列に変換され、デフォルトのコンテンツタイプ "application / x-www"に適合します。 -form-urlencoded "。DOMDocumentまたはその他の未処理データを送信する場合は、このオプションをfalseに設定します。

ソース:http : //api.jquery.com/jquery.ajax

を使用processDataしてデータをサーバーに送信するか、phpスクリプトを変更してクエリ文字列でエンコードされたパラメーターをサポートする必要があるようです。


1
これは本当です。前にそれを見ることができたとしたら、コードの実際のエラーを指摘していたでしょう。おかげで、私は私の答えにメモを追加します。
Nadir Sampaoli

25

私はajax呼び出しを正しく設定していなかったため、FormDataオブジェクトの投稿中にこのエラーが発生しました。以下の設定で問題が解決しました。

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

ありがとう。uは私の日を節約し、私のajax本文に "processData:false、contentType:false、cache:false"を追加することで私の問題は解決されました。どうもありがとう。
CumaTekin

11

データを配列(キーと値のペア)にすることができることをJQueryドキュメントで読みました。私が置くとエラーが出ます:

これは配列ではなくオブジェクトです:

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

あなたはおそらく欲しい:

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

1
それはもはやそのエラーをスローしませんが、このデータは私の$_GETサーバー側に渡されていないようです(var_export($_GET)出力array ( 'undefined' => 'undefined', )
Nadir Sampaoli

@nadirs:$.ajaxハンドラーでメソッドタイプを定義してみてください:type:'get',
Sarfraz

@Sarfraz結果は同じです。サーバー側では、dataキーはGET配列にありますよね?または、とにかくそれらは別のリクエストメソッドを介して送信されますか?
Nadir Sampaoli 2012年

@nadirs:このようなものは動作しdata: {foo:'myfoo', bar:'mybar'}ますが、他にも問題があると思います。
Sarfraz

@Sarfraz私はばかです、私はe[e.selectedIndex]その値を渡すべきだったのにHTMLオブジェクトを送信していましたe[e.selectedIndex].value。この欠陥を修正した後、オブジェクト表記は正常に機能します。
Nadir Sampaoli

7

最近同じ問題があり、追加することで解決しました traditional: true,


これは実際に機能しますが、最近のブラウザのみを想定しています
barnacle.m

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

4
良い答えは、単にコードスニペット以上のものです。なぜこれが最初の質問に答えるかを説明し、可能な場合は関連ドキュメントへのリンクを提供する必要があります。
JSTL

二つのフィールドがなければcontentTypeprocessData、エラーが表示し続けます。2つのフィールドを追加したところ、うまくいきました。opは2つの重要なフィールドを示すことを試みていたと思います。
Ekundayo Blessing Funminiyi

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

7
説明を含めると、回答がより役立ちます。
ジョンB

-2

これを試して:

            $.ajax({
                    url:"",
                    type: "POST",
                    data: new FormData($('#uploadDatabaseForm')[0]),
                    contentType:false,
                    cache: false,
                    processData:false,
                    success:function (msg) {}
                  });
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.