Cách ngắn nhất để in năm hiện tại trong một trang web


232

Tôi cần cập nhật vài trăm trang HTML tĩnh có ngày bản quyền được mã hóa cứng ở chân trang. Tôi muốn thay thế nó bằng một số JavaScript sẽ tự động cập nhật mỗi năm.

Hiện tại tôi đang sử dụng:

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

Đây có phải là ngắn như nó được?

Câu trả lời:


542

Đây là ngắn nhất tôi có thể nhận được nó:

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

Điều đó sẽ hoạt động trong tất cả các trình duyệt tôi đã chạy qua.

Làm thế nào tôi đến đó:

  • Bạn chỉ có thể gọi getFullYeartrực tiếp trên mới được tạo Date, không cần một biến. new Date().getFullYear()có thể trông hơi kỳ lạ, nhưng nó đáng tin cậy: new Date()phần được thực hiện trước, sau đó là .getFullYear().
  • Bạn có thể bỏ type, vì JavaScript là mặc định; điều này thậm chí còn được ghi nhận như là một phần của đặc tả HTML5 , có khả năng trong trường hợp này là viết lên những gì trình duyệt đã làm.
  • Bạn có thể bỏ dấu chấm phẩy ở cuối cho một ký tự được lưu thêm, bởi vì JavaScript có "chèn dấu chấm phẩy tự động", một tính năng tôi thường coi thường và chống lại, nhưng trong trường hợp sử dụng cụ thể này, nó đủ an toàn.

Điều quan trọng cần lưu ý là điều này chỉ hoạt động trên các trình duyệt có bật JavaScript. Lý tưởng nhất, điều này sẽ được xử lý tốt hơn như một công việc hàng loạt ngoại tuyến (sed tập lệnh trên * nix, v.v.) mỗi năm một lần, nhưng nếu bạn muốn giải pháp JavaScript, tôi nghĩ rằng nó ngắn như vậy. (Bây giờ tôi đã đi và cám dỗ số phận.)


1
năm 2019 nó viết lại tất cả nội dung trang. tui bỏ lỡ điều gì vậy?
Khởi động lại hệ thống

2
@SystemsRebooter - Bạn chỉ có thể sử dụng document.writecho nội dung nội tuyến trong giai đoạn phân tích cú pháp ban đầu (như được hiển thị ở trên, trong <script>...</script>thẻ - hoặc trong một .jstệp được tải bằng scriptthẻ mà không có defer hoặc async). Khi trang được phân tích cú pháp đầy đủ, luồng tài liệu được đóng lại và sử dụng document.writemở lại nó - thay thế hoàn toàn tài liệu bằng một tài liệu mới. Nếu bạn muốn thêm một năm sau khi phân tích cú pháp chính hoàn tất, bạn muốn sử dụng DOM. (Đây không phải là một sự thay đổi, nó luôn luôn là như vậy.)
TJ Crowder

44

Câu trả lời của TJ là tuyệt vời nhưng tôi đã chạy vào một kịch bản trong đó HTML của tôi đã được hiển thị và tập lệnh document.write sẽ ghi đè lên tất cả các nội dung trang chỉ với năm ngày.

Đối với kịch bản này, bạn có thể nối một nút văn bản vào phần tử hiện có bằng mã sau:

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

Vâng - một giải pháp tốt! Tôi khuyên bạn nên di chuyển đoạn mã ngay trước thẻ thân đóng hoặc đến các js khác của bạn ở cuối thân html.
Christian Michael

createTextNode()không diễn giải html như <br>làm thế nào để bạn tạo một nút với HTML?
rubo77

19

Nếu bạn muốn bao gồm khung thời gian trong tương lai, với năm hiện tại (ví dụ: 2017) là năm bắt đầu để năm sau nó sẽ xuất hiện như sau: © © 2017-2018, Company., Sau đó sử dụng mã sau . Nó sẽ tự động cập nhật mỗi năm:

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

© Bản quyền 2017-2018, Công ty.

Nhưng nếu năm đầu tiên đã trôi qua, mã ngắn nhất có thể được viết như thế này:

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

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

1
Tôi biết chỉ <script> ngắn hơn (xem câu trả lời khác), nhưng của anh ấy hiện tại hơn và sẽ luôn hoạt động. Trên thực tế, tôi đã có một ví dụ trong WP nơi mà cái kia không hoạt động, nhưng cái này không có vấn đề gì. Không chắc chắn tại sao WP sẽ đưa ra một vấn đề về điều này ... Tôi biết ngày nay bạn có thể bỏ qua; cuối cùng và tập lệnh mặc định là js, nhưng vẫn còn.
Malachi

9

Giải pháp JS hoạt động rất tốt nhưng tôi sẽ tư vấn về giải pháp phía máy chủ. Một số trang web tôi đã kiểm tra có vấn đề này của toàn bộ trang bị trống và chỉ thỉnh thoảng mới thấy một năm.

Lý do cho điều này là document.write thực sự đã viết trên toàn bộ tài liệu.

Tôi đã yêu cầu bạn tôi thực hiện một giải pháp phía máy chủ và nó đã làm việc cho anh ta. Mã đơn giản trong php

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

Thưởng thức!


1
Giải pháp của bạn rất đơn giản, nhưng vấn đề là câu hỏi có liên quan đến JavaScript
Mo.

2
Haha! Các giải pháp đã được đưa ra khi tôi đăng bài này. Tôi vẫn muốn mọi người biết có những cách khác nữa! Hy vọng nó sẽ giúp một người như tôi trong tương lai!
Arcanyx 4/11/2015

Tôi đồng ý với bạn rằng chúng ta cần xem xét thay thế khi không có giải pháp nào có cùng suy nghĩ. Hãy cẩn thận về việc bỏ phiếu
Mo.

Và nếu giải pháp phía máy chủ là Node.js và JavaScript thì sao?
rorymorris89

2
Nếu trang bị trống, điều này có nghĩa là document.writeđã được sử dụng sau khi DOM đã được tải. Giải pháp là không sử dụng document.writesau khi tải tất cả DOM, hoặc, thậm chí tốt hơn, không sử dụng document.writechút nào.
dùng4642212

8

Đây là phiên bản ngắn nhất có trách nhiệm nhất, thậm chí hoạt động cả AD và BC.

[trống cuộn ...]

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

Đó là nó. 6 byte ngắn hơn câu trả lời được chấp nhận.

Nếu bạn cần tương thích ES5, bạn có thể giải quyết:

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

4
Còn nếu người dùng của bạn quay ngược thời gian trước 1000 AD thì sao? Hoặc nếu người dùng đang sử dụng ứng dụng của bạn> 9999 AD thì sao? #responsibleCode # NotAntherY2K;)
Nick Steele

3
@NickSteele Hy vọng rằng chúng tôi không viết javascript thuần túy vào thời điểm đó.
Michael McQuade

1

Đây là giải pháp tốt nhất tôi có thể nghĩ rằng nó sẽ hoạt động với JavaScript thuần. Bạn cũng sẽ có thể định kiểu phần tử vì nó có thể được nhắm mục tiêu trong CSS. Chỉ cần thêm vào vị trí của năm và nó sẽ tự động được cập nhật.

//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

Đối với React.js, sau đây là những gì làm việc cho tôi ở phần chân trang ...

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.