2012-05-07 23 views
12

Was ist das am häufigsten verwendete Idiom für dieses jQuery-Snippet?jquery .val() + = idiom

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

Es fühlt sich klobig den ursprünglichen Code in einer einzeiligen Funktion

EDIT einzuwickeln: Also ich kann eine Funktion, passieren das ist cool ... aber meine wahren Absichten sind für jsfiddles, wo ich zur Zeit tun Sachen wie diese:

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

Sie wissen nicht, ob der Kontext unterschiedliche Antworten hervorrufen würde oder einfach nur ich wirklich faul machen scheine für den Wunsch, noch weniger zu geben als das. console.log zählt nicht, ich möchte das Textfeld.

+0

Nicht die Notwendigkeit, in jsfiddles zu arbeiten, aber ich mag die Idee der Erweiterung von jQuery mit einer 'appendVal (string)' Methode, die val() unter der Haube unter Vermeidung der klobigen Syntax desribed nutzt. –

Antwort

31

Verwenden Sie einfach nicht jQuery.

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

wird klarer, schneller und funktioniert so gut wie das jQuery-Snippet. Wenn Sie wirklich das $ Selektor, mit nur einem Element verwenden möchten, können Sie auch

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

Andere Möglichkeiten sind die .val() Verfahren mit einer Funktion

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

oder eine Variante mit .each() (das ist [fast ] entspricht dem, was val() führt intern für Text-Eingänge):

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

Diese brauchen beide eine einzeilige Funktion expressio n, die Sie nicht mögen, aber sie haben den Vorteil, dass sie für mehr als ein ausgewähltes Element arbeiten (und nicht für kein übereinstimmendes Element brechen), und sie geben auch das jQuery-Objekt zurück, um das Merkmal der Verkettung zu erhalten.

+4

Ich wünschte, ich könnte dies zweimal upvote - einmal für keine jquery, bevor ich bearbeitet, eine andere für die [0] Trick – gruntlr

+0

Völlig korrekt.+1 –

+0

@gruntlr & Bergi: Was macht der '[0]' Trick? – ajax333221

8

Sie eine Funktion übergeben können:

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

oder

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

oder

// mentioned by SLaks, JaredPar 

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

'val()' tut manchmal mehr als direkt auf die DOM 'value' -Eigenschaft zuzugreifen. –

+0

@AtesGoral es entfernt immer Wagenrückläufe und macht nur Magie, wenn das Element 'select' oder' option' ist. – Esailija

+0

Oder Sie können den sinnlosen zusätzlichen jQuery Konstruktor vermeiden, indem Sie 'val' richtig verwenden, wie in anderen Antworten dargestellt ... – lonesomeday

8

Ich weiß nicht, über idiomatische aber eine Möglichkeit, diese jQuery zu vereinfachen Ausdruck ist die Überladung von val, die ein Funktionsobjekt als Parameter akzeptiert. jQuery wird den alten Wert an die Funktion übergeben und Sie geben den neuen Wert zurück.

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

+1 für die detaillierte Erklärung –