JQuery: 'Uncaught TypeError: Illégal invocation" à la requête ajax lorsque les données de paramètre est la matrice de

j'ai deux éléments select, A et B: lorsque L'option sélectionnée de A change, les options de B doivent être mises à jour en conséquence. Chaque élément dans A implique de nombreux éléments dans B, c'est une relation un-à-plusieurs (A contient des nations, B devrait contenir des villes situées dans la nation donnée).

La fonction do_ajax doit exécuter la requête asynchrone:

function do_ajax(elem, mydata, filename)
{
    $.ajax({
        url: filename,
        context: elem,
        data: mydata,
        datatype: "html",
        success: function (data, textStatus, xhr) {
            elem.innerHTML = data;
        }
    });
}

afin de mettre à jour les options de B j'ai ajouté un appel de fonction dans onChange événement. Voici la fonction qui s'exécute lorsque l'événement onChange (de A ) est déclenché:

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

}

j'ai lu dans JQuery docs que data peut être un tableau (couples de valeurs clés). J'obtiens l'erreur si je mets:

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

à la place, Je ne reçois pas cette erreur si mes données sont une chaîne de caractères:

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

mais j'ai besoin de la "version Tableau" de la variable, dans mon code php côté serveur.

Le Uncaught TypeError: Illegal invocation est situé dans le "jquery 1.7.2.min.JS", qui est tout compressé, donc je ne pouvais pas comprendre quelle partie du code a soulevé l'erreur.

y a-t-il un paramètre que je puisse modifier dans mon code pour qu'il accepte les données comme un tableau associatif?

81
demandé sur Nadir Sampaoli 2012-06-17 15:53:56

8 réponses

grâce à l'entretien avec Sarfraz nous avons pu trouver la solution.

le problème était que je passais un élément HTML au lieu de sa valeur, ce qui est en fait ce que je voulais faire (en fait dans mon code php j'ai besoin de cette valeur comme une clé étrangère pour interroger ma table cities et filtrer les entrées correctes).

ainsi, au lieu de:

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

il devrait être:

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

Note: vérifiez la réponse de Jason Kulatunga 1519170920" , il cite jQuery doc pour expliquer pourquoi passer un élément HTML causait des problèmes.

114
répondu Nadir Sampaoli 2017-05-23 11:47:16

de jQuery docs pour processData :

processData Boolean

Default: true

Par défaut, les données transmises à l'option data en tant qu'objet (techniquement, tout ce qui n'est pas une chaîne de caractères) seront traitées et transformées en une chaîne de caractères d'interrogation, correspondant au type de contenu par défaut "application/x-www-form-urlencoded". Si vous voulez envoyer un DOMDocument, ou d'autres données non traitées, définissez cette option à false.

Source: http://api.jquery.com/jquery.ajax

semble que vous allez devoir utiliser processData pour envoyer vos données au serveur, ou modifier votre script php pour prendre en charge les paramètres encodés de querystring.

31
répondu Jason Kulatunga 2018-08-31 06:36:41

j'ai lu dans JQuery docs que les données peuvent être un tableau (paires de valeurs clés). J'obtiens l'erreur si je mets:

ceci est un objet et non un tableau:

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

Vous voulez probablement:

var data = [{
        'mode': 'filter_city',
        'id_A': e[e.selectedIndex]
}];
10
répondu Sarfraz 2012-06-17 11:57:29

a eu le même problème récemment, résolu en ajoutant traditional: true,

3
répondu deco 2017-04-10 15:21:52

j'ai eu cette erreur en affichant un objet FormData parce que je ne configurais pas correctement l'appel ajax. La configuration ci-dessous a réglé mon problème.

    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); 
            }
        });
1
répondu Mike Volmar 2018-01-29 15:35:40
$.ajax({
                    url:"",
                    type: "POST",
                    data: new FormData($('#uploadDatabaseForm')[0]),
                    contentType:false,
                    cache: false,
                    processData:false,
                    success:function (msg) {}
                  });
-1
répondu Nitin Sharma 2018-02-22 16:19:28

Essayez Ceci:

            $.ajax({
                    url:"",
                    type: "POST",
                    data: new FormData($('#uploadDatabaseForm')[0]),
                    contentType:false,
                    cache: false,
                    processData:false,
                    success:function (msg) {}
                  });
-2
répondu Ali Asad 2017-01-17 04:55:45
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;
        }
    });
}
-3
répondu Derly Pacheco 2018-08-23 19:14:16