IT-Swarm.Net

jQuery-잘못된 호출

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

아약스 호출에서 data을 제거하면 작동합니다 .. 어떤 제안?

감사!

93
yoda

데이터 값으로 문자열이 필요하다고 생각합니다. jQuery 내부에서 To & From 객체를 올바르게 인코딩/직렬화하지 않는 것일 수 있습니다.

시험:

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

라인에도 주목하십시오 :

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

To & From은 이미 jQuery 객체이므로 jQuery 래퍼가 필요하지 않습니다.

109
LessQuesar

이와 같은 아약스 설정에서 processData : false을 설정하십시오.

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

레코드의 경우와 같이 데이터에 선언되지 않은 변수를 사용하려고하면 발생할 수 있습니다

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

파일을 업로드하는 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');
            }
        }
    });
});
7
Bablu Ahmed

제 경우에는 데이터에 아약스로 전달되는 모든 변수를 정의하지 않았습니다.

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
rajesh kharatmol

내 문제는 processData과 (와) 관련이 없습니다. 인수가 충분하지 않기 때문에 나중에 apply으로 호출 할 수없는 함수를 보냈기 때문입니다. 특히 alerterror 콜백으로 사용해서는 안됩니다.

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

이것이 왜 문제가 될 수 있는지에 대한 자세한 내용은이 답변을 참조하십시오. 특정 함수 호출이 JavaScript에서 "불법 호출"이라고 불리는 이유는 무엇입니까?

내가 이것을 발견 할 수있는 방법은 jQuery에 console.log(list[ firingIndex ])을 추가하여 발생하는 것을 추적 할 수있었습니다.

이것이 수정되었습니다.

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
ubershmekel

제 경우에는 방금 바뀌 었습니다

참고 : 이것은 장고의 경우이므로 csrftoken을 추가했습니다. 귀하의 경우에는 필요하지 않을 수 있습니다.

contentType: false, processData: 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) => {

    }
})

그리고 효과가있었습니다.

0
hygull