2012-05-07 26 views
12

¿Cuál es la expresión más clara utilizada comúnmente para este fragmento de jQuery?jquery .val() + = idioma

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

Se siente torpe para envolver el código original en función de una línea

EDIT: Para que pueda pasar una función, lo cual es genial ... pero mis intenciones son reales para jsfiddles, donde Actualmente hacer cosas como esta:

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

no sabemos si ese contexto produciría respuestas diferentes o simplemente hacer que me parece muy vago para querer escribir incluso menos que eso. console.log no cuenta, quiero el área de texto.

+0

No soluciona la necesidad de trabajar en jsfiddles, pero me gusta la idea de extender jQuery con un método 'appendVal (string)' que aprovecha val() bajo el capó mientras se evita la sintaxis torpe descrita. –

Respuesta

31

Simplemente no use jQuery.

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

será más claro, más rápido y funciona tan bien como el fragmento de jQuery. Si realmente desea utilizar el selector $, con un solo elemento puede también

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

Otras posibilidades son el método .val() con una función

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

o una variante con .each() (que es [casi ] equivalente a lo que val() hace internamente para las entradas de texto):

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

Ambos necesitan una función expressio de una línea n no le gustó, pero tienen la ventaja de trabajar para más de un elemento seleccionado (y no romper para ningún elemento coincidente) y también devuelven el objeto jQuery para conservar la función de chainable.

+4

desearía poder votar esto dos veces: una vez por ningún jquery antes de editar, otra por el truco [0] – gruntlr

+0

Completamente correcto.+1 –

+0

@gruntlr & Bergi: ¿qué está haciendo el truco '[0]'? – ajax333221

8

Puede pasar una función:

$(...).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 veces hace más que acceder directamente a la propiedad DOM 'value'. –

+0

@AtesGoral siempre elimina los retornos de carro y solo hace magia cuando el elemento es 'select' o' option' – Esailija

+0

O puede evitar el constructor jQuery extra sin sentido usando 'val' correctamente, como se ilustra en otras respuestas ... – lonesomeday

8

No sé sobre idiomática, sino una manera de simplificar este jQuery expresión es usar la sobrecarga de val que toma un objeto de función como parámetro. jQuery pasará el valor anterior a la función y devolverá el nuevo valor.

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

+1 para la explicación detallada –

Cuestiones relacionadas