jQuery - Незаконне виклик


108

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з дзвінка Ajax, він працює .. якісь пропозиції?

Дякую!


спробуйте видалити fromдані. Можливо, це суперечить jquery's від
gopi1410

6
Ви усвідомлюєте, що намагаєтеся натиснути об’єкти jQuery, а не JSON?
asawyer

18
У мене трапляється регулярно, коли я забуваю .val () на якому-небудь об’єкті jQuery ...
userfuser

Відповіді:


118

Я думаю, вам потрібно мати рядки як значення даних. Це, ймовірно, щось всередині jQuery, що не кодує / серіалізує правильно об'єкти «До і від».

Спробуйте:

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

Також зверніть увагу на рядки:

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

Вам не потрібна обгортка jQuery, оскільки To & From - це вже об’єкти jQuery.


2
Дякую, забув, що я завантажував об'єкти замість рядків, зазвичай завантажую рядки :)
yoda

3
Такий підхід мені допомагає. Я називаю свої змінні таким $from = $('#from');чином, що допомагає мені запам'ятати, що він являє собою об'єкт jQuery, який допомагає уникнути виклику методу на щось, що є рядком, або намагається маніпулювати рядком .toString()або чимось, коли це об'єкт jQuery.
тимбровен

У мене .val()частина відсутня, тому вона не передавала значення.
SharpC

109

Спробуйте встановити processData: false у таких налаштуваннях ajax

$.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
Дякую за це!! Тотально там мене заблокували.
Метт Зеленак

13

Якщо ви хочете надіслати форму за допомогою API Javascript FormData з завантаженням файлів, вам потрібно встановити нижче два варіанти:

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

Чим ви пояснюєте ці два варіанти?
rahim.nagori

2

У моєму випадку я просто змінився

Примітка. Це у випадку з Джанго, тому я додав 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) => {

    }
})

і це спрацювало.


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

Моя проблема не стосувалася processData. Це було тому, що я надіслав функцію, яку пізніше не можна викликати, тому applyщо у неї було недостатньо аргументів. Зокрема, я не повинен був використовуватись alertяк errorзворотний дзвінок.

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

Дивіться цю відповідь для отримання додаткової інформації про те, чому це може бути проблемою: Чому певні функціональні дзвінки в JavaScript називаються "незаконними викликами"?

Те, як я зміг це виявити, додав console.log(list[ firingIndex ])jQuery, щоб я міг відслідковувати те, що він стріляв.

Це було виправлення:

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 ().

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.