JQuery : 'Uncaught TypeError : Illegal invocation'at ajax request-여러 요소


112

두 가지 선택 요소 A와 B가 있습니다. A가 선택한 옵션이 변경되면 B의 옵션도 그에 따라 업데이트되어야합니다. A의 각 요소는 B의 많은 요소를 의미하며 일대 다 관계입니다 (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이벤트 에 함수 호출을 추가했습니다 . 다음은 onChange 이벤트 (of 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]
};

대신 데이터가 문자열이면 해당 오류가 발생하지 않습니다.

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의 답변을 확인 하십시오. HTML 요소를 전달하는 것이 문제를 일으키는 이유를 설명하기 위해 JQuery 문서를 인용합니다.


정확히 내가 뭘했는지. .val ()를 사용하는 것을 잊었다
우스만 샤우 카트

변수에서 선택 html 요소의 옵션을 전달했습니다. 일반 텍스트가 아니라 html이라는 것을 알지 못했습니다.
Sterling Diaz

46

에 대한 jQuery 문서에서 processData:

processData 부울
기본값 : true
기본적으로 데이터 옵션에 개체 (기술적으로 문자열 이외의 모든 항목)로 전달 된 데이터는 처리되어 기본 콘텐츠 유형 "application / x-www"에 맞는 쿼리 문자열로 변환됩니다. -form-urlencoded ". DOMDocument 또는 기타 처리되지 않은 데이터를 보내려면이 옵션을 false로 설정하십시오.

출처 : http://api.jquery.com/jquery.ajax

processData데이터를 서버로 보내거나 쿼리 문자열 인코딩 매개 변수를 지원하도록 PHP 스크립트를 수정하는 데 사용해야 할 것 같습니다 .


1
사실입니다. 내 코드의 실제 오류를 지적하기 전에 그것을 볼 수 있었다면. 감사합니다. 제 답변에 메모를 추가하겠습니다.
Nadir Sampaoli 2012-06-17

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', ))
디르 Sampaoli

@nadirs : $.ajax처리기 에서 메서드 유형을 정의 해보십시오 .type:'get',
Sarfraz

@Sarfraz 결과는 동일합니다. 서버 측, data키는 GET 배열에서 찾을 수 있어야합니다. 그렇죠? 아니면 어쨌든 다른 요청 방법을 통해 전송 될까요?
Nadir Sampaoli

@nadirs : 이런 식으로 작동합니다 data: {foo:'myfoo', bar:'mybar'}. 다른 문제가있을 수 있습니다.
Sarfraz 2012-06-17

@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

contentType및 두 개의 필드가 없으면 processData오류가 계속 표시됩니다. 나는 두 필드를 추가했고 그것은 나를 위해 일했습니다. op가 두 가지 중요한 필드를 나타내려고 한 것 같습니다.
Ekundayo Blessing Funminiyi

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

7
설명을 포함하면 답변이 더 유용합니다.
Jon 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.