Як динамічно змінити назву веб-сторінки?


510

У мене є веб-сторінка, яка реалізує набір вкладок, кожен із яких демонструє різний вміст. Клацання вкладки не оновлює сторінку, а приховує / приховує вміст на стороні клієнта.

Тепер існує вимога змінити заголовок сторінки відповідно до вибраної на вкладці сторінки (з SEO причин). Чи можливо це? Чи може хтось запропонувати рішення динамічно змінювати заголовок сторінки через javascript без перезавантаження сторінки?

Відповіді:


709

Оновлення : відповідно до коментарів та посилань на SearchEngineLand більшість веб-сканерів індексуватиме оновлений заголовок. Нижче відповідь застаріла, але код все ще застосовується.

Ви можете просто зробити щось на кшталт, document.title = "This is the new page title.";але це повністю переможе мету SEO. Більшість сканерів не збираються підтримувати JavaScript в першу чергу, тому вони будуть приймати все, що є в елементі, як назву сторінки.

Якщо ви хочете, щоб це було сумісним з більшістю важливих сканерів, вам потрібно буде фактично змінити сам тег заголовка, що передбачало б перезавантаження сторінки (PHP тощо). Ви не зможете обійти це, якщо ви хочете змінити заголовок сторінки таким чином, щоб бачив сканер.


29
Якщо ви використовуєте pushState html5 для зміни історії під час оновлення сторінки, чому б не оновити назву також. Якщо правильно налаштувати сканери, все одно ви отримаєте правильні результати, і ви все одно хочете, щоб користувач бачив назву, що відповідає виду, на якому він перебуває. Для більшості веб-додатків тощо це здається гарним рішенням продовжувати користуватися цим. Я, можливо, не помітив іншої функції?
Mathijs Segers

31
Це не зовсім так. Google робить індекс змін JavaScript у document.title. Див searchengineland.com / ...
CpnCrunch

7
@CpnCrunch правильний! Google індексує назву, яку змінив JavaScript. Я не перевіряв інших пошукових ботів. Не завжди припускайте, що бот не виконує JavaScript. Я створив нову відповідь нижче, а потім зрозумів, що просто показ та приховування вкладок без зміни URL-адреси робить це більш складним.
yazzer

10
@CpnCrunch правильний. Це 2016. SEO дуже змінилося, і Google та інші пошукові системи в цілому адаптуються до додатків для однієї сторінки та JavaScript в цілому.
пілау

34
Отже, ця відповідь є досить застарілою. Тепер для StackOverflow слід додати "застарілу" функцію відповідей: D
Allen Linatoc

167

Я хочу привітатись з майбутнім :) Речі, що відбулися нещодавно:

  1. Google тепер запускає JavaScript, який знаходиться на вашому веб-сайті 1
  2. Зараз люди використовують такі речі, як React.js, Ember та Angular, щоб виконувати складні завдання JavaScript на сторінці, і Google все ще індексується 1
  3. ви можете використовувати html5 api історії api (pushState, react-router, ember, angular), яка дозволяє робити такі речі, як окремі URL-адреси для кожної вкладки, яку ви хочете відкрити, і Google проіндексує, що 1

Отже, щоб відповісти на ваше запитання, ви можете сміливо змінити заголовок та інші метатеги з javascript (ви також можете додати щось на зразок https://prerender.io, якщо ви хочете підтримувати пошукові системи, які не є Google), просто зробіть їх доступними як окремі URL-адреси ( інакше як Google дізнається, що це різні сторінки, які відображатимуться в результатах пошуку?). Зміна пов’язаних з SEO тегів (після того, як користувач змінив сторінку, натиснувши щось), є простим:

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

Просто переконайтеся, що css та javascript не заблоковані в robots.txt, ви можете використовувати функцію "Вилучити" як службу Google в Інструментах Google для веб-майстрів.

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


47

Не можу зрозуміти, як зміна заголовка сторінки через Javascript допоможе SEO. Більшість пошукових ботів (або всіх) не запускають Javascript і читають лише початково завантажений заголовок, який є розміткою.

Якщо ви хочете допомогти SEO, то вам потрібно буде змінити заголовок сторінки у зворотному та подати різні версії сторінки.


3
домовились - це зовсім не допоможе SEO, оскільки сканери нічого не зроблять із вашим JS
annakata

Можливо, вони хочуть лише одного заголовка, але весь вміст в ІП, але потім більш доброзичливу організацію даних, коли ви перейдете на сторінку?
Кев

ну тоді вони дуже протистоять цілій концепції SEO
annakata

4
Так, не дуже добре для SEO, але добре для кінцевого користувача, коли закладки тощо, наприклад, оновлення заголовка сторінки, коли хеш в URL-адресі змінюється, або при використанні HTML5 / JS window.historyкорисно для оновлення заголовка сторінки, а також URL-адреси
acSlater

Перегляньте власну документацію
googles

43

Використовуйте document.title.

Дивіться цю сторінку і для рудиментарного підручника.


10
люблю посилання, він має скріншоти навігатора Netscape :)
Aran Mulholland

Я сподіваюся, що Павуки не використовують JavaScript. Хороший спосіб надіслати шкідливий код Google?
Лі Лув'є

@AdrianoVaroliPiazza Це може бути марним, але це працює і допоможе людям, що надходять із пошукових систем. Немає жодної вимоги, якщо це правильна відповідь!
its_notjack

@its_notjack Це не так. Це може бути правильна відповідь на інше питання.
Адріано Варолі П'яцца

1
Ну, ця тема стала для мене першою, коли я набрав "змінити назву javascript" в Google. Я розробляю веб-додаток, тому мене не хвилює SEO.
Maciej Krawczyk

36

Код є
document.title = 'test'


3
Я використовую top.document.title для посилання на саме вікно (у мене є набори кадрів ...)
Dror

2
@AdrianoVaroliPiazza не потрібно ходити -1, а що стосується програм, які не потребують SEO, а також веб-сайтів, які фактично використовують деякі функції HTML5. Я маю на увазі, якщо ви правильно налаштували свій веб-сайт і скористалися ajax і отримали резервну копію для не js / сканерів, це лише прискорить досвід роботи користувача, а також збереже видимість відповідності. Здається, це гарна ідея для мене.
Mathijs Segers

Чи не потрібно додати ;до кінця?
MineCMD

1
@MineCMD, крапка з комою (;) потрібна лише в тому випадку, якщо у вас є кілька команд в одному рядку. Якщо припустити, що у вас немає чогось, що тримає команду відкритою (крапка, цитата, подвійна цитата, ліва дужка тощо), то новий рядок вважається закінченням команди. Я не впевнений, наскільки це правда у випадку зі старими браузерами, але це виявилося правдою в останніх версіях Chrome і Firefox. (Я не використовую IE або Edge, тому не можу сказати про них)
Wayne

@Wayne Дещо правильний; є деякі крайні випадки, коли ASI призводить до несподіваної (більшості) поведінки, особливо якщо ви повертаєте анонімний об'єкт.
Дейв Ньютон

18

Існує багато способів змінити назву, основні два:

Сумнівний метод

Помістіть тег заголовка в HTML (наприклад <title>Hello</title>), а потім у javascript:

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

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

Очевидно правильний метод

Найпростіший з них - це фактично використовувати метод, передбачений модель об'єктної документації (DOM)

document.title = "Hello World";

Колишній метод - це, як правило, те, що ви зробите для зміни тегів, знайдених в тілі документа. Використання цього методу для зміни тегів метаданих, таких як ті, що знаходяться в голові (як-от title), є в кращому випадку сумнівною практикою, не ідіоматичною, не дуже вдалою стилем для початку і може навіть не бути портативною. Однак ви можете бути впевнені в тому, що це буде дратувати інших розробників, якщо вони побачать title.innerHTML = ...код, який вони підтримують.

Те, що ви хочете піти, це останній метод. Ця властивість надається в специфікації DOM спеціально для того, щоб, як випливає з назви, змінити назву.

Зауважте також, що якщо ви працюєте з XUL, ви, можливо, захочете перевірити, чи завантажився документ, перш ніж намагатися встановити або отримати заголовок, так як в іншому випадку ви посилаєтесь undefined behavior(тут будуть дракони), що саме по собі є страшною концепцією. Це може статися або не відбуватися через JavaScript, оскільки документи в DOM не обов'язково стосуються JavaScript. Але XUL - це цілий «звір», тому я відволікаюсь.

Говорячи про .innerHTML

Деякі хороші поради, які слід пам’ятати, .innerHTMLполягають у тому, що використання в цілому неохайно. Використовуйте appendChildзамість цього.

Хоча два випадки, коли я все ще вважаю .innerHTMLсебе корисними, включають вставлення простого тексту в невеликий елемент ...

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

... і очищення контейнера ...

container.innerHTML = "";
// as opposed to... umm... okay, I guess I'm rolling my own
[...container.childNodes].forEach(function(child){
    container.removeChild(child);
});

1
Я знайшов ідеальне слово для застереження методом 1 : undefined behavior.
Бреден Кращий

1
Це абсолютно повинно бути забороненим. Метод 1 - це невизначена поведінка, як зазначено вище (і жодна кількість відмовлених від відповідальності не виправдовує її згадування); також document.querySelector.apply, серйозно?
Андрій Таранцов

3
@AndreyTarantsov жодна кількість відмовлень не виправдає його згадування? Як щодо згадування про це, щоб люди знали, що НЕ робити? Ми вчимося на своїх помилках, тому сказати комусь, щоб не згадувати щось, що є помилкою, є поганою порадою. Також це справді стара відповідь (буквально одна з перших відповідей, яку я написав на цьому сайті), так що "серйозно?" було непотрібним. Ви, можливо, не можете знати, що змінилося в моїх знаннях та досвідах за останні три роки.
Бреден Кращий

11

Використання document.title - це те, як ви могли б виконати його в JavaScript, але як це може допомогти в SEO? Як правило, боти не виконують код JavaScript під час проходження сторінок.



4

Вам доведеться повторно розмістити сторінку з новим заголовком, щоб сканери помітили зміни. Робити це через javascript буде корисно лише людському читачеві, сканери не збираються виконувати цей код.


4

для тих, хто шукає npm-версію, є ціла бібліотека для цього:

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'));

3

Можливо, ви можете завантажити в своєму заголовку всі заголовки вкладок одним рядком, а після завантаження однієї з вкладок змінити заголовок через javascript

наприклад: спочатку встановіть свою назву

my app | description | contact | about us | 

як тільки ви завантажите одну з запущених вкладок:

document.title = "my app | tab title";

2

Один із способів, який може вам допомогти в SEO та як і раніше матимуть ваші сторінки вкладок, як вони є, - використовувати названі якорі, які відповідають кожній вкладці, як у:

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

Вам потрібно буде обробити сторону сервера, щоб проаналізувати URL-адресу та встановити початкову назву сторінки, коли браузер надає сторінку. Я також хотів би зробити цю вкладку "активною". Після завантаження сторінки та фактичного користувача переключення вкладок, ви можете використовувати javascript для зміни, document.titleяк заявили інші користувачі.


2

Використовуйте document.title. Він буде корисний для більшості речей, але знищить SEO на вашому веб-сайті.

Приклад:

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>


1

Ви можете використовувати JavaScript. Деякі боти, включаючи Google, будуть виконувати JavaScript на користь SEO (показуючи правильну назву в SERP).

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

Однак це складніше, оскільки ви показуєте та ховаєте вкладки, не оновлюючи сторінку та не змінюючи URL-адресу. Можливо, додавання якоря допоможе, як заявили інші. Можливо, мені доведеться відмовитись від своєї відповіді.

Статті, що показують позитивні результати: 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

Не вважайте, що бот не виконує JavaScript. http://searchengineland.com/ested-googlebot-crawls-javascript-heres-learned-220157 Google та інші пошукові системи знають, що найкращі результати для індексації - це результати, які фактичний кінцевий користувач побачить у своєму браузері, включаючи JavaScript.


1

Оскільки пошукові системи ігнорують більшість javascript, вам потрібно буде зробити так, щоб пошукові системи могли сканувати за допомогою вкладок без використання Ajax. Зробіть для кожної вкладки посилання з href, який завантажує всю вибрану вкладку. Тоді сторінка може мати цей заголовок у тезі.

Обробник подій onclick все ще може завантажувати сторінки через ajax для глядачів.

Щоб побачити сторінки так, як їх бачать більшість пошукових систем, вимкніть Javascript у своєму браузері та спробуйте зробити так, щоб натискання на вкладки завантажило сторінку із вибраною вкладкою та правильним заголовком.

Якщо ви завантажуєтесь через ajax і хочете динамічно змінити заголовок сторінки за допомогою Javascript, тоді виконайте:

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

Однак пошукові системи не побачать цієї зміни, внесеної в JavaScript.


2
"Щоб побачити сторінки так, як їх бачить Google, вимкніть Javascript у своєму браузері та спробуйте зробити так, щоб натискання вкладок завантажило сторінку з вибраною вкладкою та правильним заголовком." - це дуже хороший підхід при розробці веб-сайтів AJAX, важких для SEO.
Джон Вайс

0

Але для того, щоб отримати SEO-вигоди

Вам потрібно зробити перезавантаження сторінки, коли сторінка зміниться, щоб пошукова система побачила різні заголовки тощо.

Тому переконайтеся, що перезавантаження сторінки спочатку працює, а потім додайте document.title зміни


0

Я просто хочу тут щось додати: зміна заголовка через JavaScript насправді корисна, якщо ви оновлюєте базу даних через AJAX, тож заголовок змінюється, не потребуючи оновлення сторінки. Заголовок фактично змінюється за допомогою скриптової мови на вашому сервері, але його зміна через JavaScript - це просто зручність роботи та інтерфейс користувача, що робить роботу користувачів більш приємною та простою.

Тепер, якщо ви змінюєте заголовок через JavaScript просто для чортви, то не варто цього робити.


0

Google відзначив, що всі js-файли надані, але насправді я втратив назву та інші метатеги, які були надані Reactjs на цьому веб-сайті, і фактично втратив свою позицію в Google! Я багато шукав, але, схоже, всі сторінки повинні бути попередньо відредаговані або за допомогою SSR (Server Side Rendering), щоб мати свій SEO-дружній протокол!
Він розширюється до Reactjs, Angularjs тощо.
Коротше кажучи, кожна сторінка, яка має джерело перегляду сторінок у браузері, індексується усіма роботами, якщо це, ймовірно, не може Google проіндексувати, але інші пропустити індексацію!


-1

Найпростіший спосіб - видалити <title>тег із index.html і включити його

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

на кожній сторінці в Інтернеті. Павуки знайдуть це і будуть показані в результатах пошуку :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.