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
от ajax call, все работает.. есть предложения?
Спасибо!
12 ответов
Я думаю, вам нужно иметь строки в качестве значений данных. Скорее всего, это что-то внутри JQuery, которое неправильно кодирует / сериализует объекты To & From.
Пытаться:
var data = {
from : from.val(),
to : to.val(),
speed : speed
};
Обратите внимание также на строки:
$(from).css(...
$(to).css(
Вам не нужна оболочка jQuery, поскольку To & From уже являются объектами jQuery.
Попробуйте установить processData: false в настройках Ajax, как это
$.ajax({
url : base_url+'index.php',
type: 'POST',
dataType: 'json',
data: data,
cache : false,
processData: false
}).done(function(response) {
alert(response);
});
Пожалуйста, попробуйте следующее:
//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! Data inserted successfully');
}
else if(data=='no')
{
alert('Error! Data not inserted successfully')
}
else
{
alert('Error! Try again');
}
}
});
});
Если вы хотите отправить форму, используя Javascript FormData API с загрузкой файлов, вам нужно установить следующие два параметра:
processData: false,
contentType: false
Просто для записи, это также может произойти, если вы попытаетесь использовать необъявленную переменную в таких данных, как
var layout = {};
$.ajax({
...
data: {
layout: laoyut // notice misspelled variable name
},
...
});
В моем случае я просто изменил
Примечание. Это относится к Django, поэтому я добавил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) => {
}
})
и это сработало.
В моем случае я не определяю все переменные, которые я передаю данным в 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');
}
)}
Работает на меня.processData: false,contentType: false, требуется для работы.
var formData = new FormData($('#author_post')[0]);
formData.append('t','author-add');
$.ajax({
type: 'POST',
url: 'url-here',
cache: false,
processData: false,
contentType: false,
data:formData,
success: function(response) {
//success code
}
});
Вот некоторый рабочий пример кода:
let formData = new FormData($("#formId")[0]);
$.ajax({
url: "/api/v1/save-data",
type: "POST",
enctype: "multipart/form-data",
dataType: "json",
data: formData,
success: function(data) {
console.log(data);
},
cache: false,
contentType: false,
processData: false,
error: function() {
console.log("Error");
}
});
Также это является причиной: если вы создали коллекцию jQuery (через.map() или что-то подобное), вам не следует использовать эту коллекцию в данных.ajax(). Потому что это все еще объект jQuery, а не простоймассив JavaScript. Вы должны использовать.get () в и, чтобы получить простой массив js, и должны использовать его для настройки данных в.ajax().
В моем случае (с использованием webpack 4) в анонимной функции, которую я использовал в качестве обратного вызова.
Мне пришлось использовать window.$.ajax()
вместо того $.ajax()
несмотря на наличие:
import $ from 'jquery';
window.$ = window.jQuery = $;
Моя проблема не была связана с 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
});
Проблема здесь в том, что вы передаете входной объект в качестве данных в ajax следующим образом:
$('form[name="twp-tool-distance-form"] input[name="from"]')
Итак, вам нужно передать входное значение следующим образом:
$('form[name="twp-tool-distance-form"] input[name="from"]').val()