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


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.