Como alterar dinamicamente o título de uma página da web?

510

Eu tenho uma página da Web que implementa um conjunto de guias, cada uma mostrando um conteúdo diferente. Os cliques da guia não atualizam a página, mas ocultam / mostram o conteúdo no lado do cliente.

Agora, é necessário alterar o título da página de acordo com a guia selecionada na página (por motivos de SEO). Isso é possível? Alguém pode sugerir uma solução para alterar dinamicamente o título da página via javascript sem recarregar a página?

user12129
fonte

Respostas:

709

Atualização : conforme os comentários e a referência no SearchEngineLand, a maioria dos rastreadores da Web indexará o título atualizado. A resposta abaixo é obsoleta, mas o código ainda é aplicável.

Você pode simplesmente fazer algo como,, document.title = "This is the new page title.";mas isso derrotaria totalmente o objetivo do SEO. A maioria dos rastreadores não suporta javascript em primeiro lugar; portanto, eles usarão o que estiver no elemento como título da página.

Se você deseja que isso seja compatível com a maioria dos rastreadores importantes, será necessário alterar a própria tag title, o que envolveria recarregar a página (PHP ou algo semelhante). Você não será capaz de contornar isso, se quiser alterar o título da página de uma maneira que um rastreador possa ver.

Alex Fort
fonte
29
Se você estiver usando o pushState do html5 para alterar o histórico ao atualizar sua página, por que não atualizar também o título. Se a configuração correta, os rastreadores ainda obterão os resultados certos e você ainda desejará que o usuário veja o título correspondente à visualização em que está. Para a maioria dos aplicativos da Web etc., parece uma boa solução continuar usando isso. Eu poderia ter esquecido uma função diferente?
Mathijs Segers
31
Isso não é bem verdade. O Google indexa alterações de javascript em document.title. Veja searchengineland.com/…
CpnCrunch
7
@CpnCrunch está correto! O Google indexará o título que foi alterado pelo JavaScript. Não testei em outros bots de pesquisa nem sempre assuma que um bot não executa JavaScript. Criei uma nova resposta abaixo e percebi que simplesmente mostrar e ocultar guias sem alterar a URL torna isso mais complexo.
yazzer
10
@CpnCrunch está correto. Estamos em 2016. O SEO mudou bastante e o Google e outros mecanismos de pesquisa estão se adaptando a aplicativos de página única e javascript em geral.
Pilau
34
Então isso significa que esta resposta é bastante obsoleta. O StackOverflow agora deve adicionar o recurso "Obsoleto" para obter respostas: D
Allen Linatoc 14/16/16
167

Quero dizer olá do futuro :) Coisas que aconteceram recentemente:

  1. O Google agora executa javascript que está no seu site 1
  2. As pessoas agora usam coisas como React.js, Ember e Angular para executar tarefas complexas de javascript na página e ainda está sendo indexado pelo Google 1
  3. você pode usar a API do histórico html5 (pushState, react-router, brasa, angular) que permite fazer coisas como ter URLs separados para cada guia que você deseja abrir e o Google indexará esse 1

Portanto, para responder à sua pergunta, você pode alterar com segurança o título e outras metatags do javascript (você também pode adicionar algo como https://prerender.io se desejar oferecer suporte a mecanismos de pesquisa que não sejam do Google), basta torná-los acessíveis como URLs separados ( caso contrário, como o Google saberia que são páginas diferentes para mostrar nos resultados de pesquisa?). Alterar as tags relacionadas ao SEO (depois que o usuário altera a página clicando em algo) é simples:

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

Apenas certifique-se de que css e javascript não estejam bloqueados no robots.txt, você pode usar Buscar como serviço do Google nas Ferramentas do Google para webmasters.

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

JLarky
fonte
47

Não vejo como a alteração do título da página via Javascript ajudará o SEO. A maioria (ou todos) os robôs de pesquisa não executam Javascript e só lê o título carregado inicialmente que é a marcação.

Se você quiser ajudar o SEO, precisará alterar o título da página no back-end e atender a diferentes versões da página.

Sarat
fonte
3
concordou - Isso não vai ajudar SEO em tudo, como os indexadores não vai fazer qualquer coisa com seu JS
annakata
Talvez eles só querem um título, mas todo o conteúdo do SE, mas uma organização de dados mais amigável quando você estiver na página?
Kev
bem, então eles estão muito indo contra todo o conceito de SEO
annakata
4
Sim não é realmente bom para SEO, mas bom para o usuário final, quando bookmarking etc, por exemplo atualizar um título da página quando o hash nas mudanças de URL, ou quando usando HTML5 / JS window.historyseu bom título da página de atualização, bem como URL
acSlater
Veja googles própria documentação sobre rastejando aplicações JavaScript developers.google.com/webmasters/ajax-crawling
codewizard
43

Use document.title.

Veja esta página para um tutorial rudimentar também.

lc.
fonte
10
amo o link, ele tem screenshots Netscape Navigator :)
Aran Mulholland
Espero que as Aranhas não usem javascript. Boa maneira de enviar código malicioso do Google?
Lee Louviere
@AdrianoVaroliPiazza Pode ser inútil, mas funciona e ajudará pessoas provenientes de mecanismos de busca. Não há necessidade de voto negativo se for a resposta correta!
its_notjack
@its_notjack Não é. Pode ser a resposta correta para outra pergunta.
Adriano Varoli Piazza
1
Bem, este tópico foi o primeiro para mim quando digitei "javascript change title" no Google. Estou desenvolvendo um aplicativo da web para não me importar com SEO.
Maciej Krawczyk
36

O código é
document.title = 'test'

Kev
fonte
3
Eu uso top.document.title a referência à própria janela (eu tenho conjuntos de quadros ...)
Dror
2
No entanto, o @AdrianoVaroliPiazza não precisa ir -1, o que acontece com aplicativos que não exigem SEO ou sites que realmente usam algumas funções do HTML5. Quero dizer, se você configurar seu site corretamente e usar o ajax e tiver um substituto para não-js / crawlers, isso apenas acelerará a experiência do usuário e também manterá visível o título correspondente. Parece uma boa ideia para mim.
Mathijs Segers
Você não precisa adicionar um ;até o fim?
MineCMD 03/03
1
@MineCMD, um ponto-e-vírgula (;) será necessário apenas se você tiver vários comandos em uma única linha. Supondo que você não tenha algo que mantenha o comando aberto (um ponto, aspas, aspas duplas, colchete esquerdo, etc.), uma nova linha é considerada o final do comando. Não sei ao certo se isso é verdade no caso de navegadores antigos, mas provou ser verdade nas versões recentes do Chrome e do Firefox. (Eu não uso IE ou Borda assim sou incapaz de dizer sobre eles)
Wayne
@Wayne Um pouco correto; existem alguns casos extremos em que o ASI leva a um comportamento inesperado (pela maioria), principalmente se você estiver retornando um objeto anônimo.
Dave Newton
18

Existem várias maneiras de alterar o título, as duas principais, são assim:

O método questionável

Coloque uma tag de título no HTML (por exemplo <title>Hello</title>) e depois em javascript:

let title_el = document.querySelector("title");

if(title_el)
    title_el.innerHTML = "World";

O método obviamente correto

O mais simples de tudo é realmente usar o método fornecido pelo DOM (Document Object Model)

document.title = "Hello World";

O método anterior é geralmente o que você faria para alterar as tags encontradas no corpo do documento. Usar esse método para modificar tags de metadados, como os encontrados na cabeça (como title), é uma prática questionável, na melhor das hipóteses, não é idiomático, não é um estilo muito bom para começar e pode até não ser portátil. Uma coisa que você pode ter certeza, porém, é que isso incomodará outros desenvolvedores se eles virem o title.innerHTML = ...código que estão mantendo.

O que você quer seguir é o último método. Esta propriedade é fornecida na Especificação do DOM especificamente com a finalidade, como o nome sugere, de alterar o título.

Observe também que, se você estiver trabalhando com o XUL, verifique se o documento foi carregado antes de tentar definir ou obter o título, caso contrário, você está invocando undefined behavior(aqui estão dragões), que é um conceito assustador por si só. Isso pode ou não ocorrer via JavaScript, pois os documentos no DOM não pertencem necessariamente ao JavaScript. Mas XUL é um animal totalmente diferente, então eu discordo.

Falando de .innerHTML

Um bom conselho a ter em mente seria que o uso .innerHTMLgeralmente é desleixado. Use em appendChildvez disso.

Embora dois casos em que eu ainda ache .innerHTMLútil sejam: inserir texto sem formatação em um pequeno elemento ...

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;
}());

... e limpando um recipiente ...

container.innerHTML = "";
// as opposed to... umm... okay, I guess I'm rolling my own
[...container.childNodes].forEach(function(child){
    container.removeChild(child);
});
Braden Best
fonte
1
Eu encontrei a palavra perfeita para a advertência com o método 1: undefined behavior.
Braden Best
1
Isso absolutamente deve ser eliminado. O método 1 é um comportamento indefinido, como mencionado acima (e nenhuma quantidade de isenções de responsabilidade justificará mencioná-lo); também document.querySelector.apply, sério?
Andrey Tarantsov 29/02
3
@AndreyTarantsov nenhuma quantidade de isenções de responsabilidade justificará mencioná-lo? Que tal mencioná-lo para que as pessoas saibam o que NÃO fazer? Aprendemos com nossos erros, por isso dizer a alguém para não mencionar algo que é um erro é um mau conselho. Além disso, esta é uma resposta muito antiga (literalmente, uma das primeiras respostas que escrevi neste site), de modo que "seriamente?" foi desnecessário. Você não pode saber o que mudou nos meus conhecimentos e experiências nos últimos três anos.
Braden Best
11

Usando o document.title, é como você o faria em JavaScript, mas como isso deve ajudar no SEO? Os bots geralmente não executam código javascript à medida que percorrem as páginas.

TheTXI
fonte
4

Você precisará reenviar a página com um novo título para que qualquer rastreador observe a alteração. Se o fizer via javascript, beneficiará apenas um leitor humano, os rastreadores não executarão esse código.

Bryan Denny
fonte
4

para quem procura a versão npm, há uma biblioteca inteira para isso:

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
fonte
3

Talvez você possa carregar no título todos os títulos das guias em uma sequência e, depois de carregar uma das guias, altere o título via javascript

ex: em primeiro lugar, defina seu título para

my app | description | contact | about us | 

Depois de carregar uma das guias, execute:

document.title = "my app | tab title";
Salvador Villegas
fonte
2

Uma maneira de lembrar que pode ajudar no SEO e ainda ter suas páginas de guias como seria seria usar âncoras nomeadas que correspondam a cada guia, como em:

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

Você precisaria ter um processamento no servidor para analisar o URL e definir o título da página inicial quando o navegador renderizar a página. Eu também iria em frente e tornaria a guia "ativa". Depois que a página for carregada e um usuário real estiver trocando de guia, você usaria o javascript para alterar document.titlecomo outros usuários declararam.

Rico
fonte
2

Use document.title. Será útil para a maioria das coisas, mas destruirá o SEO no seu site.

Exemplo:

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
fonte
1

Você pode usar JavaScript. Alguns bots, incluindo o Google, executam o JavaScript em benefício do SEO (mostrando o título correto no SERP).

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

No entanto, isso é mais complexo, pois você está mostrando e ocultando guias sem atualizar a página ou alterar o URL. Talvez adicionar uma âncora ajude conforme declarado por outros. Talvez eu precise retirar minha resposta.

Artigos que mostram resultados positivos: 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

Nem sempre assuma que um bot não executa JavaScript. http://searchengineland.com/tested-googlebot-crawls-javascript-heres-learned-220157 O Google e outros mecanismos de pesquisa sabem que os melhores resultados para indexar são os resultados que o usuário final real verá em seu navegador, incluindo JavaScript.

yazzer
fonte
1

Como os mecanismos de pesquisa ignoram a maioria dos javascript, você precisará fazer isso para que os mecanismos de pesquisa possam rastrear usando as guias sem usar o Ajax. Faça de cada guia um link com um href que carregue a página inteira com essa guia selecionada. Em seguida, a página pode ter esse título na tag.

O manipulador de eventos onclick ainda pode carregar as páginas via ajax para visualizadores humanos.

Para ver as páginas como a maioria dos mecanismos de pesquisa as vê, desative o Javascript no navegador e tente fazê-lo para que, ao clicar nas guias, a página seja carregada com a guia selecionada e o título correto.

Se você está carregando via ajax e deseja alterar dinamicamente o título da página apenas com Javascript, faça:

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

No entanto, os mecanismos de pesquisa não verão essa alteração feita em javascript.

dougd_in_nc
fonte
2
"Para ver as páginas como o Google as vê, desative o Javascript no seu navegador e tente fazê-lo para que, ao clicar nas guias, a página seja carregada com a guia selecionada e o título correto." - essa é uma abordagem muito boa ao desenvolver sites pesados ​​de AJAX e amigáveis ​​em SEO.
John Weisz
0

Mas, para obter os benefícios de SEO

Você precisa recarregar a página quando ela mudar, para que o mecanismo de pesquisa veja os diferentes títulos etc.

Portanto, verifique se a atualização da página funciona primeiro e depois adicione document.title changes

Pbearne
fonte
0

Eu só quero adicionar algo aqui: alterar o título via JavaScript é realmente útil se você estiver atualizando um banco de dados via AJAX; portanto, o título muda sem que você precise atualizar a página. O título realmente muda por meio da linguagem de script do servidor, mas alterá-lo por JavaScript é apenas uma questão de usabilidade e interface do usuário que torna a experiência do usuário mais agradável e fluida.

Agora, se você estiver alterando o título via JavaScript apenas para o inferno, não deve fazer isso.

tiro de borracha
fonte
0

O Google mencionou que todos os arquivos js renderizados, mas, na realidade, perdi meu título e outras metatags fornecidas pelo Reactjs neste site e perdi minha posição no Google! Pesquisei bastante, mas parece que todas as páginas devem ter sido renderizadas previamente ou usando o SSR (Server Side Rendering) para ter seu protocolo amigável ao SEO!
Ele se expande para Reactjs, Angularjs, etc.
Em resumo, todas as páginas que exibem a fonte da página no navegador são indexadas por todos os robôs, se não for provável que o Google possa indexar, mas outras ignoram a indexação!

Hamed
fonte
-1

A maneira mais simples é excluir a <title>tag do index.html e incluir

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

em todas as páginas da web. As aranhas encontrarão isso e serão mostradas nos resultados da pesquisa :)

Ваньо Ванев
fonte