2012-03-27 3 views
6

üzerine event.target.id. Ben olay işlevine bir parametre olarak geçirilen gerektiğini önerdi bazı benzer sorular buldum: Benim için,jQuery/JavaScript ben Chrome'da çalışıyor yazılı kısa senaryomuz var Firefox

function updateSentence(event){ 
    $(document).ready(function(event) { 
     t = event.target.id; 
     $("#S"+t).html($("#"+t).val()); 
    }); 
} 

Oysa Firefox sorunu çözmek ve aslında nasıl çalıştığını kırar gelmez bu çözüm Chrome'da. Chrome'da, bu iletiler geçtiğinde event.target'un tanımlanmadığını bildirir.

Neyi yanlış yapıyorum?

Birkaç yorum aldıktan sonra jQuery'yi genel olarak nasıl düşündüğümün yanlış olduğunu anladım. Cümlenin her güncellemesinde $(document).ready'u istemedim. Ben ile sona erdi bu bilgiyle fonksiyonu temizleniyor: Bu hala doğru Chrome'da cümleyi günceller, henüz

function updateSentence(){ 
    t = event.target.id; 
    $("#S"+t).html($("#"+t).val()); 
} 

target Firefox'ta tanımsız olmaya devam ediyor. Bunu Firefox'ta çalışmak için ne yapmam gerekebilir? Ve hala jQuery'de yanlış bir şey mi yapıyorum?

Ayrıca, yorumlarda bir soruyu yanıtlamak için, aradığım olay updateSentence()'u tetikleyen onchange olaydır. Bir seçim/metin alanı değiştiğinde bu çağrılmalıdır.

(Ben genel olarak jQuery ve JavaScript hala yeniyim ve ben sadece basit bir hata yapıyorum eminim.) Cevabı buldum


. Sitenin bana izin verdiği birkaç saat sonra yayınlayacağım.

+2

Hedefin ne olmasını bekliyorsunuz? '$ (document) .ready' jQuery'yi bir argüman olarak gönderir - bir hedef öğe yoktur. – pimvdb

+2

Başka bir işlevin içinde (belgeyi) çalıştırmanın iyi bir fikir olduğunu sanmıyorum. Bir kez, sayfada 'hazır' olması gerekiyordu. Bu olaydan sonra çağrılırsa, istediğiniz gibi davranmayacaktır. – lifeIsGood

+3

"Ancak Firefox'ta" kullanımınız, başka bir tarayıcıda, bir yerden bir sonuç aldığınızı gösterir. Gerçekten olmamalıydın. Bu senaryoda değil. –

cevap

2

Evet, çok iyi. Bunu nasıl yaptığınızı tekrar düşünürseniz daha anlamlı olur. Bağlantınızı işlevinizden ayırın ve bu, yaptığınız şeyle savaşın yarısıdır.

$(function() { // Equivalent of Document Ready; You only need this once; 
    // BINDINGS HERE 
    $('someSelector').on('change keypress', function(event) { 
    updateSentence(this); 
    }); 
}); 

function updateSentence(elem) { 
    $('#S' + elem.id).html(elem.value) ; 
} 

Üstelik bu, ikincil bir işlevi bile kullanmama önerdiğim durumlardan biridir.Bazı durumlarda, yapmak istediğiniz şey, bağlantıda yaptığınız şeyden başka bir işlevi çağırmayı haklı kılmanın zor olması kadar basittir.

$(function() { 
    $('someSelector').on('change keypress', function(event) { 
    $('#S' + this.id).html(this.value) ; 
    }); 
}); 

Sen event duyulan ihtiyacın ortadan kaldırıldığı bu durumların her ikisinde de göreceksiniz. Ancak, FF için bile, n argüman olarak (function(event)) aktarılacağı için kullanılabilir.

'FF' kodunuzda 'hedefinizin' tanımlanmamış olmasının nedeni, FF'nin çoğu tarayıcı gibi havadan event yakalanmamasıdır. Bu nedenle, event gereksinimini ortadan kaldırmak için kodunuzu ayarlayamıyorsanız veya örneklerimdeki gibi iletemiyorsanız, window.event aracılığıyla buna başvurabilirsiniz.

1

Yukarıdaki yorumlarda bahsettiğim ve biraz daha yaptığım şeyi okuduktan sonra, soruma cevap buldum. İlk olarak, işlev her çağrıldığında hatalı bir şekilde çağrı kullanıyordum. Daha sonra, kimliğin işleve nasıl aktarıldığına dair anlayışım yanlış görünüyor. Otomatik olarak geçilmez, bunun yerine el ile yapılmalıdır. Bu nedenle, diğer yorumcularımın neden sorularım tarafından karıştırıldığına dair ilk kafa karışıklığım. Her halükarda, bu şeyleri bilerek, cevabımı diğer iki cevaplı soruların bir kombinasyonunda buldum. Onlar bu iki yığın taşması sorular bulunabilir:

Ben hala bu açıklamaya başka yanlış bir şey söylüyorum eminim, ama ben Daha kısa zamanda öğreneceğim.

+0

Hayır, olayın nasıl yayıldığını gerçekten görmüyorsunuz. Olay baloncukları, özellikleri vardır ve bunlardan biri hedeftir. Hedefin bir kimliği olabilir (ayarlanamaz/adreslenebilir olmayabilir). Ancak hedef, etkinlik olaylarından kaynaklanmaktadır. Böylece, target.id, öğenin kimliğini bulabileceğiniz yerdir. Ama sorunun cevabını düzgün bir şekilde alamıyorsunuz (cevabımla şunu görün: a: olayı referans gösterme ihtiyacını görmezden gelebilirsiniz ya da b: Eğer etkinlik üzerinden id hedefine gerçekten ulaşmak istiyorsanız, o zaman FF aracılığıyla olay doğrudan window.event üzerinden doğrudan VEYA erişim olayı görür. – williambq