Найкоротший спосіб друкувати поточний рік на веб-сайті


232

Мені потрібно оновити кілька сотень статичних HTML-сторінок, які мають чітко закодовані дати авторських прав у нижньому колонтитулі. Я хочу замінити його на якийсь JavaScript, який автоматично оновлюватиметься кожного року.

В даний час я використовую:

<script type="text/javascript">var year = new Date();document.write(year.getFullYear());</script>

Це так коротко, як це стає?

Відповіді:


542

Ось найкоротший, який я можу отримати:

<script>document.write(new Date().getFullYear())</script>

Це буде працювати у всіх браузерах, на які я працював.

Як я потрапив:

  • Ви можете просто зателефонувати getFullYearбезпосередньо на новостворену Date, не потребуючи змінної. new Date().getFullYear()може виглядати трохи дивно, але це надійно: new Date()спочатку виконується деталь, потім - .getFullYear().
  • Ви можете скинути type, тому що JavaScript є типовим; це навіть задокументовано як частину специфікації HTML5 , яка, ймовірно, у цьому випадку є написанням того, що браузери вже роблять.
  • Ви можете залишити крапку з комою для одного додаткового збереженого символу, оскільки JavaScript має "автоматичну вставку крапки з комою" - функцію, яку я зазвичай зневажаю та протидію, але в цьому конкретному випадку використання вона повинна бути достатньо безпечною.

Важливо зауважити, що це працює лише в браузерах, де ввімкнено JavaScript. В ідеалі це краще вирішуватись як пакетне завдання в режимі офлайн ( sedскрипт на * nix тощо) раз на рік, але якщо ви хочете вирішити JavaScript, я думаю, що це якнайшвидше. (Зараз я пішов і спокусив долю.)


1
у 2019 році він переписує весь вміст сторінки. я щось пропускаю?
— System Rebooter

2
@SystemsRebooter - Ви можете використовувати document.writeдля вбудованого вмісту лише на початковій фазі розбору (як показано вище, у <script>...</script>тезі - або у .jsфайлі, завантаженому scriptтегом без defer або async). Коли сторінка повністю проаналізована, потік документів закривається, а за допомогою document.writeповторного відкриття - повністю замінюючи документ новим. Якщо ви хочете додати рік після того, як основний синтаксичний аналіз буде завершений, ви хочете використовувати DOM. (Це не зміна. Це завжди було так.)
— TJ Crowder

44

Відповідь TJ відмінна, але я зіткнувся з одним сценарієм, коли мій HTML вже був наданий, а скрипт document.write замінив би весь вміст сторінки лише з датою року.

Для цього сценарію ви можете додати текстовий вузол до існуючого елемента, використовуючи наступний код:

<div>
    &copy;
    <span id="copyright">
        <script>document.getElementById('copyright').appendChild(document.createTextNode(new Date().getFullYear()))</script>
    </span>
    Company Name
</div>

Так - гарне рішення! Я рекомендую перемістити фрагмент сценарію безпосередньо перед закритим тегом body або до іншого js в кінці корпусу html.
— Крістіан Михайло

createTextNode()не інтерпретує html, як, <br>як створити вузол з HTML?
— rubo77

19

Якщо ви хочете включити часовий проміжок у майбутньому, з поточним роком (наприклад, 2017) як початковим, щоб наступний рік виглядав так: "© 2017-2018, компанія.", То використовуйте наступний код . Він автоматично оновлюватиметься щороку:

&copy; Copyright 2017<script>new Date().getFullYear()>2017&&document.write("-"+new Date().getFullYear());</script>, Company.

© Авторські права 2017-2018, Компанія.

Але якщо перший рік вже минув, найкоротший код можна записати так:

&copy; Copyright 2010-<script>document.write(new Date().getFullYear())</script>, Company.

13
<script type="text/javascript">document.write(new Date().getFullYear());</script>

1
Я знаю, що просто <script> коротше (див. Іншу відповідь), але його є більш актуальним і завжди працюватиме. Насправді у мене був екземпляр у WP, коли інший не працював, але цей не був проблемою. Не впевнений, чому WP вирішив би проблему над цим ... Я знаю, що сьогодні ви можете кинути; наприкінці і сценарій за замовчуванням до js все одно, але все ж.
— Малахій

9

Рішення JS чудово працює, але я б радив рішення на стороні сервера. На деяких веб-сайтах, які я перевіряв, цей випуск всієї сторінки був порожнім, і лише рік раз його бачили.

Причиною цього став document.write, фактично написаний над усім документом.

Я попросив свого друга впровадити рішення на стороні сервера, і воно працювало на нього. Простий код у php

<?php echo date('Y'); ?>

Насолоджуйтесь!


1
Ваше рішення є настільки простим, але справа в тому , що це питання пов'язане з JavaScript
— Мо

2
Ха-ха! Рішення було дано, коли я розмістив це. Ще я хотів, щоб люди знали, що є й інші способи! Сподіваюся, це допоможе комусь, як я, у майбутньому!
— Арканікс

Я згоден з вами, що нам потрібно шукати альтернативу, коли немає рішення з тим же мисленням. Будьте обережні вниз голосування 😉
— штат Міссурі

А що, якщо рішення на стороні сервера - це Node.js і, таким чином, JavaScript?
— rorymorris89

2
Якщо сторінка порожня, це означає, що вона document.writeбула використана після того, як DOM вже завантажений. Рішення полягає в тому, щоб не використовувати document.writeпісля всіх завантажень DOM, а ще краще, взагалі не використовувати document.write.
— user4642212

8

Ось кінцева найкоротша найвідповідальніша версія, яка працює навіть в AD і BC.

[барабанні рулони ...]

<script>document.write(Date().split` `[3])</script>

Це воно. 6 байт коротше прийнятої відповіді.

Якщо вам потрібно бути сумісним з ES5, ви можете погодитися на:

<script>document.write(Date().split(' ')[3])</script>

4
А як бути, якщо ваш користувач повернеться в часі до 1000 року нашої ери? Або що робити, якщо користувач використовує ваш додаток> 9999 AD? #responsibleCode # NotAbodyY2K;)
— Нік Стіл

3
@NickSteele Сподіваємось, ми не пишемо чистий JavaScript на той момент.
— Майкл МакКуаде

1

Це найкраще рішення, про яке я можу придумати, що буде працювати з чистим JavaScript. Ви також зможете стилізувати елемент, оскільки він може бути націлений у CSS. Просто додайте замість року, і він автоматично оновлюватиметься.

//Wait for everything to load first
window.addEventListener('load', () => {
    //Wrap code in IIFE 
    (function() {
        //If your page has an element with ID of auto-year-update the element will be populated with the current year.
        var date = new Date();
        if (document.querySelector("#auto-year-update") !== null) {
            document.querySelector("#auto-year-update").innerText = date.getFullYear();
        }
    })();
});


1

Для React.js наступним є те, що працювало для мене в нижньому колонтитулі ...

render() {
    const yearNow = new Date().getFullYear();
    return (
    <div className="copyright">&copy; Company 2015-{yearNow}</div>
);
}

0

згідно з хромованим аудитом

Для користувачів на повільних з'єднаннях зовнішні скрипти, що динамічно вводяться через, document.write()можуть затримати завантаження сторінки на десятки секунд.

https://web.dev/no-document-write/?utm_source=lighthouse&utm_medium=devtools

тому рішення без помилок:

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