2012-04-25 25 views
73

jQuery v1.7.2jQuery - invocación ilegal

tengo esta funcion que me está dando el siguiente error durante la ejecución:

Uncaught TypeError: Illegal invocation 

Aquí está la función:

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

Si Elimino data de la llamada ajax, funciona ... ¿Alguna sugerencia?

Gracias!

+0

Prueba quitando 'from' de datos. Tal vez está en conflicto con jquery de – gopi1410

+5

Te das cuenta de que intentas empujar los objetos jQuery, no JSON, ¿verdad? – asawyer

+8

Me sucede regularmente cuando olvido .val() en algún objeto jQuery ... – userfuser

Respuesta

84

Creo que debe tener cadenas como valores de datos. Es probable que algo dentro de jQuery no esté codificando/serializando correctamente el objeto a & desde objetos.

intento:

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

Nótese también en las líneas

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

que no es necesario el envoltorio como jQuery Para & Desde ya son objetos jQuery.

+2

Gracias, olvidé que había cargado objetos en lugar de cadenas, generalmente cargo cadenas :) – yoda

+3

Este enfoque me ayuda. Nombro mis variables como '$ from = $ ('# from');' Esto me ayuda a recordar que representa un objeto jQuery que ayuda a evitar llamar a un método en algo que es una cadena o tratar de manipular una cadena con '.toString () 'o algo cuando es un objeto jQuery. – timbrown

+0

Tenía la parte '.val()' faltante, por lo que no estaba pasando el valor. – SharpC

61

intenta establecer processData: falsa en entornos ajax como esto

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

¿Por qué funciona esto? – aandis

+3

'Por defecto, los datos pasados ​​a la opción de datos como un objeto (técnicamente, cualquier cosa que no sea una cadena) serán procesados ​​y transformados en una cadena de consulta, que se ajusta al tipo de contenido predeterminado" application/x-www-form- urlencoded ". Si desea enviar un DOMDocument u otros datos no procesados, establezca esta opción en falso. –

+0

Gracias funciona a la perfección. –

14

Sólo para que conste también puede ocurrir si se intenta utilizar variable no declarada en los datos como

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

¡Gracias por eso! Eso fue totalmente donde me bloqueaban. –

0

Mi el problema no estaba relacionado con processData. Fue porque envié una función que no se puede llamar más tarde con apply porque no tenía suficientes argumentos. Específicamente, no debería haber usado alert como la devolución de llamada error.

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

Ver esta respuesta para obtener más información sobre por qué eso puede ser un problema: Why are certain function calls termed "illegal invocations" in JavaScript?

La manera en que yo era capaz de descubrir este fue añadiendo un console.log(list[ firingIndex ]) a jQuery para que pudiera realizar un seguimiento de lo que estaba disparando.

Esta fue la solución:

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