Що е polyfill и има ли то почва у нас?

Например за HTML, от polyfill имаме нужда, когато с помощта на JavaScript създаваме функционалност, която липсва в самият HTML.

Или когато трябва да можем да симулираме дадена функционалност на по-стари браузъри, които те нямат вродено.

Selectivizr например.

A polyfill is a piece of code (or plugin) that provides the technology that you, the developer, expect the browser to provide natively.

Възможно е и за други езици и технологии да има възможност за използване на такива „сурогати“.

display: none; vs. visibility: hidden;

display: none; ще скрие елементът така, че все едно изобщо го няма. Без да запазва мястото му в лейаута. Тоест, при използване на display: none; лейаутът ще се промени съобразно с освободеното място.

visibility: hidden; пак ще скрие елемента, но ще запази мястото му в лейаута без да го размества (лейаута).

Добра аналогия би била: с display: none; вземаме нещо от някъде и го махаме, пренареждайки останалите неща (ако е необходимо).

С visibility: hidden; само го правим невидимо, но то си е пак там, подобно на Невидимият, дето може да го пипнеш и без да го виждаш.

С display: none; човекът не става невидим, а по-скоро излиза от стаята.

Но и в двата случая, елементите остават в DOM-a и са достъпни с JavaSctipt.

JS object reference

В JavaScript, променливите за обект, съдържат reference към обекта, а не самият обект, подобно на PHP.

Например:

var a = {
    aaa : 123123
};

var b = a;

a.aaa = 456456;
console.dir(b);

ще върне:

Object aaa: 456456

Променяме ли оригиналният, променя се и огледалният.

Prototypejs framework

JS фреймуърк, който е много подобен на jQuery, но не толкова използван.

Например това на Prototypejs

document.getElementById("id_of_element").style.color = "#ffffff";

на jQuery e:

$("id_of_element").setStyle({color: '#ffffff'});

Литература:

https://stackoverflow.com/questions/2644556/prototype-vs-jquery-strengths-and-weaknesses

https://www.w3schools.com/js/js_object_prototypes.asp

XMLHttpRequest

https://www.w3schools.com/xml/xml_http.asp

https://javascript.info/xmlhttprequest

All modern browsers have a built-in XMLHttpRequest object to request data from a server.

По-скоро клас, не обект, защото за да го използваш трябва да го инстанцираш.

var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
        // Typical action to be performed when the document is ready
        document.getElementById("demo").innerHTML = xhttp.responseText;
    }
};
xhttp.open("GET", "filename", true);
xhttp.send();

Използва се за HTTP комуникация със сървъра, идва си с методи като send и пропъртита като onreadystatechange и други…

Може да се използва синхронно или асинхронно.

Ajax

От къде идва А-то (асинхронен) в Ajax? Защо асинхронен?

По принцип зареждането на една уеб страница протича на два основни етапа:
data interchange и data presentation.
За да се случи второто, трябва напълно да завърши първото.
В такъв смисъл се казва, че целият процес е синхронен.

При Ajax пак трябва да имаме първо едното, после другото,
или само data interchange, без data presentation,
но това може да стане без никакъв синхрон основната странца (с гореспоменатият „цял процес“).

Ето я асинхронността.

А конкретно Ajax е един вид съвкупност от няколко технологии с помощта на които се реализира горната идея:
1) HTML и CSS за data presentation;
2) DOM за динамично манипулиране на отделните части на страницата;
3) JSON или XML за data interchange;
4) XMLHttpRequest и JavaScript да координира всичко това.

What is the meaning of symbol $ in jQuery?

https://stackoverflow.com/questions/1049112/what-is-the-meaning-of-symbol-in-jquery

By default, jQuery uses „$“ as a shortcut for „jQuery“

So, using $(„#id“) or jQuery(„#id“) is the same.

You can use „$“ as a function name in JavaScript. It is shorthand for jQuery(). Which you can use if you want. jQuery can be ran in compatibility mode if another library is using the $ already. Just use jQuery.noConflict(). $ is pretty commonly used as a selector function in JS.

$(document).ready() vs. $(window).load(function()

https://learn.jquery.com/using-jquery-core/document-ready/

Първото (ready) се стартира когато HTML-ът е зареден, без значение дали картинките например са заредени.

Второто (load) – когато цялата страница е заредена – картинки и прочее.

A page can’t be manipulated safely until the document is „ready.“ jQuery detects this state of readiness for you. Code included inside $(document).ready() will only run once the page DOM is ready for JavaScript code to execute. Code included inside $(window).on("load", function() { ... }) will run once the entire page (images or iframes), not just the DOM, is ready.

https://stackoverflow.com/questions/4584373/difference-between-window-load-and-document-ready-functions

  • document.ready is a jQuery event, it runs when the DOM is ready, e.g. all elements are there to be found/used, but not necessarily all content.
  • window.onload fires later (or at the same time in the worst/failing cases) when images and such are loaded, so if you’re using image dimensions for example, you often want to use this instead.
$(document).ready(function() {
    // executes when HTML-Document is loaded and DOM is ready
    alert("document is ready");
});
$(window).load(function() {
    // executes when complete page is fully loaded, including all frames,
    // objects and images
    alert("window is loaded");
});

JS overriding

В JS явно няма overriding, защото ако предифинираш (оверрайднеш) функция, както по-долу, JS ще хойстне втората над първата.

function bar(){
    return 111;
}

function bar(a){
    return a;
}

alert(bar());
alert(bar(999));

Ще алертне първо undefined после 999 , защото ще използва втората функция.

JavaScript evaluates expressions from left to right

JavaScript evaluates expressions from left to right. Different sequences of one and the same operands can produce different results:
var x = 16 + 4 + „Volvo“;   // x becomes „20Volvo“
and
var x = „Volvo“ + 16 + 4;    // x becomes „Volvo164“

In JavaScript, a variable without a value, has the value undefined. Its type /typeof()/ is also undefined.
var car; // Value is undefined, type is undefined

Any variable can be emptied, by setting the value to undefined. The type will also be undefined.
car = undefined; // Value is undefined, type is undefined

length след изтриване на елемент

В JS като изтриеш елемент на масив, мястото му остава празно, а length не му се променя

var ccc = [111, 222, 333, 444];

console.log(ccc);
(4) [111, 222, 333, 444]
length:4

delete ccc[2];

console.log(ccc);
(4) [111, 222, empty × 1, 444]
length:4

Защо typeof null дава ‘object’?

До колкото разбрах, причините са исторически – още от първите версии на JS, променливите имали тип и стойност. Типът бил някакъв системен код, който код, специално за типа „обект“ бил 0.

Обаче и самата стойност NULL в JS се представяла като 0.
И така се получило нещо като съвпадение.

this… that…

(function(w){
    w.propEdno = 100;
    w.metoEdno = function(){
        alert(w.propEdno * 100);

        metoDve();

        this.metoTri();
    };

    var propDve = 200;
    var metoDve = function(){
        alert(propDve * 200);
    };

    this.propTri = 300;
    this.metoTri = function(){
        alert(propDve * this.propTri * 300);
    };
})(window);

// Ще алертне 10000, после 40000, после 18000000
window.metoEdno();

// Ще алертне 18000000
window.metoTri();

// Ще алертне 300
alert(window.propTri);

Демек, тези които са this.* са пъблик.

Self invoking functions

()();


(function(){})();


(function(w){
w.propEdno = 100;
w.metoEdno = function(){
alert(w.propEdno * 100);
};

var propDve = 200;
var metoDve = function(){
alert(this.propDve * 100);
};

this.propTri = 300;
this.metoTri = function(){
alert(this.propTri * 100);
};
})(window);

window.metoEdno();
window.metoDve();
window.metoTri(); metoTri(); this.metoTri();

window.metoEdno(); ще алертне 10,000, защото така metoEdno() и propEdno стават метод и пропърти на window обекта.

propDve и window.metoDve(); са private и ще дадат грешка от рода на Uncaught TypeError: window.metoDve is not a function… Те не могат да се викат отвън.

window.metoTri(); metoTri(); this.metoTri(); ще алертне 30,000 три пъти, защото:
1. първият път metoTri() и propTri стават public част от window обектът;
2. вторият път и двете стават public – от глобалният скоуп;
3. третия път this прави metoTri() и propTri също public.

JavaScript-ища

В JavaScript e напълно допустимо да се използва dollar sign $ пред името на променлива, но понеже така е прието да се именуват jQuery обектите, затова не добра идея.

Strings are concatenated via the plus (+) operator, which converts the other operand to a string if one of the operands is a string:

alert(11 + 22 + 44 + 'bloa' + null);  // алертва 77bloanull

Демек, и един стринг да има, всичко става буквално стринг, даже null става стринг ‘null’

function func1(){
this.tova = 11111;
}
var m = new func1();
console.log(m.tova); // Ще логне 11111

function func2() {
carName = '2222222';
}
console.log(carName);

Uncaught ReferenceError: carName is not defined

JS hoisting

function tomato(){
    alert('Tomato one');
}

tomato();

function tomato(){
    alert('Tomato two');
}

tomato();

Will alert „Tomato two“ two times because the second „tomato()“ function will be hoisted above the fitrts one.

For functions – yes, but not for function expressions. There won’t be hoisting.

var tomato = function tomato(){
    alert('Tomato one');
}

tomato();

var tomato = function tomato(){
    alert('Tomato two');
}

tomato();

Will alert „Tomato one“
And if you call tomato() again under the second function tomato()… „Tomato one“ and „Tomato two“ will be alerted.

So, if we have function expression – NO HOISTING,

But if we have declared function – it will be hoisted because it is so called „executable portion of the code“.

Hoisting only moves the declaration, the assignments are left in place.