W języku JavaScript, aby usunąć atrybut z elementu HTML, po uzyskaniu obiektu za pomocą metody getElementById należy użyć
A. metody getAttribute
B. metody removeChild
C. pola innerHTML
D. metody removeAttribute
Metoda removeAttribute jest właściwym wyborem, bo służy dokładnie do usuwania wskazanego atrybutu z elementu DOM. Jeżeli pobierzesz element przez document.getElementById("przycisk"), to otrzymujesz obiekt reprezentujący konkretny element HTML w drzewie dokumentu. Na tym obiekcie możesz wywołać np. element.removeAttribute("disabled"), element.removeAttribute("class") albo element.removeAttribute("title"). W praktyce często używa się tego przy formularzach, gdy po spełnieniu warunku chcesz odblokować pole lub przycisk, np. usunąć atrybut disabled po poprawnym wpisaniu danych. To jest zgodne ze standardowym API DOM i jest czytelne dla innych programistów, a czytelność w JavaScript naprawdę ma znaczenie. Moim zdaniem to jedna z tych metod, które warto zapamiętać „na gotowo”, bo pojawia się często przy dynamicznych stronach. Dla porównania, jeśli chcesz tylko sprawdzić wartość atrybutu, używasz getAttribute("nazwa"), a jeśli chcesz ustawić lub zmienić atrybut, używasz setAttribute("nazwa", "wartość"). Dobra praktyka jest taka, żeby manipulować atrybutami przez metody DOM, zamiast kombinować z tekstem HTML, bo wtedy kod jest bezpieczniejszy, bardziej przewidywalny i mniej podatny na przypadkowe uszkodzenie struktury strony.
W tym pytaniu chodzi o manipulację atrybutami elementu w modelu DOM, czyli o pracę na obiekcie elementu HTML po jego pobraniu przez document.getElementById("id"). Do usunięcia atrybutu nie służy getAttribute, ponieważ ta metoda tylko odczytuje wartość atrybutu. Można jej użyć na przykład do sprawdzenia, czy element ma ustawiony title, href albo data-id, ale samo wywołanie getAttribute("disabled") niczego z dokumentu nie usuwa. To częsty błąd myślowy: nazwa zawiera słowo „attribute”, więc wydaje się, że metoda pasuje do każdej operacji na atrybutach. W DOM API nazwy są jednak dość precyzyjne: get pobiera, set ustawia, remove usuwa. Pole innerHTML też nie jest odpowiednim narzędziem. Ono dotyczy zawartości wewnętrznej elementu, czyli tekstu i znaczników znajdujących się pomiędzy tagiem otwierającym i zamykającym. Zmiana innerHTML może przebudować fragment strony, ale nie jest przeznaczona do usuwania pojedynczego atrybutu z elementu. Z mojego doświadczenia używanie innerHTML do takich drobiazgów często kończy się niepotrzebnym bałaganem, a czasem także problemami bezpieczeństwa, szczególnie gdy wstawiane dane pochodzą od użytkownika. Metoda removeChild działa na węzłach potomnych, czyli usuwa dziecko z elementu, na przykład akapit z kontenera. Nie usuwa atrybutu typu class, disabled czy alt. Jeśli więc mamy element input i chcemy zdjąć z niego disabled, poprawny zapis to input.removeAttribute("disabled"). To jest proste, standardowe i dobrze oddaje intencję kodu.