• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Bug w JavaScript? Odwołanie się do elementu HTML poprzez nazwę jego ID, ale bez pobierania go.

Object Storage Arubacloud
+1 głos
1,002 wizyt
pytanie zadane 24 kwietnia 2016 w JavaScript przez ScriptyChris Mędrzec (190,190 p.)
edycja 24 kwietnia 2016 przez ScriptyChris

Napotkałem dziwną sytuację w JS. Mianowicie odwołałem się do elementu HTML używając po prostu nazwy jego ID, ale bez wcześniejszego pobrania tego elementu przez ID np. za pomocą document.getElementById(); Poza tym jako tekst paragrafu umieściłem ID tegoż elementu.

Kod: https://jsfiddle.net/trm6ayde/

Screen: http://imgur.com/HSpIyZS

Jak to jest możliwe? Jedyne co mi przychodzi do głowy, to że "nieMozliwe" zostało potraktowane jako zmienna globalna (bo nigdzie jej nie deklarowałem słówkiem var) i JS z automatu skojarzył tą nazwę (zmienną?) z ID elementu HTML. Czy to jakiś bug JavaScriptu?

Sytuacja nie ulega zmianie nawet z użyciem IIFE i 'use strict' https://jsfiddle.net/trm6ayde/1/

1 odpowiedź

+4 głosów
odpowiedź 24 kwietnia 2016 przez Comandeer Guru (601,530 p.)
wybrane 24 kwietnia 2016 przez ScriptyChris
 
Najlepsza

https://www.w3.org/TR/html5/browsers.html#named-access-on-the-window-object:

The Window interface supports named properties. The supported property names at any moment consist of the following, in tree order, ignoring later duplicates:

[…]

W skrócie: każdy element, który ma atrybut [id] wypływa do globalnego scope i jest to ustandaryzowane jako część HTML5. A wzięło się to stąd, że w czasach Netscape i IE, gdy coś takiego jak DOM de facto nie istniało, tak się odwoływano do obiektów. A że Sieci nie można psuć itd., to zamiast wywalić ten bullshit, ustandaryzowano go. 

3
komentarz 24 kwietnia 2016 przez Comandeer Guru (601,530 p.)
Ah – no i to nie jest bug w JS, a w DOM, jak już ;)
1
komentarz 24 kwietnia 2016 przez ScriptyChris Mędrzec (190,190 p.)

Czy użycie 'use strict' nie powinno tego ograniczać w jakiś sposób? Czy, jeśli w specyfikacji HTML coś jest ustandaryzowane, ale ogólnie nie jest bezpieczne w użytkowaniu albo nie należy do praktyk Clean Code, to czy choćby ECMA nie jest skłonna tego naprawić albo ograniczyć implementując do JavaScript jakiś mechanizm, który by wyrzucał błąd? Tak jak jest to w przypadku słówka this w środku funkcji wewnątrz metody obiektu:

http://forum.pasja-informatyki.pl/51989/jak-zapisac-this-podczas-tworzenia-obiektu-bez-konstruktora?show=51989#q51989

(...) Funkcja zadeklarowana wewnątrz metody nie trzyma już wartości this, nie jest przypisana do żadnego obiektu - a to zwyczajowo oznacza, że w takim wypadku this === window. Takie zachowanie zostało zmienione w ES5 strict mode i ES6 - wówczas wywołanie this w funkcji, która nie jest metodą (lub nie została przypisana do żadnego obiektu) rzuca odpowiednim błędem TypeErrorhttp://jsfiddle.net/Comandeer/ob91ybxL/1/ (...)

3
komentarz 24 kwietnia 2016 przez Comandeer Guru (601,530 p.)

Ale co ma ECMAScript do DOM? Przecież język a implementowane w nim APIs to całkowicie inne rzeczy.

W specyfikacji ES nawet nie pojawia się definicja obiektu window, jest jedynie wspomniany w kontekście definicji globalnego obiektu jako przykład → http://www.ecma-international.org/ecma-262/6.0/#sec-global-object
Obiekt window definiowany jest w specyfikacji HTML5 → https://www.w3.org/TR/html5/browsers.html#the-window-object
W specyfikacji ES można natomiast poczytać o tzw. host environment → http://www.ecma-international.org/ecma-262/6.0/#sec-overview

Dzięki takim definicjom można ES użyć nie tylko w przeglądarce (np. w node.js mamy obiekt global + scope modułów, a nie window bez scope'u modułów).

1
komentarz 24 kwietnia 2016 przez ScriptyChris Mędrzec (190,190 p.)
Ale co ma ECMAScript do DOM? Przecież język a implementowane w nim APIs to całkowicie inne rzeczy.
Chodziło mi o to, że JavaScript ma dostęp do HTMLa i może nim manipulować. Dlatego, jeśli globalna zmienna o nazwie identycznej do ID elementu HTML, może służyć do uzyskania dostępu do niego oraz manipulacji nim, to dlaczego JavaScript nie ma mechanizmu obronnego (szczególnie w trybie 'use strict'), który by wyrzucał błąd jeśli ktoś chciałby w ten sposób edytować sobie elementy HTML - zwłaszcza, że korzystanie z globalnych zmiennych nie jest dobrą praktyką?
3
komentarz 24 kwietnia 2016 przez Comandeer Guru (601,530 p.)

Dalej nie rozróżniasz API od języka! Język nie może mieć mechanizmu obronnego na coś, czego nie definiuje. Obiekt window jest definiowany w specyfikacji HTML5, więc jest częścią BOM/DOM.

Podobne pytania

+1 głos
0 odpowiedzi 1,180 wizyt
pytanie zadane 14 grudnia 2016 w JavaScript przez Kfiotek Początkujący (370 p.)
+1 głos
1 odpowiedź 167 wizyt
0 głosów
4 odpowiedzi 525 wizyt
pytanie zadane 20 czerwca 2018 w JavaScript przez Paweł Kościelny Początkujący (360 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...