SORU
29 NİSAN 2010, PERŞEMBE


Javascript tek dişli olması sağlanır?

Javascript tüm modern tarayıcı uygulamalarında tek dişli olarak bilinir, ama bu herhangi bir standart belirtilen yoksa sadece bir gelenek midir? Tamamen güvenli javascript her zaman tek dişli olduğunu varsayalım.

CEVAP
29 NİSAN 2010, PERŞEMBE


Bu iyi bir soru. Söylemek isterim“”. Evet Yapamam.

JavaScript genellikle kabul için tek bir iş parçacığı yürütme görünür komut dosyaları(*), böylece satır içi komut dosyası, olay dinleyici ya da zaman aşımı girdi, kalır tamamen kontrol kadar geri sonundan başlayarak blok ya da işlev.

(*: tarayıcılar gerçekten JS motorlarını OS-iplik kullanarak uygulamak sorusunu görmezden gelerek, ya da olup olmadığını-iş parçacığı yürütme WebWorkers tarafından tanıtıldı. diğer sınırlı)

Ancak, gerçekte butam olarak doğru değilsinsi kötü şekillerde.

En sık karşılaşılan durum acil olaylar. Tarayıcılar kodunuzu onlara neden bir şey yaptığında bu hemen ateş

<textarea id="log" rows="20" cols="40"></textarea>
<input id="inp">
<script type="text/javascript">
    var l= document.getElementById('log');
    var i= document.getElementById('inp');
    i.onblur= function() {
        l.value = 'blur\n';
    };
    setTimeout(function() {
        l.value = 'log in\n';
        l.focus();
        l.value = 'log out\n';
    }, 100);
    i.focus();
</script>

Tüm hariç log in, blur, log out sonuç YANİ. Bu olaylar focus() alert(), seni aradım çünkü olabilecek doğrudan aradı diye kovma veya pop-up bir pencere, ya da odak hareket eden başka bir şey açıldı.

Bu da diğer olaylar neden olabilir. Örneğin bir eklenti i.onchange dinleyici ve türü bir şey girdi önce focus() çağrı unfocuses ve günlük emir log in, change, blur, log out dışında Opera nerede log in, blur, log out, change ve IE yerde (hatta daha az explicably) log in, change, log out, blur.

- Benzer şekilde sağlayan bir öğe üzerinde click() arama aramaları onclick işleyicisi hemen tüm tarayıcılarda (en azından bu tutarlı!).

(on... doğrudan olay ama aynı addEventListener attachEvent. olur özellikleri burada işleyicisi) kullanıyorum

Ayrıca olayları kodunuzu bitmiş olmasına rağmen dişli, iken ateş şartlar varhiçbir şeyonu kışkırtmak için. Bir örnek:

<textarea id="log" rows="20" cols="40"></textarea>
<button id="act">alert</button>
<script type="text/javascript">
    var l= document.getElementById('log');
    document.getElementById('act').onclick= function() {
        l.value = 'alert in\n';
        alert('alert!');
        l.value = 'alert out\n';
    };
    window.onresize= function() {
        l.value = 'resize\n';
    };
</script>

alert Hit ve kalıcı bir diyalog kutusu alırsınız. Daha fazla komut diyalog kapatmak kadar yürütür Hayır, Evet? Hayır. Ana pencereyi yeniden boyutlandırmak ve button alert in, resize, alert out alacak.

Sen bence bu imkansız bir pencereyi yeniden buna rağmen kalıcı bir diyalog kutusu kadar, ama o kadar: Linux, sen-ebilmek resize penceresi kadar senin gibi; Windows o kadar da kolay değil ama yapabilirsin değiştirerek ekran çözünürlüğü daha büyük bir küçük bir pencere uymuyor, neden oraya yeniden boyutlandırılabilir.

Çünkü öyle düşünüyorum, ama sadece resize (ve muhtemelen bir kaç daha fazla gibi scroll) yangın ne zaman kullanıcı yok aktif etkileşim ile tarayıcı çünkü senaryo dişli. Ve tek windows için haklı olabilirsin. Ama bu kaba bir çapraz-pencere betik yapıyorsun en kısa sürede gider. Tüm tarayıcılar dışında Safari, hangi engeller windows/tabs/çerçeve herhangi biri meşgul, etkileşim ile bir belgeden kod, başka bir belge, çalışan ayrı bir iş parçacığı yürütme ve neden herhangi bir ilişkili olay işleyicileri için ateş.

Oluşturulmasına neden olay iken komut yükseltilebilir yerlerde hala dişli

  • kalıcı pop-up(alert, , *confirm*23) açık olduğunda, tüm tarayıcılar ama Opera;

  • tarayıcılar showModalDialog sırasında bu destek;

  • “Bir senaryo bu sayfada olabilir meşgul...” diyalog kutusu bile seçmek için izin senaryoyu devam etmek için Çalıştır, izin olayları gibi yeniden boyutlandırma ve bulanıklık ateş ve ele hatta buna rağmen script ortasında meşgul döngü dışında Opera.

  • bir süre önce benim için, Sun Java Eklentisi ile IE, bir uygulama herhangi bir yöntemin çağrılması, yangın ve komut dosyası olayları girilmesi için izin verebilir. Bu zamanlama her zaman duyarlı bir hata oldu, ve Güneş (umarım öyledir) beri sabit olması mümkün.

  • muhtemelen daha fazla. Bu test beri bir süre oldu ve tarayıcılar beri karmaşıklığı kazanmıştır.

Özetle, JavaScript çoğu kullanıcı, çoğu zaman, yürütmenin olay kaynaklı katı tek bir konu var gibi görünüyor. Gerçekte, böyle bir şey var. Değil net ne kadar bu sadece bir hata ve ne kadar bilinçli tasarım, ama eğer yazıyorsun karmaşık uygulamalar, özellikle çapraz-pencere/çerçeve-betik olanlar, her fırsat olabilir ısırık ve aralıklı, Sabit-hata ayıklama yollar.

Eğer başımıza gelebilecek en kötü şey gelirse, tüm etkinlik cevapları indirecting tarafından eşzamanlılık sorunları çözebilir. Bir olay geldiğinde, bir kuyruk bırakın ve sırayla sırası ile anlaşma sonra, setInterval bir fonksiyon. Eğer karmaşık uygulamalar tarafından kullanılmak üzere istediğiniz bir çerçeve yazıyorsanız, bu iyi bir hamle olabilir. postMessage ayrıca umarım çapraz belge acısını gelecekte betik yatıştırır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Christian Atlas

    Christian At

    26 Mart 2009
  • David Tedeyev

    David Tedeye

    20 AĞUSTOS 2011
  • MattSteffanina 2

    MattSteffani

    28 Kasım 2007