2012-05-07 18 views
12

Qual è l'idioma più comunemente usato per questo frammento jQuery?jquery .val() + = idioma

$('#someTextarea').val($('#someTextarea').val() + someString); 

Ci si sente goffo per avvolgere il codice originale in una funzione di una sola riga

EDIT: Così posso passare una funzione, che è fresco ... ma le mie vere intenzioni sono per jsfiddles, dove ho attualmente fare cose come questa:

function lazylog (str) { 
    $('#ta').val($('#ta').val() + str + '\n'); 
} 
// or 
function lazylogPlain (str) { 
    document.getElementById('ta').value += str + '\n'; 
} 

// view results of little experiments 
lazylog(test1()); 
lazylog(test2()); 
lazylog(test3()); 
// etc... 

non so se quel contesto avrebbe prodotto risposte diverse o semplicemente farmi sembrare davvero pigro per voler digitare anche meno. console.log non conta, voglio la textarea.

+0

Non risolve la necessità di lavorare in jsfiddles, ma mi piace l'idea di estendere jQuery con un metodo 'appendVal (string)' che sfrutta val() sotto il cofano evitando la sintassi goffa descritta. –

risposta

31

Semplicemente non utilizzare jQuery.

document.getElementById('someTextarea').value += someString; 

sarà più chiaro, più veloce e funziona come lo snippet di jQuery. Se davvero si vuole utilizzare il selettore $, con un solo elemento si può anche

$('#someTextarea')[0].value += someString; // least to type 

Altre possibilità sono il metodo .val() con una funzione

$('#someTextarea').val(function(index, oldValue) { return oldValue + someString; }) 

o una variante con .each() (che è [quasi ] equivalente a quello val() fa internamente per ingressi di testo):

$('#someTextarea').each(function(){ this.value += someString; }) 

questi devono entrambi una funzione expressio sola riga Non ti piaceva, ma hanno il vantaggio di lavorare per più di un elemento selezionato (e non di rompere per nessun elemento abbinato) e restituiscono anche l'oggetto jQuery per preservare la funzionalità di concatenazione.

+4

desidero potrei passare questo due volte - una volta senza jquery prima di modificare, un altro per il trucco [0] – gruntlr

+0

Completamente corretto.+1 –

+0

@gruntlr & Bergi: cosa sta facendo il trucco '[0]'? – ajax333221

8

È possibile passare una funzione:

$(...).val(function(index, old) { return old + whatever; }); 
1
$('#someTextarea').val(function() { 
    return this.value + something; 
}); 

o

$('#someTextarea').val(function() { 
    return $(this).val() + something; 
}); 

o

// mentioned by SLaks, JaredPar 

$('#someTextarea').val(function(i, oldVal) { 
    return oldVal + something; 
}); 
+1

'val()' a volte fa più che accedere direttamente alla proprietà 'valore' DOM. –

+0

@AtesGoral rimuove sempre i ritorni a capo e fa magia solo quando l'elemento è 'select' o' option' – Esailija

+0

Oppure puoi evitare l'inutile costruttore jQuery extra usando 'val' correttamente, come illustrato in altre risposte ... – lonesomeday

8

Non so circa idiomatica, ma un modo per semplificare questo jQuery espressione è utilizzare il sovraccarico di val che accetta un oggetto funzione come parametro. jQuery passerà il vecchio valore alla funzione e si passerà il nuovo valore.

$('#someTextarea').val(function(_, oldValue) { return oldValue + something; }); 
+0

+1 per la spiegazione dettagliata –