Istnieje wiele sposobów zmiany tytułu, dwa główne są takie:
Wątpliwa metoda
Umieść tag tytułu w HTML (np. <title>Hello</title>
), A następnie w javascript:
let title_el = document.querySelector("title");
if(title_el)
title_el.innerHTML = "World";
Oczywiście poprawna metoda
Najprościej jest użyć metody dostarczonej przez Document Object Model (DOM)
document.title = "Hello World";
Ta pierwsza metoda służy do zmiany znaczników znajdujących się w treści dokumentu. Używanie tej metody do modyfikowania znaczników meta-danych, takich jak te znalezione w głowie (jak title
), jest co najmniej wątpliwą praktyką, nie jest idiomatyczne, na początku niezbyt dobry styl, a może nawet nie jest przenośne. Jedną z rzeczy, których możesz być pewien, jest to, że będzie drażnić innych programistów, jeśli zobaczą title.innerHTML = ...
w utrzymywanym kodzie.
To, co chcesz iść, to ta druga metoda. Ta właściwość jest podana w specyfikacji DOM specjalnie w celu, jak sugeruje nazwa, zmiany tytułu.
Zauważ również, że jeśli pracujesz z XUL, możesz chcieć sprawdzić, czy dokument został załadowany, zanim spróbujesz ustawić lub uzyskać tytuł, ponieważ w przeciwnym razie wywołujesz undefined behavior
(tutaj są smoki), co jest przerażającą samą koncepcją. Może się to zdarzyć lub nie przez JavaScript, ponieważ dokumenty w DOM nie muszą koniecznie dotyczyć JavaScript. Ale XUL jest całą inną bestią, więc dygresuję.
Mówiąc o .innerHTML
Dobrą radą, o której należy pamiętać, jest to, że używanie .innerHTML
jest na ogół niechlujne. Użyj appendChild
zamiast tego.
Chociaż dwa przypadki, w których nadal uważam .innerHTML
się za przydatne, obejmują wstawienie zwykłego tekstu do małego elementu ...
label.innerHTML = "Hello World";
// as opposed to...
label.appendChild(document.createTextNode("Hello World"));
// example:
el.appendChild(function(){
let el = document.createElement("span");
el.className = "label";
el.innerHTML = label_text;
return el;
}());
... i opróżnianie pojemnika ...
container.innerHTML = "";
// as opposed to... umm... okay, I guess I'm rolling my own
[...container.childNodes].forEach(function(child){
container.removeChild(child);
});