2012-01-28 9 views
10

Un vero problema per me, perché non ho idea di come risolverlo.jQuery su ("incolla") per la prima volta non afferra o supera il valore

jQuery script che ho scritto dovrebbe prendere il valore di input sull'azione "incolla" e passarlo da ajax al controller codeigniter.

In realtà funziona correttamente, ma solo se si incolla il valore per la seconda (e successiva) ora. Funziona bene anche quando cambio ("incolla") su on ("clic") per alcuni div o altri elementi DOM.

Script:

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

}); 

});

Qualsiasi aiuto sarebbe apprezzato

EDIT: un altro suggerimento.

val() in questo script specifico assume effettivamente il valore prima dell'azione. Se scrivo qualcosa a questo input, quindi lo rimuovo e incollo qualcos'altro, in realtà passerebbe al controller il valore che ho scritto, non quello che ho incollato.

EDIT2: OK, sono abbastanza sicuro che si tratta di un problema di jQuery con Incolla.

<script type="text/javascript"> 

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


</script> 

Questo script dovrebbe aggiungere valore dall'input a div # pollici. Non fa per la prima azione di incolla. Al secondo posto funziona davvero.

EDIT3: Il mio amico mi ha dato un suggerimento. on ("incolla") funziona proprio sull'azione "incolla" e prima che l'incolla sia effettivamente eseguita. Se qualcuno mi dà un suggerimento su come fare un timeout per prendere il valore dopo la pasta posso andare avanti.

risposta

21

Problema risolto.

Come ho detto prima, "l'azione (" incolla ")" viene eseguita proprio sulla pasta effettiva. Quindi la funzione viene eseguita prima che il valore venga incollato all'input. Questo perché la pasta prima volta prende e passa il valore predefinito dell'input (null per il mio esempio).

Soluzione è impostare il timeout. Il codice giusto sembra così e funziona bene.

$("#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 risolto, grazie @ 3nigma per il supporto.

+1

Vorrei aver visto questo post un'ora fa. Jquery posso avere quell'ora indietro della mia vita che hai appena sprecato ^^ – azzy81

+1

Dovresti riuscire a farlo anche con il timeout impostato su 0. –

1

funziona bene qui

DEMO

aggiornamento:

si dovrà stringify l'oggetto al fine di inviare al server, includere json2.js il codice sarà simile

$("#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: " ); 
     }   
     }); 
     }); 

qui è un DEMO ho incluso il json2.js fr om the cdn

+0

ho ottenuto più profondo e ha aggiunto un oggetto a postData che ora assomiglia a questo: var postData = { 'url':. $ ("# Collegamento") val(), 'test': 'testtest' } ; Sulla prima incolla solo il 'test' passa al controller, [url] è vuoto. Non ho idea di quale sia il problema. – sznowicki

+0

@sznowicki vedere la risposta aggiornamenti – Rafay

+0

Perché dovrei farlo? Se cambio su ("incolla") su on ("clic") funziona bene ogni volta. Passa il valore di input al controller in modo corretto. Correggimi se sbaglio. – sznowicki

1

Ho finito per utilizzare "oninput", che funziona bene a meno che non sia necessario supportare IE8 o inferiore.

+0

Ha funzionato per me Grazie a @Roger –

Problemi correlati