2012-01-28 23 views
10

Problema real para mí, porque no tengo ni idea de resolverlo.jQuery on ("pegar") por primera vez no captura ni pasa el valor

jQuery script que escribí debería capturar el valor de entrada en la acción "pegar" y pasarlo por ajax al controlador codeigniter.

En realidad funciona bien, pero solo si pego el valor por el segundo (y más) tiempo. Funciona bien también cuando cambio encendido ("pegar") a encendido ("tecleo") para algún div u otro elemento DOM.

Guión:

<script type="text/javascript"> 
$("#link").on("paste", function(){ 
$("#thumbs").empty().html("<p>loading</p>"); 
var postData = { 
    'url' : $("#link").val() 
}; 

$.ajax({ 
    type: "POST", 
    url: "/thumb/ajax/", 
    data: postData , //assign the var here 
    success: function(msg){ 
    $("#thumbs").html("Data Saved: " + msg); 
    } 

}); 

});

Cualquier ayuda se agradece

EDIT: una pista más.

val() en este script en particular realmente tiene valor antes la acción pasta. Si escribo algo en esta entrada, luego lo elimino y pego otra cosa, en realidad le pasaría al controlador el valor que escribí, no el que pegué.

EDIT2: Bien, estoy bastante seguro de que es un problema de jQuery con pegar.

<script type="text/javascript"> 

    $("#link").on("paste", function(){ 
     $("#thumbs").empty().html("<p>loading</p>"); 
     var postData = {'url' : $("#link").val() }; 
     $("#thumbs").html($("#link").val()); 
    }); 


</script> 

Este script debe agregar valor desde la entrada a div # thumbs. No sirve para la primera acción de pegar. En el segundo, en realidad funciona.

EDIT3: Mi amigo me dio una pista. on ("pegar") funciona a la derecha en la acción "pegar" y antes de que el pegado realmente esté hecho. Si alguien me da una pista de cómo hacer un tiempo de espera para tomar el valor después del engrudo, puedo continuar.

Respuesta

21

Problema resuelto.

Como dije antes, "on (" paste ")" la acción se está realizando directamente en la pasta real. Entonces la función se está haciendo antes de que el valor se pegue a la entrada. Eso es porque la primera vez que se pega, pasa y pasa el valor predeterminado de la entrada (nulo para mi ejemplo).

La solución es establecer el tiempo de espera. El código correcto se ve así y funciona bien.

$("#link").on("paste", function(){ 

setTimeout(function() { 
    $("#thumbs").html("<p>loading</p>"); 
    var postData = { 
     'url' : $("#link").val() 
     }; 
    $.ajax({ 
     type: "POST", 
     url: "/thumb/ajax/", 
     data: postData , //assign the var here 
     success: function(msg){ 
     $("#thumbs").html("Data Saved: " + msg); 
      $(".thumb").click(function(){ 
      (this).attr('id'); 


     }); 

     } 

    }); 
}, 500); 

});

Problema resuelto, gracias @ 3nigma para soporte.

+1

Ojalá hubiera visto esta publicación hace una hora. Jquery puedo tener esa hora de mi vida que acaba de perder ^^ – azzy81

+1

Debería poder hacer esto con el tiempo de espera establecido en 0 también. –

1

funciona muy bien aquí

DEMO

actualización:

tendrá que stringify el objeto con el fin de enviarlo al servidor, incluyen json2.js su código se verá así

$("#link").on("paste", function(){ 
$("#thumbs").empty().html("<p>loading</p>"); 
var postData = { 'url' : $("#link").val(), 'test' : 'testtest' }; 

    $.ajax({ 
     type: "POST", 
     url: "your/url", 
     data:JSON.stringify(postData), 
     success: function(msg){ 
     $("#thumbs").html("Data Saved: " ); 
     }   
     }); 
     }); 

aquí es un DEMO he incluido el json2.js fr om el cdn

+0

Tengo más profundo y añadí un objeto a Postdatum que ahora se ve así: var Postdatum = { 'url':. $ ("# Enlace") val(), 'prueba': 'testtest' } ; En la primera pega, solo la 'prueba' pasa al controlador, [url] está vacía. No tengo idea de cuál es el problema. – sznowicki

+0

@sznowicki ver las actualizaciones de respuestas – Rafay

+0

¿Por qué debería hacer eso? Si cambio encendido ("pegar") a encendido ("tecleo"), funciona bien cada vez. Pasa el valor de entrada al controlador de la manera correcta. Corrígeme si me equivoco. – sznowicki

1

Terminé usando 'oninput', que funciona bien a menos que necesite soportar IE8 o menos.

+0

Funcionó para mí Gracias @Roger –

Cuestiones relacionadas