2011-12-12 17 views
5

Bazı jQuery öğrenmeye çalışıyorum ve ben kurulum aşağıdaki kodla bir test sayfası:jQuery ile acil seçici nesnelere bakın.

<a id='encode' href='javascript: void(0)'>encode</a> | 
<a id='decode' href='javascript: void(0)'>decode</a> | 
<br/> 
<textarea id='randomString' cols='100' rows='5'></textarea> 

<script type='text/javascript'> 
$(document.ready(function() { 
    $('#encode').click(function() { 
    $('#randomString').val(escape($('#randomString').val())); 
    }); 
    $('#decode').click(function() { 
    $('#randomString').val(unescape($('#randomString').val())); 
    });  
}); 
</script> 

fikri ben textarea şey koymak ve "kodlamak" veya "kod çözmeyi" ya tıklayabilirsiniz olduğunu ve textarea'ya ne koyduğum ya da kaçacağım.

Bu kod düzgün çalışıyor, ancak sorumun textarea değerini nasıl değiştirdiğim ile ilgili olması gerekiyor. Benim kodumda, textarea değerini iki kere seçiyorum: bir kere kaçış (un) ve bir kez daha değeri değiştirmek için. IMO bu tıknaz ve belki de gereksiz görünüyor. bu yüzden bunu başvurmak için kullanabileceğiniz diğer bazı sihirli kelime var,

$('#randomString').val(escape(this)); 

Ama this ben tıkladığınız bağlantıdan değil #randomString seçici bir nesneye başvurmak gibi görünüyor: Ben artık şöyle bir şey yapmak diye düşünmüştüm $('#randomString')?

cevap

1

Kısa cevap, ben eğer Seni doğru anlamak, hayır. Konuştuğunuz yer olan $('#randomString')'a başvurmanın bir yolu yok. Bu sadece val yöntemine ait bir parametredir, bu yüzden sadece düz JavaScript sözdizimi, jQuery "sihirli" değildir.

$(document.ready(function() { 
    var $rndStr = $('#randomString'); 

    $('#encode').click(function() { 
     $rndStr.val(escape($rndStr.val())); 
    }); 

    $('#decode').click(function() { 
     $('#rndStr').val(unescape($rndStr.val())); 
    });  
}); 
+0

Tamam, bu ShankarSangoli'nin cevabıyla aynı prensibe benziyor, ama sadece bir kez nesneyi yaratıyorsunuz (ki buna katılıyorum). Cevabına yaptığım yorumda da belirtildiği gibi, bir şekilde referans göstermenin bir yolu olması gerekiyormuş gibi görünüyor… JS'nin, ilk etapta metot zincirlemesini mümkün kılmak için bir referansa ihtiyacı olduğu anlamına mı geliyor? – slinkhi

+0

jQuery yöntem zincirleme, jQuery nesnesini '$()' yönteminden (ve sonradan adlandırılan diğer birçok jQuery yönteminden) döndürerek gerçekleştirilir, dolayısıyla bu durumda referansın geldiği yer budur. Sorduğunuz şey, bir yöntemin çağrıldığı nesneye başvurmak için JavaScript’te bir özellik olacaktır. – FishBasketGordo

4

Bu, istediğiniz nesneyi almaz. Eğer bir fonksiyon tanımına sahip yeni bir kapsam başladığınızda

var foo = escape(this); 
$('#randomString').val(foo); 

this

sadece farklı bir şey gelir: Bu etkili Bunu yapmanın eşdeğerdir.

jQuery bir geri arama seçeneği ile bu gibi bir fonksiyonelliği sunuyor:

$('#randomString').val(function (idx, oldVal) { 
    return escape(oldVal); 
}); 

ikinci parametre elemanının akım değeri olduğu; dönüş değeri, eleman için yeni bir değer ayarlar.

+0

tamam ah şudur:

böylece onu oluştururken tutmak gerekmez ben #randomString için jQuery nesnesi kapalı tasarrufu sağlamış olacağız el altında görevi başarmak ve kod daha temiz ve daha az aksak yapmak basit bir "bu" dan biraz daha fazlası .. seçilen en yakın nesneyi ifade etmek için daha zarif ve basit bir şey olmalı gibi görünüyor, ama sanırım bu muhtemelen – slinkhi

3

Bu

$(document.ready(function() { 

    $('#encode').click(function() { 
    var $randomString = $('#randomString'); 
    $randomString.val(escape($randomString.val())); 
    }); 
    $('#decode').click(function() { 
    var $randomString = $('#randomString'); 
    $randomString.val(unescape($randomString.val())); 
    });  
}); 
+0

alır gibi iyi Örnek kodumun amaçları için, Bu aslında daha fazla kod, ama sanırım sonunda bu aradığım şey ya da ona en yakın olan şey. Yine de (ya) [(selektör)] bir şey (ya da [selefo]) bir yol olabileceğini düşünmekteyim ama ... Yani demek istediğim, bu zincirleme şeylerin bir bütün noktasıdır ... BUNLAR İÇİN js kullanmak, aksi takdirde zincirleme yöntemleri mümkün olmazdı! – slinkhi

1

Bunu biraz genel yapabilir deneyebilirsiniz:

$.fn.applyVal = function(func) { 
    return this.each(function() { 
     $(this).val(func($(this).val())); 
    }); 
}; 

Daha sonra aşağıdaki çağrı yeterlidir:

$('#randomString').applyVal(escape); 
+0

Eğer jenerik yapmak istiyorsanız, muhtemelen birden fazla elemanın seçildiği durumu ele almalısınız. – lonesomeday

+0

@lonesomeday: Haklısın, yine de .val sadece ilk eleman üzerinde çalışıyor. – pimvdb