Uvod

U ovome članku sam pokušao da sakupim JavaScript isečke koda (eng. code snippets), koji mogu biti korisni u svakodnevnom radu sa DOM-om. Skoro svi snippet-i su napisani u dve verzije, koristeći samo plain JavaScript ili uz pomoć jQuery biblioteke.

js iseci koda - code snippets

Document Ready

U sledećim primerima je prikazan “event listener” koji čeka trenutak kada je DOM učitan da bi JavScript mogao sa njim da manipuliše. Isto bi se dobilo kada bi JavaScript kod stavili na kraj body-ja tj. ispred samog zatvarajućeg taga “body”.

document.addEventListener("DOMContentLoaded", function() {
  // neki kod
}, false);
$(document).ready(function() {
  // neki kod
});
jQuery(document).ready(function ($) {
  // neki kod
});

Document Load

Dogadjaj load se “okida” tek kad se učita cela stranica sa svim CSS stilovima, slikama

window.addEventListener("load", function(event) {
    console.log("All resources finished loading!");
  });
$(window).on('load', function(){
    console.log("All resources finished loading!");
});

Selektovanje DOM elemenata

Selektovanje preko CSS selektora

HTML
<div id="roditelj">
	<span id="prviSpan">Tekst u prvom span-u</span>
	<p id="prviParafraf">Tekst u prvom "p" tag-u</p>
	<span id="izabrani">Tekst u izabranom span-u</span>
	<p id="drugiParafraf">Tekst u drugom "p" tag-u</p>
	<span id="drugiSpan">Tekst u drugom spanu</span>
</div>
JavaScript
Izbor svih elemenata koji zadovoljavaju selektor
document.querySelectorAll("CSSselektor");
Primer
var elementi =document.querySelectorAll('#roditelj p'); // Vraća: "Array like" objekat

var nizElemenata = Array.prototype.slice.call(elementi); //Prebacivanje u niz
nizElemenata.forEach(function(current, index){
  console.log(current);
});
Izbor samo prvog elementa koji zadovoljava selektor

Ukoliko želimo da sa plain JS vratimo samo prvi element koji zadovoljava kriterijum selektora možemo da koristimo:

document.querySelector('selector');
Sintaksa za starije browsere

Ukoliko postoji potreba da se zadovolje browseri koji su stariji od IE 11, onda je potrebno da se koriste sledeći JS selektori:

//za selektovanje elementa preko klase:
document.getElementsByClassName('foo');

//za selektovanje tag elementa
document.getElementsByTagName('a');

//za selektovanje elementa preko ID atributa
document.getElementById('foo'); 
$("CSSselector");
Primer
var elementi =$("p"); //Vraća objekat

var nizElemenata = Array.prototype.slice.call(elementi); //Prebacivanje u niz
    nizElemenata.forEach(function(current, index){
  console.log(current);
});

Selektovanje roditelja

HTML
<div id="roditelj">
	<span id="prviSpan">Tekst u prvom span-u</span>
	<p id="prviParafraf">Tekst u prvom "p" tag-u</p>
	<span id="izabrani">Tekst u izabranom span-u</span>
	<p id="drugiParafraf">Tekst u drugom "p" tag-u</p>
	<span id="drugiSpan">Tekst u drugom spanu</span>
</div>
JavaScript
document.querySelector('#izabrani').parentNode;  //Vraća HTML elemenat koji je "roditelj" selektovanog elementa
$("#izabrani").parent();

Selektovanje sve dece

HTML
<div id="roditelj">
	<span id="prviSpan">Tekst u prvom span-u</span>
	<p id="prviParafraf">Tekst u prvom "p" tag-u</p>
	<span id="izabrani">Tekst u izabranom span-u</span>
	<p id="drugiParafraf">Tekst u drugom "p" tag-u</p>
	<span id="drugiSpan">Tekst u drugom spanu</span>
</div>
JavaScript

Naredne naredbe vraćaju niz elemenata sa svom decom izabranog selektora. U nrednim primerima je potrevon selektovati sve li elemente:

document.querySelector('#roditelj').children; //Vraća "Array like" objekat čija su svojstva svi HTML elementi koji su njegova deca
document.querySelector('#roditelj').childNodes;

NAPOMENA:
Treba naglasiti da “childNodes” vraća kao dete elementa čak i prazan prostor izmedju HTML tagova (kao prazan text node)

$('#roditelj').children(); //Vraća jQuery objekat čija su svojstva svi HTML elementi koji su njegova deca

Selektovanje prvog deteta

HTML
<div id="roditelj">
	<span id="prviSpan">Tekst u prvom span-u</span>
	<p id="prviParafraf">Tekst u prvom "p" tag-u</p>
	<span id="izabrani">Tekst u izabranom span-u</span>
	<p id="drugiParafraf">Tekst u drugom "p" tag-u</p>
	<span id="drugiSpan">Tekst u drugom spanu</span>
</div>
JavaScript

Ukoliko je želite prvo dete onda mogu da se koriste sledeće naredbe:

document.querySelector('#roditelj').firstElementChild;
document.querySelector('#roditelj').firstChild;

NAPOMENA:
Ukoliko postoji prazan prostor izmedju roditeljskog taga i prvog elementa koji mu je dete, neće vratiti taj element nego PRAZAN text node.

$('#roditelj').children().first(); //Vraća 

Selektovanje poslednjeg deteta

HTML
<div id="roditelj">
	<span id="prviSpan">Tekst u prvom span-u</span>
	<p id="prviParafraf">Tekst u prvom "p" tag-u</p>
	<span id="izabrani">Tekst u izabranom span-u</span>
	<p id="drugiParafraf">Tekst u drugom "p" tag-u</p>
	<span id="drugiSpan">Tekst u drugom spanu</span>
</div>
JavaScript
document.querySelector('#roditelj').lastElementChild;
document.querySelector('#roditelj').lastChild;

NAPOMENA:
Ukoliko postoji prazan prostor izmedju roditeljskog taga i poslednjeg elementa koji mu je dete, neće vratiti taj element nego PRAZAN text node.

$('#roditelj').children().last();

Selektovanje prethodnog rodjaka

HTML
<div id="roditelj">
	<span id="prviSpan">Tekst u prvom span-u</span>
	<p id="prviParafraf">Tekst u prvom "p" tag-u</p>
	<span id="izabrani">Tekst u izabranom span-u</span>
	<p id="drugiParafraf">Tekst u drugom "p" tag-u</p>
	<span id="drugiSpan">Tekst u drugom spanu</span>
</div>
JavaScript
document.querySelector("#izabrani").previousElementSibling; // Vraća paragraf id="prviParagraf"
document.querySelector("#izabrani").previousSibling;

NAPOMENA:
Ukoliko postoji prazan prostor izmedju roditeljskog taga i poslednjeg elementa koji mu je dete, neće vratiti taj element nego PRAZAN text node.

$("#izabrani").prev(); // Vraća paragraf id="prviParagraf"

Selektovanje narednog rodjaka

HTML
<div id="roditelj">
	<span id="prviSpan">Tekst u prvom span-u</span>
	<p id="prviParafraf">Tekst u prvom "p" tag-u</p>
	<span id="izabrani">Tekst u izabranom span-u</span>
	<p id="drugiParafraf">Tekst u drugom "p" tag-u</p>
	<span id="drugiSpan">Tekst u drugom spanu</span>
</div>
JavaScript
document.querySelector("#izabrani").nextElementSibling; // Vraća paragraf id="drugiParagraf"
document.querySelector("#izabrani").nextSibling;

NAPOMENA:
Ukoliko postoji prazan prostor izmedju roditeljskog taga i poslednjeg elementa koji mu je dete, neće vratiti taj element nego PRAZAN text node.

$("#izabrani").next();   // Vraća paragraf id="drugiParagraf"

Selektovanje svih rodjaka

HTML
<div id="roditelj">
	<span id="prviSpan">Tekst u prvom span-u</span>
	<p id="prviParafraf">Tekst u prvom "p" tag-u</p>
	<span id="izabrani">Tekst u izabranom span-u</span>
	<p id="drugiParafraf">Tekst u drugom "p" tag-u</p>
	<span id="drugiSpan">Tekst u drugom spanu</span>
</div>
JavaScript

U ovom primeru funkcija nadjiRodjake pravi novi niz od dece roditelja koji zadovoljavaju uslov. Dodaje elemente u niz ako ne postoji filter ili ako filter vraća neki element, sve dok postoji sledeći rodjak.

function nadjiRodjake(el) {
    var nizRodjaci = [];
    el = el.parentNode.firstElementChild;
    do {
      nizRodjaci.push(el);
    } while (el = el.nextElementSibling);
    return nizRodjaci;
}

var izabrani = document.querySelector('#izabrani');
var sviRodjaci = nadjiRodjake(izabrani);  // Vraća niz sa svim rodjacima trazenog elementa
$("#izabrani").siblings();

Filtriranje selektovanih elemenata

Redukovanje elemenata koji zadovoljavaju targetirani selektor ukoliko “prodju” test filtera. Test filtera može biti drugi selektor a najčešće je filter funkcija:

HTML
<div id="roditelj">
	<span id="prviSpan">Tekst u prvom span-u</span>
	<p id="prviParafraf">Tekst u prvom "p" tag-u</p>
	<span id="izabrani">Tekst u izabranom span-u</span>
	<p id="drugiParafraf">Tekst u drugom "p" tag-u</p>
	<span id="drugiSpan">Tekst u drugom spanu</span>
</div>
JavaScript
function filtrirajRodjake(el, filterTag) {
    var nizRodjaci = [];
    var el = el.parentNode.firstElementChild;
    var proveraElemenata = function (el, filterTag) {
      return el.nodeName.toLowerCase() == filterTag;    // Vraća: TRUE ili FALSE
    }
    do {
      if (!proveraElemenata || proveraElemenata(el,filterTag)){  // Ubacuje el. koji zadovaljavaju proveru u niz
        nizRodjaci.push(el);
      }
    } while (el = el.nextElementSibling);
    return nizRodjaci;
}

var izabrani = document.querySelector('#izabrani');
var filtriraniRodjaci = filtrirajRodjake(izabrani, "span");  // Vraća: sve  rodjake
$( "span" )
  .filter( "#izabrani" )
  .css( "background", "red" );

ili koristeći funkciju

$( "span" )
  .filter(function( indexElementaNiza ) {
    return  $( this ).attr( "id" ) === "izabrani";
  })
  .css( "background", "red" );

Manipulacija DOM elementima

Pravljenje elementa

var el = document.createElement('div');
var el = $('div');

Dodavanje elementa kao deteta

Dodavanje novog elementa kao poslednjeg deteta kod svakog selektovanog elementa.

//Element kome se dodaje novi element
var roditelj = document.querySelector('#roditelj');

//Kreiranje novog elementa
var newDiv = document.createElement('div');
var newP = document.createElement('p');
var newText = document.createTextNode('Hello World!');

//dodavanje elemenata kao dete
newP.appendChild(newText);
newDiv.appendChild(newP);
roditelj.appendChild(newDiv);
//Element kome se dodaje novi element
var roditelj = document.querySelector('#roditelj');

//dodavanje novog sadrzaja kao dete
roditelj.innerHTML += '<div><p>Hello World!</p></div>';

NAPOMENA:
Obratiti pažnju da se uz innerHTML koristi operator dodavanja i dodeljivanja “+=”, jer ako se koristi samo operator dedeljivanja “=” onda se pri menjanju DOM-a gaze svi elementi unutar elementa “roditelj” i pravi se novi modifikovani DOM, a ako postoje Event handlers koji su bili zakačeni za “stari DOM”, sada NE POSTOJE!

I varijanta
   //Element kome se dodaje novi element
   var roditelj = $('#roditelj');

   //Kreiranje novog elementa
   var newDiv = $('<div>');
   var newP = $('<p>');
   var newText = $.parseHTML('Hello World!');

   //dodavanje elemenata kao dete
   newP.append(newText);
   newDiv.append(newP);
   roditelj.append(<div>); 
II varijanta:
$('#roditelj').append("<div><p>Hello World!</p></div>")

Kloniranje elementa

var el = document.querySelector('#izabrani');
var roditelj = document.querySelector('#roditelj');

var klon = el.cloneNode(true);
roditelj.appendChild(klon);

Ukoliko je parametar “true” pravi se “deep copy” tj. kopija sa svim atributima i “child” elementima, dok ako se izabere “false” kopira se bez “child” elemenata.

var izabrani = $( "#izabrani" ).clone();
izabrani.appendTo( "#roditelj" );

Dodavanje pre elementa

var insertedNode = parentNode.insertBefore(newNode, referenceNode);

Ako je referenceNode null onda se ubacuje na kraju liste svih childNodes (isto kao appendChild).

Primer dodavanja elementa u listu
var noviElement = document.createElement("p");
var tekstElementa = document.createTextNode("Tekst unutar novog elementa");
noviElement.appendChild(tekstElementa);

var roditelj = document.getElementById("roditelj");
var refElement = roditelj.children[2];

roditelj.insertBefore(noviElement, refElement);  //Ubacuje novi element ispred span-a sa id="izabrani" 
//Dodaj pre izabranog elementa nešto
$('#izabrani').before("<div>Hello World!</div>");
//Dodaj nešto pre izabranog elementa
$("<div>Hello World!</div>").insertBefore('#izabrani');

Dodavanje posle elementa

Iako u JavaScript-u postoji insertBefore, medjutim NE POSTOJI insertAfter, stoga je potrebno da se pribegne “lukavstvu”:

function insertAfter(el, referenceNode) {
    referenceNode.parentNode.insertBefore(el, referenceNode.nextSibling);
}
Primer dodavanja elementa u listu
var noviElement = document.createElement('div');
noviElement.innerHTML = '<p>Hello World!</p>';
var refNode = document.querySelector('div.before');

insertAfter(noviElement, refNode);
//Dodaj nešto posle izabranog elementa
$("<div>Hello World!</div>").insertAfter('#izabrani');
//Dodaj posle izabranog elementa nešto
$('#izabrani').after("<div>Hello World!</div>");

Brisanje elementa

var izabrani = document.querySelector("#izabrani");
izabrani.parentNode.removeChild(izabrani);
$('span').remove(); 

Brise SVE span elemente

$('span').remove('#izabrani');

Brise samo span elemente sa ID=”izabrani”

Brisanje sve dece elementa

var el = document.querySelector('#izabrani');
el.innerHTML = '';
$( "#izabrani" ).empty();

Obavijanje elementa sa elementom

HTML
<span id="izabrani">Tekst u izabranom span-u</span> 
JavaScript
Array.prototype.forEach.call(document.querySelectorAll('#izabrani'), (el) => {
  const obavijajuciDiv = document.createElement('div');
  obavijajuciDiv.className = 'omotac';
  el.parentNode.insertBefore(obavijajuciDiv, el);
  el.parentNode.removeChild(el);
  obavijajuciDiv.appendChild(el);
});
$('#izabrani').wrap('<div class="omotac"></div>');
Rezultat
<div class="omotac">
    <span id="izabrani">3. Tekst u izabranom span-u </span>
</div>

Zamena elementa drugim

HTML
<span id="izabrani">Tekst u izabranom span-u</span> 
JavaScript
el.parentNode.replaceChild(newEl, el)
Primer
//Izbor elementa koji se zamenjuje
var el = document.querySelector('#izabrani');

//Kreiranje novog elementa koji će da zauzme mesto
var newEl = document.createElement('p');
newEl.innerHTML = '<strong>Hello World!</strong>';

//Zamena elemenata:
el.parentNode.replaceChild(newEl, el);
$('#izabrani').replaceWith('<p><strong>Hello World!</strong></p>');

Provera da li postoji selektor (is)

var el = document.querySelector('p');
el.matches('#izabrani');
$(li).is(":first-child");
Primer

U narednim snippet-ima se dobija booleanova vrednost, stoga ako je odgovor “true” onda su jednaki selektori. Uglavnom se koristi uz “if”.

$("li").click(function () {
   if ($(this).is(":first-child")) {
      $("p").text("This is list item 1");
   } else if ($(this).is(".middle")) {
      $("p").text("This is middle class list");
   } else if ($(this).is(":contains('item 5')")) {
      $("p").text("It's 5th list");
   }
});

Rad sa sadržajem DOM-a

Dobijanje sadržaja (teksta) unutar elementa

<div id="roditelj">
  <span id="prviSpan">Tekst <strong>u prvom</strong> span-u </span>
</div>

Naredni snippet-i vraćaju tekst odredjenog elementa:

var el = document.getElementById("prviSpan");

// Vraća samo text (ignoriše HTML formatiranje npr.<strong>) i prilično je brza
var tekst = el.textContent;     // Vraća: Tekst u prvom span-u

// Vraća  tekst sa HTML tagovima (malo je sporije jer mora da parsira HTML)
var tekst = el.innerHTML;       // Vraća: Tekst <strong>u prvom</strong> span-u

// Vraća tekst ali CSS utiče na izlaz (ukoliko je visibility: hidden ne prikazuje tekst),
// uveo je IE i nije standardizovano sa W3C pa nije bas preporucljivo
var tekst = el.innerText;
var el = $("#prviSpan");

// Vraća samo tekst
var text = el.text();           // Vraća: Tekst u prvom span-u

// Vraća tekst sa HTML tagovima
var text = el.html()            //Vraća: Tekst <strong>u prvom</strong> span-u

Ubacivanje ili zamena sadržaja (teksta) unutar elementa

<div id="roditelj">
  <span id="prviSpan">Tekst <strong>u prvom</strong> span-u </span>
</div>

Naredni snippet-i menjaju postojeći tekst sa novim:

var el = document.getElementById("prviSpan");

// Ubacije i menja postojeći tekst
el.textContent= "Novi tekst";

// Ubacuje tekst čak i sa HTML (malo je sporije jer parsira HTML)
el.innerHTML= "Novi <strong>tekst</strong>";

// Ubacuje tekst čak ali CSS utiče na izlaz (ukoliko je visibility: hidden ne prikazuje tekst),
// uveo je IE i nije standardizovano sa W3C pa nije bas preporucljivo
el.innerText= "Novi tekst";
var el = $("#prviSpan");

// Ubacuje i menja posrotjeći tekst
el.text("Novi tekst");

// Ubacuje tekst čak i sa HTML
el.html("Novi <strong>tekst</strong>");

outerHTML elementa

HTML
<div id="roditelj">
	<span id="prviSpan">Tekst u prvom span-u</span>
	<p id="prviParafraf">Tekst u prvom "p" tag-u</p>
	<span id="izabrani">Tekst u izabranom span-u</span>
	<p id="drugiParafraf">Tekst u drugom "p" tag-u</p>
	<span id="drugiSpan">Tekst u drugom spanu</span>
</div>
JavaScript

Za HTML prezentaciju selektovanog elementa koristimo:

var outerHTML = document.querySelector("#izabrani").outerHTML;
console.log(outerHTML);  //Vraća: "Tekst u izabranom span-u"

Jedan od retkih slučajeva kada jQuery nema direktnu metodu za neki problem a Plain JS ga ima, stoga se rešava zaobilazno (u “privremenom div elementu klonira naš element).

console.log($('<div>').append($("#izabrani").clone()).html()); //Vraća "Tekst u izabranom span-u"

Vrednost unutar “input” ili “textarea”

document.querySelector('#nekiInput').value;
Primer
<input id="text-unos" value="pocetna vrednost" type="text" />
<p id="ispis"></p>
JavaScript
var elUnos = document.querySelector("#text-unos");
var ispis = document.querySelector("#ispis");
var pocetnaVrednost = elUnos.value;
ispis.textContent= pocetnaVrednost;

elUnos.addEventListener("keyup", function(){
  var vrednostUnosa =  elUnos.value ;
  ispis.textContent= vrednostUnosa;
}, false);
$('selectori').val();
Primer
<input id="text-unos" value="pocetna vrednost" type="text" />
<p id="ispis"></p>
JavaScript
// Dobijanja vrednosti inputa i njegovo štampanje u paragraf sa id="ispis"
$( "#text-unos" )
  .keyup();  // Okidač eventa koji kupi default-ni value inputa
  .keyup(function() {
    var value = $( this ).val();
    $( "#ispis" ).text( value );
  })
  

Radio unput

HTML
<form id="radioForm">
    <label>Prvi izbor: <input type="radio" name="radioBtn" value="Prvi" /></label>
    <label>Drugi izbor: <input type="radio" name="radioBtn" value="Drugi"/></label>
    <label>Treci izbor: <input type="radio" name="radioBtn" value="Treci" /></label>
    <label>Cetvrti izbor: <input type="radio" name="radioBtn" value="Cetvrti" /></label>
</form>
JavaScript
var elRadioInput = document.forms['radioForm'].elements['radioBtn'];
var len = elRadioInput.length;

for (var i=0; i <= len; i++) {
  elRadioInput[i].onclick = function(e) {
    var indexRadioBtn = Array.prototype.indexOf.call(elRadioInput, e.currentTarget) +1;  // Umesto "e.currentTarget.value"  može da se koristi i "this.value"
    var vrednost = e.currentTarget.value;
    console.log("Selektovan je " + indexRadioBtn + ' radioBtn ' + " čija je vrednost " + vrednost);
  };
}
var elRadioInput = $('#radioForm input');
var len = elRadioInput.length;

for (var i=0; i <= len; i++) {
  elRadioInput[i].onclick = function(e) {
    var indexRadioBtn = elRadioInput.index(e.currentTarget) + 1;  // Umesto "e.currentTarget.value"  može da se koristi i "this.value"
    var vrednost = e.currentTarget.value;
    console.log("Selektovan je " + indexRadioBtn + ' radioBtn' + " čija je vrednost " + vrednost);
  };
}  

Select

HTML
<select id="pozicija">
  <option value="direktor">Direktor</option>
  <option value="poslovodja">Poslovodja</option>
  <option value="radnik">Radnik</option>
</select>
JavaScript
var select = document.getElementById("pozicija");
var izborPozicije = "direktor";

select.addEventListener("change", function(){
  izborPozicije = select.options[select.selectedIndex].value;
  console.log(izborPozicije);
})
var izborPozicije = "direktor";

$("#pozicija").change(function(){
  izborPozicije = $("#pozicija  option:selected").val();
  console.log(izborPozicije);
})

Rad sa HTML atributima

Dobijanje vrednosti HTML atributa

NAPOMENA:
Atributi: href, title, alt, i value imaju svoje "lično" svojstvo za pristup, stoga im se može lako pristupiti direktno preko njih:

var unos = document.querySelector('selector').value;
var link = document.querySelector('selector').href;  // Vraća: full path http://example.com/deo/clanak.html
var title = document.querySelector('selector').title; 

HTML
<form>
  <input type="checkbox" name="vehicle" value="Bike" checked> I have a bike<br>
</form>

Ostalim atributima koji nemaju svoju "ličnu" metodu možemo pristupiti na sledeći način:

el.getAttribute('name'); // Vraca vrednost atributa "vehicle"
$('input').attr('name'); // Vraca vrednost "vehicle"

Dobijanje vrednosti DATA atributa

Moram napomenuti da se ovaj podatak se može dobiti lako i prethodnim načinom kao običan HTML atribut.

NAPOMENA:
Ne koristiti velika slova u nazivima data atributa već koristiti crtice izmedju!

HTML
<p class="person" data-index-no="123">Pera Perić</p>
JavaScript
var el = document.querySelector('.person');
el.getAttribute('data-index-no');

// Za E11+ može da se koristi novija naredba ali sa camelCase jer ne podržava crtice!:
el.dataset['indexNo'];
ili
var b = el.dataset.indexNo;

NAPOMENA:
Pri pozivanju u sklopu "dataset" syntax-e koristiti camelCase!

$('.person').data('index-no');
// isti efekat se dobija kada umesto crtice koristimo cameCase
$('.person').data('indexNo') 

Setovanje vrednosti atributa

NAPOMENA:
Atributi: href, title, alt, i value imaju svoje "lično" svojstvo za pristup, stoga im se može lako pristupiti direktno preko njih:

document.querySelector('selector').value = "neki unos";
document.querySelector('selector').href = "var link = document.querySelector('selector').href = ";
document.querySelector('selector').title="Ovo je title"; 

HTML
<form>
  <input type="checkbox" name="vehicle" value="Bike" checked> I have a bike<br>
</form>

JavaScript
var el = document.querySelector('#text-unos');
el.setAttribute('name', 'input-polje');
$('#text-unos').attr('name', 'input-polje');

NAPOMENA:
Dodati atributi se ne vide fizički u DOM-u, nego su sačuvani u memoriji.

Provera da li elemenat ima klasu

el.classList.contains(className);

NAPOMENA:
Objekat classList nije podržan kod IE za verzije manje od IE10

$el.hasClass(className);

Dodavanje klase elementu

el.classList.add(className);

NAPOMENA:
Objekat classList nije podržan kod IE za verzije manje od IE10

$el.addClass(className);

Uklanjanje klase

el.classList.remove(className);

NAPOMENA:
Ovaj objekat classList nije podržan kod IE za verzije manje od IE10

$el.removeClass(className);

Naizmenično dodavanje i brisanje klase (togle)

HTML
<div id="roditelj">
	<span id="prviSpan">Tekst u prvom span-u</span>
	<p id="prviParafraf">Tekst u prvom "p" tag-u</p>
	<span id="izabrani">Tekst u izabranom span-u</span>
	<p id="drugiParafraf">Tekst u drugom "p" tag-u</p>
	<span id="drugiSpan">Tekst u drugom spanu</span>
</div>
JavaScript
Bez toggle()

See the Pen Toogle plainJS by Web programiranje (@chos) on CodePen.

Sa togle()
el.classList.toggle("className");

NAPOMENA:
Ova metoda nije podržana u IE (pogledajte tabelu kompatibilnosti ovde)

Primer
var el = document.getElementById('prviSpan');
el.onclick = function () {
  el.classList.toggle("nazivKlase");
}
Mix

Ili mix prethodna dva primera

See the Pen EvaKoN by Web programiranje (@chos) on CodePen.


$el.toggleClass("nazivKlase");
Primer
 $("#prviSpan").on("click", function(){
   $("#prviSpan").toggleClass("nazivKlase");
 });

Styling elementa

Dobijanje svojstava elementa

Pošto "getComputedStyle()" metoda vraća vrednosti svih svojstava u vidu "CSSStyleDeclaration" objekata, potrebno je koristi još i metodu getPropertyValue:

window.getComputedStyle(el,null).getPropertyValue("CSSsvojstvo")
Primer
var el = document.getElementById('izabrani');

var styleValue = window.getComputedStyle(el,null).getPropertyValue("font-size");
console.log(styleValue);  //Vraća vrednost uvek u px
$(el).css("CSSsvojstvo"); // Vraća vrednost CSS svojstva
Primer
var el = $("#izabrani");
var styleValue = el.css("fontSize"); // Vraća vrednost
console.log(styleValue);  //Vraća vrednost uvek u px

Definisanje CSS svojstava elementu

Definisanje jednog svojstva
el.style.CSSsvosjstvo = "vrednost";
Primer
var el = document.getElementById('izabrani');
el.style.fontSize = "50px";
Definisanje više svojstava odjednom
function css(el, styles) {
    for (var property in styles)
        el.style[property] = styles[property];
} 
Primer
var el = document.getElementById('izabrani');
css(el, { background: 'red', 'font-size': '25px' });
Definisanje vrednosti svojstva
$('#izabrani').css("display", "block"); // Definiše vrednost svojstva
Definisanje više svojstava odjednom
$('#izabrani').css({
	"font-size" : "25px",
	"background" : "red"
});

Show, hide i toggle

NAPOMENA:
Metode show() i toggle() zahtevaju i drugi atribut koji može biti: "block", "flex" "inline-block", "inline" ...

function hide(el) {
    el.style.display = 'none';
}

function show(el, vrednostDisplay) {
    el.style.display = vrednostDisplay || "block";
}

function toggle(el, vrednostDisplay) {
    var display = (window.getComputedStyle ? getComputedStyle(el, null) : el.currentStyle).display;
    if (display == 'none') el.style.display = vrednostDisplay || "block";;
    else el.style.display = 'none';
}
Primer
<div id="roditelj">
	<span id="prviSpan">Tekst u prvom span-u</span>
	<p id="prviParafraf">Tekst u prvom "p" tag-u</p>
	<span id="izabrani">Tekst u izabranom span-u</span>
	<p id="drugiParafraf">Tekst u drugom "p" tag-u</p>
	<span id="drugiSpan">Tekst u drugom spanu</span>
</div>

<button id="btn">Toggle</button>

<script>
   var el = document.querySelector("#izabrani");
   var btn =document.querySelector("#btn");

   btn.addEventListener("click", function(){
       toggle(el, "block");
   })
</script> 
$( "#izabrani" ).show()
$( "#izabrani" ).hide();
$( "#izabrani" ).toggle();

NAPOMENA:
Sve tri metode imaju "ugradjenu" animaciju. Ukoliko želimo animaciju dovoljno je da prosledimo atribut funkciji koji definiše dužinu trajanja animacije. Sa ovim metodama se animira width, height, i opacity simultano. Takodje je moguće sa drugim atributom promeniti defaultni tip animacije "swing".

Primer
<div id="roditelj">
	<span id="prviSpan">Tekst u prvom span-u</span>
	<p id="prviParafraf">Tekst u prvom "p" tag-u</p>
	<span id="izabrani">Tekst u izabranom span-u</span>
	<p id="drugiParafraf">Tekst u drugom "p" tag-u</p>
	<span id="drugiSpan">Tekst u drugom spanu</span>
</div>

<button id="btn">Toggle</button>

<script>
  var btn = document.querySelector("#btn");
  btn.addEventListener("click", function(){
    $( "#izabrani" ).toggle(1000);
  })
</script> 

Pozicija elementa

Visina i širina elementa

Box sa padding-om i border-om
var box = document.querySelector('#izabrani');

var width = box.offsetWidth;
var height = box.offsetHeight;
console.log(width, height);

Slično može da se dobije sa getBoundingClientRect() metodom (podržana >=IE9)

var obj = document.querySelector('#izabrani');
var rect = obj.getBoundingClientRect();
console.log(rect.width, rect.height);
Box sa podding-om, borderom i marginom
function outerWidth(el) {
  var width = el.offsetWidth;
  var style = getComputedStyle(el);

  width += parseInt(style.marginLeft) + parseInt(style.marginRight);
  return width;
}

outerWidth(el);
Box bez border-a
var box = document.querySelector('#izabrani');

var widthNoBorder = box.clientWidth;
var heightNoBorder = box.clientHeight;
console.log(widthNoBorder, heightNoBorder);
Box sa padding-om i border-om
var box = $('#izabrani');

var width = box.outerWidth();
var height = box.outerHeight();
console.log(width, height);
Box sa podding-om, borderom i marginom
var box = $('#izabrani');

var width = box.outerWidth(true);
var height = box.outerHeight(true);
console.log(width, height);
Box bez border-a
var box = $('#izabrani');

var widthNoBorder = box.innerWidth();
var heightNoBorder = box.innerHeight();
console.log(widthNoBorder, heightNoBorder);

Rastojanje elementa do roditelja

Vrednost od ivice izabranog elementa do ivice prvog "ne statičnnog" roditelja (onaj koji nema svojstvo position:"static"). Posmatra se leva i gornja ivica elementa.

var el = document.querySelector('#izabrani');
var doLeveIviceRoditelje = el.offsetLeft;
var doGornjeIviceRoditelje = el.offsetTop
var el = $('#izabrani');
var doLeveIviceRoditelje = el.position().left;
var doGornjeIviceRoditelje = el.position().top;

Rastojanje elementa do dokumenta

function offset(el) {
    var rectLeft = el.getBoundingClientRect().left,
    var rectTop = el.getBoundingClientRect().top,
    scrollLeft = window.pageXOffset || document.documentElement.scrollLeft,
    scrollTop = window.pageYOffset || document.documentElement.scrollTop;

    return { top: rectTop + scrollTop, left: rectLeft + scrollLeft }
} 
Primer
var izabrani = document.querySelector('#izabrani');
var rastojanje = offset(izabrani);
console.log(rastojanje.left, rastojanje.top);

Slično može da se dobije sa getBoundingClientRect() metodom:

var obj = document.querySelector('#izabrani');
var rect = obj.getBoundingClientRect();
console.log(rect.left, rect.top, rect.right, rect.bottom);
var izabrani = $('#izabrani');
var rastojanje = izabrani.offset();
console.log(rastojanje.left, rastojanje.top);

Provera vidljivosti elementa u viewport-u

Sa narednim snippet-om proveravamo dali je izabrani element ceo vidljiv u viewport-u.

function isInViewport(element) {
  var rect = element.getBoundingClientRect();
  var html = document.documentElement;
  return (
    rect.top >= 0 &&
    rect.left >= 0 &&
    rect.bottom <= (window.innerHeight || html.clientHeight) &&
    rect.right <= (window.innerWidth || html.clientWidth)
  );
}  // Vraća TRUE ili FALSE
Primer
var img = document.querySelector('img');
isInViewport(img); // Vraća "true" ako je ceo element u viewport-u

Scroll

Metoda koja vraća vrednost za koliko je skrolovan viewport nekog elementa je:

el.scrollTop;

Za window/document možemo da koristimo i:

  • window.pageYOffset - nema podršku verzije < IE9
  • window.scrollY - nema podršku za IE
  • document.documentElement.scrollTop

Ali da bi postigli što veću cross browser kompatibilnost dobro je koristi sledeći izraz:

var vrednostScrolla =  window.pageYOffset || document.documentElement.scrollTop || body.scrollTop || 0;

See the Pen JS scroll by Web programiranje (@chos) on CodePen.


Metoda koja vraća vrednost za koliko je skrolovan viewport nekog elementa je:

el.scrollTop();

See the Pen jQuery scroll by Web programiranje (@chos) on CodePen.


Pozicija miša pri clik dogadjaju

document.addEventListener('click', function (e) {
    e = e || window.event;
    var pageX = e.pageX;
    var pageY = e.pageY;
    console.log(pageX, pageY);
});
$("body").click(function(e){
   var parentOffset = $(this).parent().offset();
   var relX = e.pageX - parentOffset.left;
   var relY = e.pageY - parentOffset.top;
   console.log(relX, relY);
});

Ukoliko se umesto taga body izabere neki drugi element dobijaćemo relativnu poziciju u odnosu na njega

Podelite:

Ostavite komentar