2016-12-28 23 views
16

Aşağıdaki kod bir tarayıcıda çalışır:Neden VEYA işlemi "||" yapamıyor Bu JavaScript kodunda üçlü operatör "?:" yerine?

var event = event || window.event; 
var eTarget = event.target || event.srcElement; 
var eTargetId = eTarget.id; 

Ben

var eTargetId = event.target ? event.target.id : event.srcElement.id; 

çalıştığını onu değiştirdiğinizde de.

Ben

var eTargetId = event.target.id || event.srcElement.id; 

kodunu değiştirmek zaman IE 678. çalışmıyor aşağıdaki hatayı alıyorum:

SCRIPT5007:Object expected.

neden oluyor?

+4

üçüncü örnek, ilk iki örneklerden farklı,

var eTargetId = event.target && event.target.id || event.srcElement.id; 

yapmak Veya olacaktır. – guest271314

+1

ES'de bulunmayan varoluşsal erişim operatörü hakkında bilgi edinmeniz gerekir. – Knu

+0

Varoluşsal erişimci operatörü ayrıca "güvenli gezinme operatörü" olarak bilinir. "Temel nesne başvurusu boşsa null döndür, aksi halde bu temel nesnenin belirli bir özelliğini döndürür" anlamına gelir. –

cevap

14

Eğer taban değeri gerçekten bir nesne, boş olmayan işaretli değil eğer bir özellik okumaya çalışmayın. bir kimliğe sahip değil olay hedefi için mümkünse

Genellikle tek

var eTargetId = event.target && event.target.id 
       || event.srcElement && event.srcElement.id 
       || ""; 
+1

Örnekleriniz doğru ancak ilk satırınız kafa karıştırıcı - sorun yaratmayan "id" özelliğidir. Bir null özelliğini bir hata olmadan okuyabilirsiniz. Sorun, boş olduğunda bir nesneyi "hedef" olarak işlemeye çalıştığınız zamandır. Öyleyse, daha doğru bir şekilde, "object_ varlığını kontrol etmediyseniz bir özelliği okumaya çalışmayın." – Niall

+0

@Niall Teşekkürler, temel değer değil, özellik değeri, evet. – Oriol

+1

@MarcinJuraszek Son kod, "event.target" varlığını ele alır ve "event.target.id" boş dizedir. 'SrcElement' değil, sorun değil. – Oriol

13

Bu büyük olasılıkla, event.target sıfır olduğundan, ancak event değil. İlk iki denemeniz, event.target boşsa, daha fazla değerlendirmeyi önlemek için kısa devre kullanır.

3

event, event.target ve event.srElement değerlendirin ilk

var eTargetId = ((event = event || window.event) 
       && (eTargetId = event.target || event.srcElement) 
       && eTargetId["id"]) || void 0; 
İlgili konular