jQuery - Yasadışı çağrı


108

jQuery v1.7.2

Yürütürken bana aşağıdaki hatayı veren bu işleve sahibim:

Uncaught TypeError: Illegal invocation

İşte fonksiyon:

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

dataAjax çağrısından çıkarırsam işe yarıyor .. herhangi bir öneri?

Teşekkürler!


fromverilerden kaldırmayı deneyin . Belki jquery ile çelişiyor
gopi1410

6
JSON'u değil jQuery nesnelerini itmeye çalıştığınızın farkındasınız değil mi?
asawyer

18
Bazı jQuery nesnelerinde .val () 'i unuttuğumda düzenli olarak başıma geliyor ...
userfuser

Yanıtlar:


118

Veri değerleri olarak dizelere sahip olmanız gerektiğini düşünüyorum. Muhtemelen jQuery içinde, Hedef ve Nesneleri doğru şekilde kodlamayan / serileştirmeyen bir şeydir.

Deneyin:

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

Satırlara da dikkat edin:

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

Kime ve Kimden zaten jQuery nesneleri olduğundan jQuery sarmalayıcısına ihtiyacınız yoktur.


2
Teşekkürler, dizeler yerine nesneler yüklediğimi unuttum, genellikle dizeleri
yüklerim

3
Bu yaklaşım bana yardımcı oluyor. Değişkenlerimi şu şekilde adlandırıyorum $from = $('#from');Bu, bir jQuery nesnesi olduğunda, bir dize olan bir şey üzerinde bir yöntemi çağırmaktan veya bir dizeyi .toString()veya başka bir şeyi değiştirmeye çalışmaktan kaçınmaya yardımcı olan bir jQuery nesnesini temsil ettiğini hatırlamama yardımcı oluyor .
timbrown

Ben .val()eksik parçanın, bu nedenle değer geçirerek değildi.
SharpC

109

Bunun gibi ajax ayarlarında processData: false ayarlamayı deneyin

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

Ayrıca eklemeniz gerekebilir contentType: false. Bir dosya yüklerken yaptım. Stackoverflow.com/questions/21044798/… sayfasına
khylo

18

Sadece kayıt için, verilerde bildirilmemiş değişken kullanmaya çalıştığınızda da olabilir.

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

1
Bunun için teşekkürler !! Bu tamamen engellendiğim yerdi.
Matt Zelenak

13

Dosya yüklerken Javascript FormData API kullanarak bir form göndermek istiyorsanız, aşağıdaki iki seçeneği belirlemeniz gerekir:

processData: false,
contentType: false

Aşağıdaki gibi deneyebilirsiniz:

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

Bu iki seçenek ne işe yarar, açıklayabilir misiniz?
rahim.nagori

2

Benim durumumda sadece değiştim

Not: Bu Django durumunda, ben de ekledim csrftoken. Sizin durumunuzda buna ihtiyacınız olmayabilir.

Eklendi contentType: false,processData: false

Yorum yaptı "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) => {

    }
})

-e

$.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) => {

    }
})

ve işe yaradı.


2

Benim durumumda, ajax'ta verilere aktardığım tüm değişkenleri tanımlamadım.

var page = 1;

$.ajax({
    url: 'your_url',
    type: "post",
    data: { 'page' : page, 'search_candidate' : search_candidate }
    success: function(result){
        alert('function called');
    }
)}

Değişkeni var search_candidate = "candidate name";ve onun çalışmasını tanımladım .

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

Benim sorunum ile ilgisizdi processData. Bunun nedeni apply, yeterli argümana sahip olmadığı için daha sonra çağrılamayacak bir işlev göndermemdi . Özellikle ben kullanmamalıydım alertolarak errorcallback'inde.

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

Bunun neden bir sorun olabileceği hakkında daha fazla bilgi için bu yanıta bakın: Neden bazı işlev çağrıları JavaScript'te "yasa dışı çağrılar" olarak adlandırılıyor?

Bunu keşfetme console.log(list[ firingIndex ])şeklim jQuery'ye bir eklemekti, böylece neyin ateşlendiğini izleyebildim.

Düzeltme buydu:

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

Benim durumumda (webpack 4 kullanarak), geri arama olarak kullandığım anonim bir işlev içinde.

Sahip olmama rağmen kullanmak window.$.ajax()yerine kullanmak zorunda kaldım $.ajax():

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

0

Ayrıca bu da bir nedendir: Bir jQuery koleksiyonu oluşturduysanız (.map () veya benzeri bir şey aracılığıyla) bu koleksiyonu .ajax () verilerinde kullanmamalısınız. Çünkü o hala bir jQuery nesnesi , düz JavaScript Dizisi değil . Düz js dizisini elde etmek için ve'de .get () kullanmalı ve .ajax () üzerindeki veri ayarlarında kullanmalısınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.