auxclick Chrome 55'e geliyor

Bir tıklama ne zaman click olarak kabul edilmez? Karmaşık bir kullanıcı arayüzü üzerinde çalışan bir web geliştiricisi için bu soyut bir felsefi soru değildir. Özel fare girişi davranışı uyguluyorsanız kullanıcı amacını göz önünde bulundurmanız çok önemlidir. Örneğin, bir kullanıcı farenin orta düğmesiyle bir bağlantıyı tıklarsa bu bağlantının içeriğini içeren yeni bir sekme açmak istediğini varsaymak mantıklı olur. Kullanıcı rastgele bir kullanıcı arayüzü öğesini orta tıkladığında bunun yanlışlıkla yapıldığını varsayabilir ve bu girişi yoksayabilirsiniz. Birincil düğme tıklamasının ise kullanıcı arayüzünden bir yanıt tetiklemesi beklenir.

Bu ayrıntılı etkileşimleri tek bir click etkinlik işleyici aracılığıyla modellemek mümkündür ancak bu işlem biraz zahmetli olabilir. MouseEvent öğesinin button özelliğini açıkça kontrol ederek birincil düğmeyi temsil eden 0 değerine mi yoksa başka bir değere mi ayarlandığını (1 genellikle orta düğmeyi temsil eder) görmeniz gerekir. Ancak birçok geliştirici, button mülkünü açıkça kontrol etmez. Bu da hangi düğmeye basıldığına bakılmaksızın tüm click öğelerini aynı şekilde işleyen bir koda yol açar.

Chrome 55'ten itibaren, birincil olmayan bir düğmeyle yapılan tüm tıklamalara yanıt olarak auxclick adlı yeni bir MouseEvent türü tetiklenir. Bu yeni etkinliğe eşlik eden click etkinliğinin davranışında da bir değişiklik yapıldı: Bu etkinlik yalnızca birincil fare düğmesine basıldığında tetiklenir. Bu değişikliklerin, web geliştiricilerin MouseEvent.button mülkünü özel olarak kontrol etmek zorunda kalmadan yalnızca önemsedikleri tıklama türüne yanıt veren etkinlik işleyicileri yazmasını kolaylaştıracağını umuyoruz.

Yanlış pozitifleri azaltma

Daha önce de belirtildiği gibi, auxclick oluşturmamızın bir nedeni de "orta tıklamayla sekme açma" davranışını yanlışlıkla geçersiz kılan özel click işleyicilerinin dağıtılmasını önlemekti. Örneğin, konum çubuğunu yeniden yazmak ve özel tek sayfalı gezinme işlemleri uygulamak için History API'yi kullanan bir click etkinlik işleyicisi yazdığınızı varsayalım. Şuna benzer bir görünüme sahip olabilir:

document.querySelector('#my-link').addEventListener('click', event => {
    event.preventDefault();
    // ...call history.pushState(), use client-side rendering, etc....
});

Özel mantığınız, farenin birincil düğmesi tarafından tetiklendiğinde istenen şekilde çalışabilir ancak bu kod orta düğme tıklandığında çalıştırılırsa yanlış pozitif olarak kabul edilir. Yeni davranıştan önce, yeni sekme açma varsayılan işlemini engelleyerek kullanıcınızın beklentilerini karşılamamış olurdunuz. İşleyicinizin başında event.button === 0 değerini açıkça kontrol edebilir ve yalnızca bu durumda kodu yürütebilirsiniz. Ancak bunu unutmanız veya bunu yapmanız gerektiğini hiç fark etmemeniz kolaydır.

Yalnızca ihtiyacınız olan kodu çalıştırın

Yanlış pozitiflerin sayısının azalmasının dezavantajı, auxclick geri çağırmalarının yalnızca birincil olmayan bir fare düğmesi tıklandığında çalışacak olmasıdır. Örneğin, yeni bir sekme açmadan önce uygun bir hedef URL'yi hesaplaması gereken kodunuz varsa auxclick etkinliğini dinleyebilir ve bu mantığı geri çağırma işlevinize dahil edebilirsiniz. Birincil fare düğmesi tıklandığında çalıştırma yükü oluşturmaz.

Tarayıcı desteği ve uyumluluğu

Bu yeni davranış şu anda yalnızca Chrome 55'te uygulanmaktadır. İlk öneride belirtildiği gibi, web geliştirici topluluğundan hem olumlu hem de olumsuz geri bildirimler bekliyoruz. Bu geri bildirimi standartlaştırma sürecinde çalışan kişilerle paylaşmanın en iyi yolu GitHub sorunu bildirmektir.

Bu süre zarfında geliştiricilerin, fare etkinliklerini işlemeyle ilgili bazı en iyi uygulamaları uygulamak için auxclick'ün yaygın olarak kullanılmasını beklemesi gerekmez. click etkinlik işleyicinizin başında MouseEvent.button mülkünün değerini kontrol ederseniz uygun işlemi yaptığınızdan emin olabilirsiniz. Aşağıdaki kalıp, auxclick için yerel destek olup olmadığına bakılmaksızın birincil ve yardımcı tıklamaları farklı şekilde işler:

function handlePrimaryClick(event) {
    // ...code to handle the primary button click...
}

function handleAuxClick(event) {
    // ...code to handle the auxiliary button click….
}

document.querySelector('#my-link').addEventListener('click', event => {
    if (event.button === 0) {
    return handlePrimaryClick(event);
    }


    // This provides fallback behavior in browsers without auxclick.
    return handleAuxClick(event);
});

// Explicitly listen for auxclick in browsers that support it.
document.querySelector('#my-link').addEventListener('auxclick', handleAuxClick);