Javascript'i kullanarak, Aria Etiketler ile Erişilebilirlik
Form Accessability Matters Neden
Web formları dijital deneyimlerin en yaygın ve temel bileşenleri arasındadır. Güç giriş sayfaları, çekout akışları, anket teklifleri, iletişim talepleri ve diğer sayısız etkileşimler. Kullanıcılar için görsel, motor veya bilişsel engelliler, kötü inşa edilmiş bir form, güvenilir bir engel olabilir. Accessability - tüm kullanıcıların algılayabildiği, anlamaları ve formlarla etkileşime girebilmeleri - sadece etik bir yükümlülüğü yoktur; birçok yargıda yasal bir zorunluluktur ve birçok yargıcıya ulaşmak ve destek maliyetleri azaltılabilir.
Ekran okuyucuları, ses tanıma yazılımı ve anahtar cihazlar gibi yardımcı teknolojiler, iyi yapılandırılmış diskmantik HTML'ye ve doğru uygulanan ARIA (Erişimsel Zengin İnternet Uygulamaları) form kontrollerini iletmek için özellikler, amaçları ve mevcut devletler olmadan, bu cues olmadan, kullanıcılar eksik veya kafa karıştırıcı etiketlerle karşılaşabilir veya gerekli alanları anlamaz, doğrulama hataları anlamaz veya tam olarak teslim edilemez.
Bu makale, JavaScript'in, ARIA etiketlerinin dinamik uygulama ve yönetimi aracılığıyla form erişilebilirliği artırmak için nasıl kullanılabileceğini araştırıyor.Gerekli ARIA özelliklerini, formlar için inceleyeceğiz, etiketi açıklığı, hata iletişimi ve canlı bölge güncellemelerini geliştirmek için gerçek dünya JavaScript desenleri ile yürümek ve hemen adapte edilebilir kod örnekleri sağlayabilirsiniz.Sonunda ARIA ile JavaScript tekniklerini nasıl oluşturulacağını anlayacağız.
ARIA Etiketlerlerini ve Formlardaki Rollarını Anlamak
ARIA, HTML'nin dinamik içerik ve karmaşık kullanıcı arayüzü kontrollerinin erişilebilirliğini artırmak için bir dizi özellik sunar.For formlar için en kritik özellikler şunlardır:
- [FONT:0] [FONT:0][FONT:0][FONT:0][FONT:0][FONT:0][FONT:0)[FONT=0)[FONT=0)))))))))))))))[[değiştir | kaynağı değiştirilmeyen bir anahtar için açık, erişilebilir bir isim için tıklayınız.
- [FONT:0] – Güvenilir bir isim oluşturmak için kimlik tarafından mevcut olan bir veya daha mevcut elementler. Bu, görünür bir etiket var olduğunda kullanışlıdır, ancak programmatik olarak ilişkili değildir (örneğin, bir başlık veya bir yay).
- [FONT:0] – Daha uzun bir açıklama sağlayan bir elemente, ipucu metni veya bir hata mesajı gibi erişilebilir adı destekler.
- [FONT:0] - Formdan önce bir girişin teslim edilmesi gereken bir değere sahip olması gerekir.Asated with native HTML5 inputs, this provides redundancy for older helpive technologies.
- [FONT:0] – Bir alanın değerinin geçerliliği kuralları karşılamadığı kabul edilir. Bu durum genellikle JavaScript üzerinden dinamik olarak güncellenir ve güncellenir.
- [FONT:0] - Belirli bir alanda hata mesajı içeren elementi belirtir, ekran okuyucularının doğrudan kontrole bağlantı kurmalarına izin verir.
Bu özellikler formun görsel görünümünü değiştirmez; sadece yardımcı teknolojiler elementleri nasıl yorumlayabilir ve duyurur. Onların doğru kullanımı erişilebilir form tasarımının temel taşlarıdır.
Yerli HTML yeterli olmadığında: JavaScript için gerekli olan
HTML yalnızca erişilebilir formlar oluşturabilir: ESFLT:9) özelliklerini kullanarak elementler, [[FONTT:11) ve [[FONTFLT:12) gruplama ve yerel geçerlilik için [[ENFLT:13) ve [[FONTFLT: 9) ile birçok modern web uygulaması, statik işaretlerin ele alınamayacağı karmaşıklıkları tanıtmaktadır:
- Müşteri tarafında inşa edilen veya değiştirilmiş formlar (örneğin, tek sayfa uygulamaları).
- Kullanıcı seçimine dayanan veya ortadan kaybolan koşullu alanlar.
- Özel form elemanları (örneğin, özel çek kutuları, yerel erişilebilirliği kaybeden kutular) seçin.
- Gerçek zamanlı, bir sayfa yeniden yük olmadan güncelleme hata mesajlarının geri bildirimini geçerli kılar.
- Odaklığın yönetilmesi ve bağlam değişikliklerinin ilan edilmesi gereken çok yönlü veya sihirbaz formları.
JavaScript bu boşlukları programmatik olarak atama, güncelleme ve ARIA özelliklerini bir kullanıcı arayüzü ile etkileşim halinde tutmakla sağlar. Bu yardımcı teknoloji kullanıcılarının aynı bilgileri ve cuesleri görmeli kullanıcılar olarak almasını sağlar.
Core Desenler: JavaScript to Add and Update ARIA
1. Şekil 1: Visible Etiketler olmadan girişlere kaydolun
Bazen görsel tasarım kısıtlamaları görünür bir metin ile giriş etiketlemek pratik değildir. Bu durumlarda,İLFLT:16) erişilebilir bir isim tedarik eder. En basit yaklaşım doğrudan HTML'de eklemektir, ancak bir form bir API tarafından dinamik olarak oluşturulurken, elementin yaratıldığından sonra enjekte edebilirsiniz.
// After a dynamic input is created or added to the DOM
const searchInput = document.querySelector('.search-field');
if (searchInput) {
searchInput.setAttribute('aria-label', 'Search website');
}
Bilgiyi ifade etmekten kaçının: görünür bir etiket mevcutsa ancak [[Şerefli: 18) veya nesting ile ilişkili değilse, reddant yerine, [[Üye Olmayanlar İçin Tıklayınız.TheÜye Olmayanlar:0)W3C ARIA spesifikasyonu) her bir özellik uygun olduğunda kılavuzlar sunar.
2. Şekil 2: Etiket Birliği ile etiketlenme:
Bir grup element (örneğin radyo düğmeleri) görünür bir başlık tarafından tanımlanırsa, her kontrolden gelene atıfta bulunabilirsiniz. JavaScript, başlığın kimliğini toplamak ve tüm ilgili girişlere uygun özelliği uygulamak için kullanılabilir.
const groupHeading = document.getElementById('shipping-options-heading');
if (groupHeading) {
const radioButtons = document.querySelectorAll('input[name="shipping"]');
radioButtons.forEach(radio => {
radio.setAttribute('aria-labelledby', groupHeading.id);
});
}
Bu, [[GÖRÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞ
3. Desen 3: Dinamik Değişiklikler için Bölge Duyuruları
Bir formun tam bir sayfa yükü olmadan içerik değişiklikleri - bir çek kutusu işaret alanı göstermek gibi - ekran okuyucu kullanıcıları yeni içeriğin farkında olmayabilir.Eğer JavaScript ile birlikte, bu değişiklikleri ilan edebilirsiniz.
const toggle = document.getElementById('promo-toggle');
const promoContainer = document.getElementById('promo-code-container');
promoContainer.setAttribute('aria-live', 'polite');
toggle.addEventListener('change', function () {
if (this.checked) {
promoContainer.classList.remove('hidden');
promoContainer.innerHTML = `
<label for="promo-code">Enter promo code</label>
<input type="text" id="promo-code">
`;
document.getElementById('promo-code').setAttribute('aria-label', 'Promotion code');
} else {
promoContainer.classList.add('hidden');
promoContainer.innerHTML = '';
}
});
Not that you update..................................
Dinamik Geçerlilik ve Hata İletişim
JavaScript'in erişilebilir formlardaki en etkili kullanımlarından biri, geçerlilik hatalarıdır.TheurFLT:0)WCAG Başarı Criterion 3.3.1 (Error Tanım)) Kullanıcıya herhangi bir giriş hatasının tanımlanması gerekir. ARIA özellikleri.
Yönsüzlüğün Belirlenmesi Üzerine ﴾28﴿
Bir form alanı geçerli değildir (yani yerli veya özel), setETHFLT:29) ve onu kaldır (veya düzeltildiğinde) hata düzeltildiğinde, bu, alan şu anda bir hataya sahip olan yardımcı teknolojilere yol açıyor.
const emailInput = document.getElementById('email');
function validateEmail(value) {
const isValid = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value);
emailInput.setAttribute('aria-invalid', !isValid);
return isValid;
}
emailInput.addEventListener('blur', function () {
validateEmail(this.value);
});
Hata mesajlarının [[DüzFLT:32] ve [[DüzDÜŞÜNCÜŞÜNCÜŞÜNCÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜ
Hata metni, alanla ilgili olarak programmatik olarak ilişkili olmalıdır.UseETHFLT:34] bir mesaj konteynerine veya [[FONTFLT:35) yeni, daha kesin bir özellik için. aşağıdaki örnek bir hata aralığı yaratır ve onu alana bağlar.
const emailInput = document.getElementById('email');
const errorContainer = document.getElementById('email-error');
emailInput.addEventListener('invalid', function (event) {
event.preventDefault(); // prevent native popup
this.setAttribute('aria-invalid', 'true');
this.setAttribute('aria-describedby', 'email-error');
errorContainer.textContent = 'Please enter a valid email address.';
errorContainer.style.display = 'block';
});
emailInput.addEventListener('input', function () {
if (this.validity.valid) {
this.setAttribute('aria-invalid', 'false');
this.removeAttribute('aria-describedby');
errorContainer.textContent = '';
errorContainer.style.display = 'none';
}
});
Not that the newer screen okuyucularda destekleniyor, ancak [[FONTT:0) ^ ^ ^ ([FONT=0)[FONT=[FONT=0)[[FONT=0]
Bir Inclusive Flow için Focus Yönetimi
Çok fazla adımlı formlarda veya hataların ortaya çıktığı zaman, odak yönetim kritiktir. JavaScript programlanabilir bir şekilde ilk geçersiz alana veya hataların özetine odaklanabilir.Her zaman odak noktasının aİLFLT:39) bölgesi veya bir başlık kullanarak hareket etme nedenini duyur.
function focusFirstError() {
const firstError = document.querySelector('[aria-invalid="true"]');
if (firstError) {
firstError.focus();
// Optionally announce
const announcer = document.getElementById('form-feedback');
announcer.textContent = 'The form contains errors. The first invalid field has been focused.';
announcer.setAttribute('aria-live', 'assertive');
}
}
document.getElementById('submit-btn').addEventListener('click', function (e) {
if (!validateForm()) {
e.preventDefault();
focusFirstError();
}
});
Duygusal olmayan güncellemeler için dikkatli olun. Duyuru olmadan Focus yönetimi kullanıcılarınu karıştırabilir, çünkü neden taşındıklarını anlamayabilirler.
Özel Form Kontrolü
Birçok proje özel stilize çekbox, radyo düğmeleri, menüleri veya ayak sesleri kullanır. Bunlar yerel semantics kaybeder ve ARIA rollerini, eyaletlerini ve özelliklerini JavaScript üzerinden uygular. Örneğin, özel bir çek kutusu gereksinimlerine ihtiyaç duyar. ”
const customCheckbox = document.getElementById('custom-checkbox');
customCheckbox.setAttribute('role', 'checkbox');
customCheckbox.setAttribute('aria-checked', 'false');
customCheckbox.setAttribute('tabindex', '0');
customCheckbox.setAttribute('aria-label', 'Accept terms and conditions');
customCheckbox.addEventListener('click', function () {
const isChecked = this.getAttribute('aria-checked') === 'true' ? false : true;
this.setAttribute('aria-checked', isChecked);
this.classList.toggle('checked', isChecked);
});
customCheckbox.addEventListener('keydown', function (e) {
if (e.key === ' ' || e.key === 'Enter') {
e.preventDefault();
this.click();
}
});
Bu tür desenler mümkün olsa da, yerel HTML elementlerini mümkün olduğunda tercih eder: yerleşik erişilebilirlik, klavye işleme ve minimum JavaScript yükü ile gelirler.
ARIA ile JavaScript kullanmak için en iyi uygulamalar
- [FONT=0]Remantic HTML ile başlayın.[[Dönetici:0) Her zaman ARIA'nın katmanından önce uygun şekilde başlar. ARIA, HTML'nin ne yapamayacağını düzeltmeli.
- [FONT:0) ARIA'nın bugüne kadar özellikleri tut..[[DÜT:1) JavaScript Güncellemelerinizin İMKBYİM 377,ENDÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞ
- [FONT:0]Do not override native behavior.[[Dönetici:0)[Döneticileri desteklemeniz gerekmediği sürece, yerel özellikleri gerekli olan ARIA’yı tekrarlayamaz.
- [FONT:0) Gerçek yardımcı teknolojilerle test edin.[DÜT:1] Otomatik geçerli yazıcılar yalnızca erişilebilirlik sorunlarının% 30'unu yakalarlar. Ekran okuyucuları (NVDA, VoiceOver, JAWS) ve klavye-sadece navigasyon.
- [FONT:0)Provide görünür etiketler her zaman mümkün olduğunda görünür.), bilişsel engelli kullanıcılar görünür etiketlerden faydalanır (örneğin, [[Dönemli etiketler veya [[DüzDÜŞÜNÜŞÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜŞÜŞÜNÜŞÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞ
- [FONT:0) Canlı bölgelerin kullanımı oldukça değerlidir.[[Dönetici:0) Aşırı sağ ekran okuyucu kullanıcılarının üzerinde aşırı tercih ettikleri ekran okuyucu kullanıcıları. ”(Uygunluk ve benzeri olmayan duyurular için).
Tamamlanmış Çalışma Örnek: Erişilebilir Dinamik Kayıt Formu
Aşağıda birkaç desenle bağıntılı bir örnek: koşullu alanlar, dinamik ARIA etiketleri, geçerlilik hatası işleme ve odaklanma yönetimi. Bu kod üretime hazır ama netlik için basitleştirilmiştir.
<form id="registration-form" novalidate>
<label for="username">Username (required)</label>
<input type="text" id="username" required>
<label for="newsletter">Subscribe to newsletter</label>
<input type="checkbox" id="newsletter">
<div id="email-group" hidden>
<label for="email">Email</label>
<input type="email" id="email">
</div>
<button type="submit">Register</button>
<div id="form-errors" aria-live="polite"></div>
</form>
<script>
const newsletter = document.getElementById('newsletter');
const emailGroup = document.getElementById('email-group');
const emailInput = document.getElementById('email');
const form = document.getElementById('registration-form');
const errorDisplay = document.getElementById('form-errors');
// Show email field only if newsletter is checked
newsletter.addEventListener('change', function () {
if (this.checked) {
emailGroup.hidden = false;
emailInput.setAttribute('aria-label', 'Email address for newsletter');
emailInput.setAttribute('aria-required', 'true');
emailInput.required = true;
} else {
emailGroup.hidden = true;
emailInput.removeAttribute('aria-label');
emailInput.removeAttribute('aria-required');
emailInput.required = false;
emailInput.value = '';
}
});
// Client-side validation and error display
form.addEventListener('submit', function (event) {
event.preventDefault();
let errors = [];
const username = document.getElementById('username');
if (!username.value.trim()) {
username.setAttribute('aria-invalid', 'true');
username.setAttribute('aria-describedby', 'form-errors');
errors.push('Username is required.');
} else {
username.setAttribute('aria-invalid', 'false');
username.removeAttribute('aria-describedby');
}
if (!emailGroup.hidden && !emailInput.value.trim()) {
emailInput.setAttribute('aria-invalid', 'true');
emailInput.setAttribute('aria-describedby', 'form-errors');
errors.push('Email is required for newsletter subscription.');
} else if (!emailGroup.hidden) {
emailInput.setAttribute('aria-invalid', 'false');
emailInput.removeAttribute('aria-describedby');
}
errorDisplay.textContent = errors.join(' ');
if (errors.length > 0) {
// Focus first error field
const firstErrorField = document.querySelector('[aria-invalid="true"]');
if (firstErrorField) firstErrorField.focus();
} else {
// Successful submission (would send data)
errorDisplay.textContent = 'Registration successful!';
errorDisplay.setAttribute('aria-live', 'assertive');
}
});
</script>
Bu örnek, JavaScript'in e-posta alanı göründüğünde dinamik olarak nasıl ekleyebileceğini, ayarlandığında, koşullu olarak, [[FONT::59) ve [[D:60) geçerlilik sırasında ve hata için bir alan kullanıyor.
Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç
Accessible formlar lüks değildir - adil dijital erişim için temel bir gerekliliktir. ARIA özelliklerini JavaScript ile birleştirerek geliştiriciler, interaktif formlarla çalışan herhangi bir web geliştirici için pratik bir araçta bulunabilirler.Bu makalede kaplanan modeller -dinamik etiketleme, canlı bölge duyuruları, hata bağlantı, odak yönetim ve özel kontrol işlemleri - interaktif formlarla çalışan herhangi bir web geliştirici için pratik bir araçta.
ARIA'nın bir ek olduğunu her zaman unutmayın, bir yedek değil. Temiz semantik HTML ile başlayın, gerçek yardımcı teknolojilerle test edin ve kullanıcı geri bildirimlerine dayanarak.When usedive, JavaScript and ARIA together can transforme a form from a source of challenges into a blank, kapsayıcı deneyim.For more reading, consult.com.