Jak dynamicznie zmieniać tytuł strony internetowej?

510

Mam stronę internetową, która implementuje zestaw kart, z których każda pokazuje inną treść. Kliknięcia karty nie odświeżają strony, ale ukrywają / odkrywają zawartość po stronie klienta.

Teraz trzeba zmienić tytuł strony zgodnie z zakładką wybraną na stronie (z powodów SEO). czy to możliwe? Czy ktoś może zaproponować rozwiązanie umożliwiające dynamiczną zmianę tytułu strony za pomocą javascript bez ponownego ładowania strony?

użytkownik12129
źródło

Odpowiedzi:

709

Aktualizacja : zgodnie z komentarzami i odniesieniami do SearchEngineLand większość robotów indeksujących indeksuje zaktualizowany tytuł. Poniższa odpowiedź jest nieaktualna, ale kod nadal obowiązuje.

Możesz po prostu zrobić coś takiego, document.title = "This is the new page title.";ale to całkowicie zniweczy cel SEO. Większość robotów przede wszystkim nie obsługuje javascript, więc jako tytuł strony wezmą wszystko, co jest w elemencie.

Jeśli chcesz, aby było to zgodne z większością ważnych robotów indeksujących, będziesz musiał zmienić sam tag tytułowy, co wiązałoby się z przeładowaniem strony (PHP lub podobnym). Nie będziesz w stanie tego obejść, jeśli chcesz zmienić tytuł strony w sposób widoczny dla robota.

Alex Fort
źródło
29
Jeśli używasz funkcji pushState w html5 do zmiany historii już podczas aktualizacji strony, dlaczego nie zaktualizuj tytułu również. Jeśli prawidłowo skonfigurowane roboty będą nadal uzyskiwać prawidłowe wyniki, a użytkownik nadal będzie chciał zobaczyć tytuł pasujący do widoku, w którym się znajduje. W przypadku większości aplikacji internetowych itp. Wydaje się to dobrym rozwiązaniem, aby nadal z nich korzystać. Mogłem przeoczyć inną funkcję?
Mathijs Segers,
31
To nie do końca prawda. Google indeksuje zmiany javascript w document.title. Zobacz searchengineland.com/...
CpnCrunch
7
@CpnCrunch jest poprawny! Google zindeksuje tytuł, który został zmieniony przez JavaScript. Nie testowałem na innych botach wyszukiwania. Nie zawsze zakładam, że bot nie wykonuje JavaScript. Utworzyłem nową odpowiedź poniżej, a potem zdałem sobie sprawę, że zwykłe wyświetlanie i ukrywanie kart bez zmiany adresu URL sprawia, że ​​jest to bardziej skomplikowane.
yazzer
10
@CpnCrunch jest poprawny. To jest 2016. SEO bardzo się zmieniło, a Google i inne wyszukiwarki dostosowują się do aplikacji jednostronicowych i javascript w ogóle.
pilau
34
Oznacza to, że ta odpowiedź jest dość przestarzała. StackOverflow powinien teraz dodać funkcję „Przestarzałe” dla odpowiedzi: D
Allen Linatoc
167

Chcę się przywitać z przyszłości :) Rzeczy, które wydarzyły się ostatnio:

  1. Google uruchamia teraz JavaScript w Twojej witrynie 1
  2. Ludzie używają teraz takich rzeczy jak React.js, Ember i Angular do uruchamiania złożonych zadań javascript na stronie, a Google wciąż indeksuje je 1
  3. możesz użyć interfejsu API historii HTML5 (pushState, React-Router, Ember, Angular), który pozwala robić rzeczy takie jak mieć osobne adresy URL dla każdej karty, którą chcesz otworzyć, a Google zindeksuje to 1

Aby odpowiedzieć na pytanie, możesz bezpiecznie zmienić tytuł i inne metatagi z javascript (możesz także dodać coś takiego jak https://prerender.io, jeśli chcesz obsługiwać wyszukiwarki inne niż Google), po prostu udostępnij je jako osobne adresy URL ( w przeciwnym razie skąd Google wiedziałby, że są to różne strony wyświetlane w wynikach wyszukiwania?). Zmiana tagów związanych z SEO (po zmianie strony przez kliknięcie czegoś) jest prosta:

if (document.title != newTitle) {
    document.title = newTitle;
}
$('meta[name="description"]').attr("content", newDescription);

Tylko upewnij się, że css i javascript nie są zablokowane w pliku robots.txt, możesz użyć Fetch jako usługi Google w Narzędziach Google dla webmasterów.

1: http://searchengineland.com/tested-googlebot-crawls-javascript-heres-learned-220157

JLarky
źródło
47

Nie widzę, jak zmiana tytułu strony za pomocą Javascript pomoże SEO. Większość (lub wszystkie) botów wyszukiwania nie uruchamia Javascript i odczytuje tylko początkowo załadowany tytuł, którym jest narzut.

Jeśli chcesz pomóc SEO, musisz zmienić tytuł strony w zapleczu i obsługiwać różne wersje strony.

Sarat
źródło
3
zgodził się - to wcale nie pomoże SEO, ponieważ roboty nie zrobią nic z twoim JS
annakata
Może chcą tylko jednego tytułu, ale całej zawartości SE, ale bardziej przyjaznej organizacji danych, gdy już znajdziesz się na stronie?
Kev
no cóż, to jest bardzo sprzeczne z całą koncepcją SEO
annakata
4
Tak, nie jest to naprawdę dobre dla SEO, ale dobre dla użytkownika końcowego, gdy tworzy zakładki itp., Na przykład aktualizuje tytuł strony, gdy zmienia się skrót w adresie URL, lub przy użyciu HTML5 / JS window.historydobrze jest aktualizować tytuł strony, a także URL
acSlater
Zobacz własną dokumentację Google na temat indeksowania aplikacji javascript developers.google.com/webmasters/ajax-crawling
codewizard
43

Zastosowanie document.title.

Zobacz także tę stronę, aby poznać podstawowy samouczek.

lc.
źródło
10
uwielbiam link, ma zrzuty ekranu netscape navigator :)
Aran Mulholland,
Mam nadzieję, że Pająki nie używają javascript. Dobry sposób na wysłanie złośliwego kodu Google?
Lee Louviere,
@AdrianoVaroliPiazza Może to być bezużyteczne, ale działa i pomoże ludziom pochodzącym z wyszukiwarek. Nie musisz głosować, jeśli to poprawna odpowiedź!
its_notjack
@its_notjack To nie jest. To może być poprawna odpowiedź na inne pytanie.
Adriano Varoli Piazza
1
Cóż, ten temat był dla mnie pierwszy, gdy wpisałem w Google „tytuł zmiany javascript”. Tworzę aplikację internetową, więc nie dbam o SEO.
Maciej Krawczyk
36

Kod jest
document.title = 'test'

Kev
źródło
3
Używam top.document.title, aby odwoływać się do samego okna (mam zestawy ramek ...)
Dror
2
@AdrianoVaroliPiazza nie trzeba jednak wchodzić -1, co z aplikacjami, które nie wymagają SEO, a co ze stronami internetowymi, które faktycznie korzystają z niektórych funkcji HTML5. Mam na myśli to, że jeśli poprawnie skonfigurowałeś swoją stronę internetową i korzystasz z ajax i masz rezerwę dla nie-js / crawlerów, to tylko przyspieszy doświadczenie użytkownika, a także sprawi, że pasujący tytuł będzie widoczny. To dla mnie dobry pomysł.
Mathijs Segers,
Nie musisz dodawać ;do końca?
MineCMD
1
@MineCMD, średnik (;) jest wymagany tylko, jeśli masz wiele poleceń w jednym wierszu. Zakładając, że nie masz czegoś, co przytrzymuje polecenie otwarte (kropka, cytat, podwójny cudzysłów, lewy nawias itp.), Wówczas nowy wiersz jest uważany za zakończenie polecenia. Nie jestem pewien, jak prawdziwe jest to w przypadku starych przeglądarek, ale okazało się, że jest to prawdą w najnowszych wersjach Chrome i Firefox. (Nie używam IE ani Edge'a, więc nie jestem w stanie powiedzieć na ich temat)
Wayne
@Wayne Trochę poprawne; w niektórych przypadkach ASI prowadzi do nieoczekiwanego (przez większość) zachowania, szczególnie jeśli zwracasz anonimowy obiekt.
Dave Newton,
18

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 .innerHTMLjest na ogół niechlujne. Użyj appendChildzamiast tego.

Chociaż dwa przypadki, w których nadal uważam .innerHTMLsię 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);
});
Braden Best
źródło
1
Znalazłem idealne słowo zastrzeżeniem metodą 1: undefined behavior.
Braden Best
1
Absolutnie należy to zlekceważyć. Metoda 1 to zachowanie nieokreślone, jak wspomniano powyżej (i żadna liczba zastrzeżeń nie uzasadnia wzmianki o tym); Również document.querySelector.apply, poważnie?
Andriej Tarantow
3
@AndreyTarantsov żadna liczba zastrzeżeń nie uzasadnia wzmianki o tym? Co powiesz na to, żeby ludzie wiedzieli, czego NIE robić? Uczymy się na własnych błędach, więc powiedzenie komuś, żeby nie wspominał o czymś, co jest błędem, jest złą radą. Jest to również bardzo stara odpowiedź (dosłownie jedna z pierwszych odpowiedzi, które napisałem na tej stronie), więc „poważnie?” było niepotrzebne. Nie możesz wiedzieć, co zmieniło się w mojej wiedzy i doświadczeniu w ciągu ostatnich trzech lat.
Braden Best
11

Korzystanie z document.title to sposób na osiągnięcie tego w JavaScript, ale jak to ma pomóc w SEO? Boty zazwyczaj nie wykonują kodu javascript podczas przeglądania stron.

TheTXI
źródło
4

Będziesz musiał ponownie wyświetlić stronę z nowym tytułem, aby każdy robot mógł zauważyć zmianę. Robiąc to za pomocą javascript, przyniesie korzyść tylko ludzkiemu czytelnikowi, roboty nie zamierzają wykonać tego kodu.

Bryan Denny
źródło
4

dla tych, którzy szukają wersji npm, jest do tego cała biblioteka:

npm install --save react-document-meta


import React from 'react';
import DocumentMeta from 'react-document-meta';

class Example extends React.Component {
  render() {
    const meta = {
      title: 'Some Meta Title',
      description: 'I am a description, and I can create multiple tags',
      canonical: 'http://example.com/path/to/page',
      meta: {
        charset: 'utf-8',
        name: {
          keywords: 'react,meta,document,html,tags'
        }
      }
    };

    return (
      <div>
        <DocumentMeta {...meta} />
        <h1>Hello World!</h1>
      </div>
    );
  }
}

React.render(<Example />, document.getElementById('root'));
mel3kings
źródło
3

Być może możesz załadować do tytułu wszystkie tytuły zakładek w jednym ciągu, a następnie po załadowaniu jednej z zakładek zmień tytuł za pomocą javascript

np .: najpierw ustaw tytuł

my app | description | contact | about us | 

po załadowaniu jednej z kart uruchom:

document.title = "my app | tab title";
Salvador Villegas
źródło
2

Jednym ze sposobów, który przychodzi na myśl, który może pomóc w SEO i nadal ma strony kart, ponieważ są, to użycie nazwanych kotwic, które odpowiadają każdej karcie, jak w:

http://www.example.com/mypage#tab1, http://www.example.com/mypage#tab2, etc.

Trzeba będzie mieć przetwarzanie po stronie serwera, aby przeanalizować adres URL i ustawić początkowy tytuł strony, gdy przeglądarka wyświetli stronę. Chciałbym też zrobić tę kartę „aktywną”. Gdy strona zostanie załadowana, a rzeczywisty użytkownik przełącza karty, możesz użyć javascript do zmiany, document.titlejak stwierdzili inni użytkownicy.

Bogaty
źródło
2

Zastosowanie document.title. Przyda się w większości rzeczy, ale zniszczy SEO na twojej stronie.

Przykład:

document.write("title - " + document.title + "<br>");
document.title = "New title here!";
// Notice: this will defeat purpose of SEO. Not useful for SEO-friendly sites.
document.write("title - " + document.title + "<br>");
body {
  font-family: Consolas, 'Courier New', monospace;
}
<!DOCTYPE html>
<html>
  <head><title>Old title</title></head>
  <body><p>
    Lorem ipsum dolor sit amet, at movet detraxit mediocritatem eam, nam iusto abhorreant ne. Ei pro          debet adolescens voluptaria, eu minim scaevola conceptam vel. Vim ea torquatos constituto                complectitur, usu eu civibus insolens eleifend. Ex ubique quaerendum his.

  </p></body>
</html>

goblin01
źródło
1

Możesz użyć JavaScript. Niektóre boty, w tym Google, wykonają JavaScript dla korzyści SEO (pokazując poprawny tytuł w SERP).

document.title = "Google will run this JS and show the title in the search results!";

Jest to jednak bardziej skomplikowane, ponieważ wyświetlasz i ukrywasz karty bez odświeżania strony lub zmiany adresu URL. Może dodanie kotwicy pomoże, jak twierdzą inni. Może być konieczne cofnięcie mojej odpowiedzi.

Artykuły przedstawiające pozytywne wyniki: http://www.aukseo.co.uk/use-javascript-to-generate-seo-friendly-title-tags-1275/ http://www.ifinity.com.au/2012/10 / 04 / Changing_a_Page_Title_with_Javascript_to_update_a_Google_SERP_Entry

Nie zawsze zakładaj, że bot nie uruchomi JavaScript. http://searchengineland.com/tested-googlebot-crawls-javascript-heres-learned-220157 Google i inne wyszukiwarki wiedzą, że najlepsze wyniki do indeksowania to wyniki, które zobaczy rzeczywisty użytkownik końcowy w przeglądarce, w tym JavaScript.

Yazzer
źródło
1

Ponieważ wyszukiwarki ignorują większość skryptów javascript, musisz to zrobić, aby wyszukiwarki mogły indeksować się przy użyciu kart bez użycia Ajax. Ustaw każdą kartę jako link z odnośnikiem, który ładuje całą stronę z wybraną kartą. Wtedy strona może mieć ten tytuł w tagu.

Program obsługi zdarzeń onclick może nadal ładować strony za pośrednictwem ajax dla osób przeglądających.

Aby zobaczyć strony tak, jak je widzą większość wyszukiwarek, wyłącz Javascript w swojej przeglądarce i postaraj się, aby klikanie kart powodowało załadowanie strony z wybraną kartą i poprawnym tytułem.

Jeśli ładujesz za pośrednictwem ajax i chcesz dynamicznie zmienić tytuł strony za pomocą samego Javascript, to:

document.title = 'Put the new title here';

Jednak wyszukiwarki nie zobaczą tej zmiany w javascript.

dougd_in_nc
źródło
2
„Aby zobaczyć strony tak, jak je widzi Google, wyłącz obsługę JavaScript w przeglądarce i postaraj się, aby klikanie kart spowodowało załadowanie strony z wybraną kartą i poprawnym tytułem”. - jest to bardzo dobre podejście przy tworzeniu przyjaznych SEO stron internetowych obciążonych AJAX.
John Weisz
0

Ale w celu uzyskania SEO pasuje

Musisz przeładować stronę, gdy strona się zmieni, aby wyszukiwarka zobaczyła różne tytuły itp.

Upewnij się więc, że przeładowanie strony działa najpierw, a następnie dodaj zmiany document.title

Pbearne
źródło
0

Chcę tylko coś tutaj dodać: zmiana tytułu za pomocą JavaScript jest faktycznie przydatna, jeśli aktualizujesz bazę danych za pomocą AJAX, więc tytuł zmienia się bez konieczności odświeżania strony. Tytuł faktycznie zmienia się za pomocą języka skryptowego po stronie serwera, ale zmiana go za pomocą JavaScript jest tylko użytecznością i interfejsem użytkownika, który sprawia, że ​​użytkownik jest bardziej przyjemny i płynny.

Teraz, jeśli zmieniasz tytuł za pomocą JavaScript tylko do cholery, nie powinieneś tego robić.

strzelanka
źródło
0

Google wspomniał, że wszystkie pliki js są renderowane, ale w rzeczywistości straciłem tytuł i inne metatagi, które zostały dostarczone przez Reactjs na tej stronie i faktycznie straciłem pozycję w Google! Dużo szukałem, ale wydaje się, że wszystkie strony muszą być wstępnie renderowane lub za pomocą SSR (renderowania po stronie serwera), aby mieć przyjazny dla SEO protokół!
Rozwija się do Reactjs, Angularjs itp.
Krótko mówiąc, każda strona, która ma źródło widoku strony w przeglądarce, jest indeksowana przez wszystkie roboty, jeśli prawdopodobnie Google nie może indeksować, ale inni pomijają indeksowanie!

Hamed
źródło
-1

Najprostszym sposobem jest usunięcie <title>tagu z index.html i dołączenie

<head>
<title> Website - The page </title></head>

na każdej stronie w sieci. Pająki to znajdą i będą wyświetlane w wynikach wyszukiwania :)

Ваньо Ванев
źródło