Seriye kaldığımız yerden devam ediyoruz ve bugünde farklı farklı özellikleri öğrenmeye devam edeceğiz.
Bazı etiketlerin varsayılan davranışları vardır. Örneğin bir a
etiketine basınca ilgili linke yönlendirilirsiniz, ya da form içinde tipi submit olan bir button
a basınca formu gönderir vs. Bu gibi varsayılan davranışları engellemek için preventDefault
kullanabilirsiniz. Örneğin;
<a href="about.html">Hakkimda</a>
<a href="https://prototurk.com">prototurk.com</a>
<script>
const aTags = document.querySelectorAll('a')
aTags.forEach(a => {
a.addEventListener('click', e => {
// eger link dis bir baglanti iceriyorsa
// varsayilan davranisi engelle
if (e.target.getAttribute('href').includes('http')) {
if (!confirm('Guvenli olmayan bir siteye gitmeye calisiyorsunuz?')) {
e.preventDefault()
}
}
})
})
</script>
Varsayılan yayılmayı engellemek içinse bu özellik kullanılır. Bunu bir örnekle anlatmak gerekirse, iç içe 3 tane etiketimiz olduğunu düşünelim. Ve bu 3 etiketin de bir click
olayı olsun. Eğer 3. etikete tıklarsam, ne olmasını beklerim? Gelin bir bakalım.
<div class="test1">
test1
<div class="test2">
test2
<div class="test3">test3</div>
</div>
</div>
<script>
const test1 = document.querySelector('.test1')
const test2 = document.querySelector('.test2')
const test3 = document.querySelector('.test3')
test2.addEventListener('click', e => console.log('test2 tiklandi'))
test1.addEventListener('click', e => console.log('test1 tiklandi'))
test3.addEventListener('click', e => console.log('test3 tiklandi'))
</script>
Evet eğer test3
e tıklarsam sırasıyla 3, 2 ve 1. etiketlerin console değerlerini görüyorum. Ama bazı durumlarda ben sadece test3'e tıkladığım olayın çalışmasını ve yayılmayı durdurmak isteyebilirim. İşte o zaman şöyle bir kod yazmam yeterliydi.
test3.addEventListener('click', e => {
e.stopPropagation()
console.log('test3 tiklandi')
})
Javascript'de css özellikleri eklemek için style
objesi içinde tanımlamayı öğrenmiştik. document.styleSheet
objesi içindeki stilleri değiştirmek, güncellemek, kaldırmak ya da değerini çekmek içinse kullanabileceğimiz bazı metodlar mevcut.
Belirtilen css özelliği tanımlamamızı sağlar. 3. parametre olarak important
olup olmadığını belirtebiliriz.
<h1>prototurk.com</h1>
<style>
h1 {
color: red;
}
</style>
<script>
document.styleSheets[0].cssRules[0].style.setProperty('color', 'blue')
//document.styleSheets[0].cssRules[0].style.setProperty('color', 'blue', 'important')
</script>
Seçilen css özelliğini kaldırır.
<h1>prototurk.com</h1>
<style>
h1 {
color: red !important;
}
</style>
<script>
document.styleSheets[0].cssRules[0].style.removeProperty('color')
</script>
Seçilen css özelliğinin değerini döndürür.
<h1>prototurk.com</h1>
<style>
h1 {
color: red !important;
}
</style>
<script>
console.log(
document.styleSheets[0].cssRules[0].style.getPropertyValue('color')
)
</script>
Seçilen css özelliğinin important
olup olmadığını döndürür. Çok önemli bir metod değil ancak bir gün mutlaka işe yarayacağı bir yer çıkar, bilmekte fayda var.
<h1>prototurk.com</h1>
<style>
h1 {
color: red !important;
}
</style>
<script>
console.log(
document.styleSheets[0].cssRules[0].style.getPropertyPriority('color') === 'important' ? 'important kullanilmis' : 'cokta onemli degil!'
)
</script>
Medya sorguları css'de responsive tasarım yaparken kullandığımız sorgulardır. Bunu javascript tarafında da kullanmak istediğimizde bize birkaç yararlı metod vermekte. Gelin bunlara birlikte bir bakalım.
Bir medya sorgusu yazmamıza sağlar. Örneğin sayfa genişliğimiz 480px altında mı değil mi onu kontrol edelim.
const mq = window.matchMedia('(max-width: 480px)')
console.log(mq.matches) // true ya da false
console.log(mq.media) // sorgumuzun değeri
Eğer bu değişikliği sürekli takip etmek istersek change
olayını dinleyebiliriz. Yani;
const mq = window.matchMedia('(max-width: 480px)')
mq.addEventListener('change', e => {
console.log(e.matches) // eşleşip eşleşmediğini döndürür
})
Bir belgenin tasarım modunda olup olmadığını belirlememizi sağlar.
document.designMode = 'on'
Kullanıcıdan bilgi aldığımız input
ve textarea
elemanlarında seçilen yazının başlangıç ve bitiş indis değerlerini döndürür. Örneğin textarea içinde seçilen yazıyı şöyle konsola basabilirdik.
<textarea id="test-textarea">textarea mesela</textarea>
<script>
const textarea = document.getElementById('test-textarea')
textarea.addEventListener('select', () => {
console.log(
textarea.value.substring(
textarea.selectionStart,
textarea.selectionEnd
)
)
})
</script>
Başlangıç ve bitiş indislerine göre seçilen değeri belirlene değer ile değiştirir. Yukarıdaki örneğimizi biraz daha genişletelim.
<textarea id="test-textarea">textarea mesela</textarea>
<button class="button" data-type="bold">Kalın Yap</button>
<button class="button" data-type="italic">Eğik Yap</button>
<script>
const textarea = document.getElementById('test-textarea')
const buttons = document.querySelectorAll('.button')
const selection = {}
buttons.forEach(button => button.addEventListener('click', e => {
let selected = textarea.value.substring(
selection.start,
selection.end
)
switch (e.target.dataset.type) {
case 'bold':
selected = `<b>${selected}</b>`
break
case 'italic':
selected = `<i>${selected}</i>`
break
}
textarea.focus()
textarea.setRangeText(
selected,
selection.start,
selection.end,
'end'
)
}))
textarea.addEventListener('select', () => {
selection.start = textarea.selectionStart
selection.end = textarea.selectionEnd
})
</script>
Metodun 4. parametresinde seçimden sonraki konumu ayarlanıyor.
select
- eklme yaptıktan sonra ekleneni seçerstart
- ekleme yaptıktan sonra eklenenin başını seçerend
- ekleme yaptıktan sonra eklenenin sonunu seçer
Belirlenen başlangıç ve bitiş değerlerini input
ya da textarea
içinde seçilmesini sağlar.
<textarea id="test-textarea">textarea mesela</textarea>
<button id="button">Belli Bir Yazıyı Seç</button>
<script>
const textarea = document.getElementById('test-textarea')
const button = document.getElementById('button')
button.addEventListener('click', () => {
textarea.focus()
textarea.setSelectionRange(9, 11)
})
</script>
input
etiketinde tipi number
, time
, date
, range
, month
, week
olan bütün etiketlerin değerlerini azaltmak ve artırmak için kullanılır.
<input type="time" max="17:00" step="900"/> <br>
<input type="date" max="2019-12-25" step="7"/> <br>
<input type="month" max="2019-12" step="12"/> <br>
<input type="number" max="50" step="5"> <br>
<input type="range" value="1" max="10" min="-4">
<hr>
<button id="increment-button">Artır</button>
<button id="decrement-button">Azalt</button>
<script>
const inputs = document.querySelectorAll('input')
const incrementButton = document.getElementById('increment-button')
const decrementButton = document.getElementById('decrement-button')
incrementButton.addEventListener('click', () => {
inputs.forEach(input => {
input.stepUp()
})
})
decrementButton.addEventListener('click', () => {
inputs.forEach(input => {
input.stepDown()
})
})
</script>
Farklı tiplerdeki inputların dialoglarını açmak için kullanılır.
<input type="color"/>
<input type="file"/>
<input type="date"/>
<button>Show All</button>
<script>
const input = document.querySelector('input')
const button = document.querySelector('button')
button.addEventListener('click', () => {
input.showPicker()
})
</script>