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अजाक्स कॉल से हटाता हूं , तो यह काम करता है .. कोई सुझाव?

धन्यवाद!


fromडेटा से हटाने का प्रयास करें। शायद यह jquery के साथ संघर्ष कर रहा है
gopi1410

6
आपको लगता है कि jQuery ऑब्जेक्ट्स को पुश करने की आपकी कोशिश, JSON सही नहीं है?
asawyer

18
कुछ jQuery की वस्तु पर .val () भूल जाने पर मुझे नियमित रूप से प्राप्त होता है ...
userfuser

जवाबों:


118

मुझे लगता है कि आपको डेटा मान के रूप में स्ट्रिंग्स की आवश्यकता है। यह jQuery के भीतर आंतरिक रूप से कुछ होने की संभावना है जो ऑब्जेक्ट्स से एन्कोडिंग को सही ढंग से एन्कोडिंग / सीरियल करना नहीं है।

प्रयत्न:

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

नोटिस भी तर्ज पर:

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

आपको jQuery आवरण की आवश्यकता नहीं है क्योंकि To और From पहले से ही jQuery ऑब्जेक्ट हैं।


2
धन्यवाद, भूल गया कि मैंने तारों के बजाय वस्तुओं को लोड किया था, आमतौर पर मैं तारों को लोड करता हूं :)
22:31

3
यह दृष्टिकोण मेरी मदद करता है। मैं अपने चरों का नाम देता हूं क्योंकि $from = $('#from');यह मुझे याद रखने में मदद करता है कि यह एक jQuery ऑब्जेक्ट का प्रतिनिधित्व करता है जो एक ऐसी चीज पर कॉल करने से बचने में मदद करता है जो एक स्ट्रिंग है .toString()या जब यह jQuery ऑब्जेक्ट के साथ किसी स्ट्रिंग को हेरफेर करने की कोशिश कर रहा है ।
टिम्ब्रोएन

मेरे पास .val()हिस्सा गायब था, इसलिए यह मूल्य नहीं था।
शार्प

109

प्रक्रिया सेट करने का प्रयास करें : इस तरह अजाक्स सेटिंग्स में झूठा

$.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

यदि आप जावास्क्रिप्ट फॉरमैट एपीआई का उपयोग कर एक फॉर्म सबमिट करना चाहते हैं, तो उन फ़ाइलों को अपलोड करने के लिए जिन्हें आपको दो विकल्पों के नीचे सेट करने की आवश्यकता है:

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

मेरे मामले में, मैं बस बदल गया

नोट: यह 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) => {

    }
})

और यह काम किया।


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

इस समस्या के बारे में अधिक जानकारी के लिए यह उत्तर देखें: कुछ फ़ंक्शन को जावास्क्रिप्ट में "अवैध इनवोकेशन" क्यों कहा जाता है?

जिस तरह से मैं इसे खोजने में सक्षम था वह एक 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

मेरे मामले में (वेबपैक 4 का उपयोग करके) एक अनाम फ़ंक्शन के भीतर, जिसे मैं कॉलबैक के रूप में उपयोग कर रहा था।

मेरे पास होने window.$.ajax()के $.ajax()बावजूद उपयोग करना था :

import $ from 'jquery';
window.$ = window.jQuery = $;

0

यह भी एक कारण है: यदि आपने एक jQuery संग्रह (.map) (या कुछ इसी तरह का) बनाया है, तो आपको यह संग्रह inajax () डेटा में नहीं करना चाहिए। क्योंकि यह अभी भी एक jQuery ऑब्जेक्ट है , सादे जावास्क्रिप्ट ऐरे नहीं । आपको सादे js सरणी में .get () का उपयोग करना चाहिए और इसे .ajax () पर डेटा सेटिंग पर उपयोग करना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.