Кратчайший способ печати текущего года на сайте

232

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

В настоящее время я использую:

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

Это так коротко, как только можно?

tpow
источник

Ответы:

542

Вот самое короткое, что я могу получить:

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

Это будет работать во всех браузерах, с которыми я сталкивался.

Как я туда попал:

  • Вы можете просто позвонить getFullYearнепосредственно на вновь созданную Date, без необходимости переменной. new Date().getFullYear()может выглядеть немного странно, но это надежно: new Date()сначала выполняется часть, а затем .getFullYear().
  • Вы можете отбросить type, потому что JavaScript используется по умолчанию; это даже задокументировано как часть спецификации HTML5 , которая в этом случае, вероятно, будет записывать то, что браузеры уже делают.
  • Вы можете удалить точку с запятой в конце для одного дополнительного сохраненного символа, потому что в JavaScript есть «автоматическая вставка точки с запятой», функция, которую я обычно презираю и вызываю, но в этом конкретном случае использования она должна быть достаточно безопасной.

Важно отметить, что это работает только в браузерах, где включен JavaScript. В идеале это лучше обрабатывать как автономное пакетное задание ( sedскрипт на * nix и т. Д.) Один раз в год, но если вам нужно решение JavaScript, я думаю, что оно настолько короткое, насколько это возможно. (Теперь я ушел и искушал судьбу.)

TJ Crowder
источник
1
в 2019 году переписывается весь контент страницы. я что-то упускаю?
Перезагрузка системы
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, Company.», Затем используйте следующий код , Он будет автоматически обновляться каждый год:

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

© Copyright 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'); ?>

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

Arcanyx
источник
1
Ваше решение настолько простое, но дело в том, что вопрос связан с JavaScript
Mo.
2
Ха - ха! Решение было уже дано, когда я отправил это. Тем не менее, я хотел, чтобы люди знали, что есть и другие способы! Надеюсь, это поможет кому-то вроде меня в будущем!
Arcanyx
Я согласен с вами, что мы должны искать альтернативу, когда нет решения с таким же мышлением. Будьте осторожны с голосами против Mo
Пн
А что если серверным решением является 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 нашей эры? #responsibleCode # NotAnotherY2K;)
Ник Стил
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

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

Джонатан Акветей Окине
источник
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();
Karol
источник