Tham chiếu chéo (neo được đặt tên) trong markdown


Câu trả lời:


692
Take me to [pookie](#pookie)

phải là cú pháp đánh dấu chính xác để nhảy đến điểm neo có tên pookie.

Để chèn một điểm neo của tên đó, hãy sử dụng HTML:

<a name="pookie"></a>

Markdown dường như không bận tâm đến việc bạn đặt điểm neo ở đâu. Một nơi hữu ích để đặt nó là trong một tiêu đề. Ví dụ:

### <a name="tith"></a>This is the Heading

hoạt động rất tốt (Tôi sẽ chứng minh ở đây nhưng trình kết xuất của SO loại bỏ neo.)

Lưu ý về các thẻ tự đóng và id=so vớiname=

Một phiên bản trước của bài đăng này đã đề xuất sử dụng <a id='tith' />, sử dụng cú pháp tự đóng cho XHTML và sử dụng idthuộc tính thay vì name.

XHTML cho phép mọi thẻ được 'trống' và 'tự đóng'. Đó là, <tag />viết tắt là <tag></tag>một cặp thẻ phù hợp với phần thân trống. Hầu hết các trình duyệt sẽ chấp nhận XHTML, nhưng một số thì không. Để tránh các vấn đề về trình duyệt chéo, hãy đóng thẻ rõ ràng bằng cách sử dụng <tag></tag>, như được đề xuất ở trên.

Cuối cùng, thuộc tính name=không được dùng trong XHTML, vì vậy ban đầu tôi đã sử dụng id=, mọi người đều nhận ra. Tuy nhiên, HTML5 hiện tạo một biến toàn cục trong JavaScript khi sử dụng id=và điều này có thể không nhất thiết là những gì bạn muốn. Vì vậy, sử dụng name=bây giờ có khả năng thân thiện hơn.

(Cảm ơn Slipp Douglas đã giải thích cho tôi về XHTML và thợ làm móng đã chỉ ra hiệu ứng phụ của HTML5 - xem các bình luận và câu trả lời của thợ làm móng để biết thêm chi tiết. Dường như hoạt động ở mọi nơi, mặc dù nó không được dùng trong XHTML.)name=


1
Bạn không thể thấy cách liên kết với bản demo tiêu đề của mình sau khi StackOverflow kết xuất lại HTML vì kết xuất của chúng đang tước thẻ <a> của bạn . Đó là, bạn không thể trong StackOverflow Markdown.
Slipp D. Thompson

2
Tuy nhiên, điều này sẽ hoạt động trong các trình kết xuất Markdown khác, tự do hơn, nhưng bạn sẽ cần một thẻ <a> đóng ; các <a> thẻ không cho phép tự đóng. Ngoài ra, tôi thấy trình duyệt của mình bỏ qua tiêu đề trừ khi thẻ <a> ở trước nội dung của tiêu đề. Sửa chữa được thực hiện cho các ví dụ của bạn.
Slipp D. Thompson

2
Giữ lấy đó, cao bồi. Chỉ vì bạn không có bất kỳ kiểu dáng nào <a>mà không có an href không có nghĩa là nó tự đóng. Trừ khi tôi hoàn toàn điên rồ, cả hai điều này: test-xhtml11 và [ sln.6bitt.com/public/test-html5.html[(test-html5) hiển thị phần còn lại của trang trong thẻ <a>. Đi trước và kiểm tra với một thanh tra web của sự lựa chọn của bạn.
Slipp D. Thompson

4
@Slipp: Bây giờ tôi nghĩ là tôi hiểu rồi. Bạn đã mã hóa <a id="hi"/> rest of doc, nhưng nó đã được đối xử như thế nào <a id="hi"> rest of doc</a>. (Và phân tích thành phần của trang cũng cho thấy điều này.) Lỗi của tôi: Tôi đã xem các yếu tố được hiển thị không phải là nguồn thô. Bạn có nghĩ rằng câu trả lời nên được sửa đổi, theo quan sát này?
Steve Powell

3
Các namethuộc tính cũng tạo ra các biến toàn cục (xem stackoverflow.com/questions/3434278/... ), vì vậy bạn cũng có thể sử dụng các idthuộc tính như là mục tiêu của các URL nhận dạng mảnh, như dự định.
Bobby Jack

92

Trên bitbucket.org, giải pháp được bình chọn sẽ không hoạt động. Thay vào đó, khi sử dụng các tiêu đề (với ##), có thể tham chiếu chúng là các neo bằng cách đặt tiền tố là # markdown-header-my-header-name, trong đó # markdown-header- là tiền tố ngầm được tạo bởi trình kết xuất và phần còn lại là tiêu đề tiêu đề thấp hơn với dấu gạch ngang thay thế khoảng trắng.

Thí dụ

## My paragraph title

sẽ tạo ra một mỏ neo như thế này

#markdown-header-my-paragraph-title

Toàn bộ URL trước mỗi tham chiếu neo là tùy chọn, nghĩa là

[Some text](#markdown-header-my-paragraph-title)

tương đương với

[Some text](https://bitbucket.org/some_project/some_page#markdown-header-my-paragraph-title) 

với điều kiện là họ ở trong cùng một trang

Nguồn: https://bitbucket.org/tutorials/markdowndemo/overview (chỉnh sửa nguồn của tệp .md này và xem cách neo được tạo ra).


1
Điều này có thể làm như là tốt. Theo điều này: confluence.atlassian.com/bitbucket/ , bitbucket hỗ trợ tiện ích mở rộng Mục lục có thể tự động tạo liên kết neo dựa trên tiêu đề tài liệu. Phần mở rộng TOC được ghi lại ở đây: pythonhosted.org/Markdown/extensions/toc.html Thêm văn bản "[TOC]" vào phần đầu của tài liệu để tạo.
Phile nhị phân

8
Trong Github, ## My paragraph titlesẽ tạo ra neo sau user-content-my-paragraph-title, vì vậy bạn có thể tham chiếu nó với [Một số văn bản] (# user-content-my-Đoạn-title). Tuy nhiên, tôi chưa tìm thấy tài liệu chính thức cho việc này.
toto_tico

Điều này cũng giúp tôi trên Bitbucket - hoạt động như một cơ duyên.
Scott Byers

1
Đây là thông tin hữu ích; cảm ơn bạn. Tuy nhiên, trình kết xuất đánh dấu mà không có tiện ích mở rộng sẽ không tạo ra các neo này cho bạn và việc xáo trộn tên tiêu đề sẽ dẫn đến xung đột id id (hoặc một số thủ thuật phân biệt không hữu ích, như đủ số). Id neo rõ ràng là tốt hơn, dễ kiểm soát hơn, không chịu sự thay đổi ngẫu nhiên do cập nhật văn bản (xem mẹo ở trên) và hữu ích cho việc neo nhiều hơn chỉ là các tiêu đề. Cả hai kỹ thuật là cần thiết nói chung.
Steve Powell

Trên stackedit.io [linky](#header) là một mỏ neo đủ và cũng hoạt động khi được xuất bản lên Gist.
Felipe Alvarez

67

Sử dụng a name. Sử dụng một idkhông cần thiết trong HTML 5 và sẽ tạo các biến toàn cục trong JavaScript của bạn

Xem đặc tả HTML 5, 5.9.8 Điều hướng đến một mã định danh phân đoạn - cả hai idnameđược sử dụng.

Điều quan trọng cần biết là hầu hết các trình duyệt vẫn biến ID thành các biến toàn cục . Đây là một bài kiểm tra nhanh . Sử dụng nameđể tránh tạo ra toàn cầu và bất kỳ xung đột nào có thể dẫn đến.

Ví dụ sử dụng tên:

Take me to [pookie](#pookie)

Và neo đích:

### <a name="pookie"></a>Some heading

5
Hạ cấp. Đối số biến toàn cục là yếu vì bạn không nên (trực tiếp) xác định các biến toàn cục trong JS của mình, vì vậy sẽ không có xung đột xảy ra. Ngoài ra, ngữ nghĩa của nameidlà khác nhau.
Marnen Laibow-Koser

9
@ MarnenLaibow-Koser Không ai đang thảo luận về việc xác định các biến toàn cục trong JS. Tạo một ID trong HTML sẽ tạo ra một window.someid toàn cầu trong hầu hết các trình duyệt.
mikemaccana

14
@ MarnenLaibow-Koser Nhiều thư viện (ví dụ, không phải là JS của riêng bạn, mà là của người khác) sử dụng một toàn cầu duy nhất - ví dụ: bộ nạp tiền phạt. Nếu bạn tạo một phần tử có ID là fineuploader, bạn sẽ không thể sử dụng fineuploadermô-đun. Tránh tạo ra những quả cầu không cần thiết giúp tránh những xung đột đó.
mikemaccana

5
Tôi sẽ quan tâm để chạy một số thử nghiệm của trường hợp đó và tìm ra cái nào được ưu tiên. Tôi đánh giá cao vấn đề lý thuyết, nhưng trong nhiều năm phát triển phía khách hàng, tôi chưa bao giờ có ID phá vỡ bất kỳ JS phía khách hàng nào (miễn là HTML có hiệu lực). Tôi sẽ tiếp tục sử dụng chúng khi chúng phù hợp về mặt ngữ nghĩa cho đến khi tôi gặp vấn đề thực sự.
Marnen Laibow-Koser

2
@ MarnenLaibow-Koser Tôi (và nhiều người khác) đã có ID HTML phá vỡ JavaScript thực - có một ví dụ rất thực tế trong nhận xét bạn đang trả lời! Có rất nhiều phong cách và công ty luôn sử dụng các lớp, thậm chí cho các singletons, và đây là lý do tại sao.
mikemaccana

17

Markdown Anchor hỗ trợ hashmark, do đó, một liên kết đến một neo trong trang sẽ chỉ đơn giản là[Pookie](#pookie)

Tạo neo không thực sự được hỗ trợ trong Gruber Markdown, nhưng là trong các triển khai khác, chẳng hạn như Markdown Extra .

Trong Markdown Extra, ID neo được thêm vào tiêu đề hoặc tiêu đề phụ với {#pookie}.

Github Flavored Markdown trong các trang kho Git (nhưng không phải trong Gists) tự động tạo ra các neo với một số thẻ đánh dấu trên tất cả các tiêu đề (h1, h2, h3, v.v.), bao gồm:

  • id="user-content-HEADERTEXT"
  • class="anchor"
  • href="#HEADERTEXT"
  • aria-hidden="true" (đây là biểu tượng liên kết svg hiển thị khi di chuột qua)

Không bao gồm biểu tượng aria / svg, khi một người viết:

  • # Header Title

Github tạo ra:

  • <h1><a id="user-content-header-title" class="anchor" href="#header-title">Header Title</a></h1>

Do đó, người ta không cần phải làm gì để tạo các liên kết tiêu đề và luôn có thể liên kết với chúng bằng:

  • Liên kết đến [Header Title](#header-title)

16

Không có cú pháp sẵn có để thực hiện điều này trong cú pháp Markdown ban đầu, nhưng Markdown Extra cung cấp một phương tiện để ít nhất gán ID cho các tiêu đề - sau đó bạn có thể liên kết dễ dàng. Cũng lưu ý rằng bạn có thể sử dụng HTML thông thường trong cả Markdown và Markdown Extra và namethuộc tính này đã được thay thế bởi idthuộc tính trong các phiên bản HTML gần đây hơn.


9

Đối với bất cứ ai đang tìm kiếm một giải pháp cho vấn đề này trong GitBook. Đây là cách tôi làm cho nó hoạt động (trong GitBook). Bạn cần gắn thẻ tiêu đề của bạn một cách rõ ràng, như thế này:

# My Anchored Heading {#my-anchor}

Sau đó liên kết đến neo này như thế này

[link to my anchored heading](#my-anchor)

Giải pháp và các ví dụ bổ sung, có thể được tìm thấy ở đây: https://seadude.gitbooks.io/learn-gitbook/


cảm ơn! những công việc này! điều này nên được nâng cao!
Dexter

Câu trả lời tốt nhất! Cảm ơn
invis

7

Đi dự tiệc muộn, nhưng tôi nghĩ rằng sự bổ sung này có thể hữu ích cho những người làm việc cùng rmarkdown. Trong rmarkdownđó có hỗ trợ tích hợp cho các tham chiếu đến các tiêu đề trong tài liệu của bạn.

Bất kỳ tiêu đề được xác định bởi

# Header

có thể được tham chiếu bởi

get me back to that [header](#header)

Sau đây là một .rmdtệp độc lập tối thiểu cho thấy hành vi này. Nó có thể được dệt kim đến .pdf.html.

---
title: "references in rmarkdown"
output:
  html_document: default
  pdf_document: default
---

# Header

Write some more text. Write some more text. Write some more text. Write some more text. Write some more text. Write some more text. Write some more text. Write some more text. Write some more text. Write some more text. Write some more text. 

Go back to that [header](#header).

4

Sử dụng Markdown mới nhất, bạn sẽ có thể sử dụng cú pháp sau:

[](){:name='anchorName'}

Điều này sẽ tạo ra HTML sau:

<a name="anchorName"></a>

Nếu bạn muốn neo có văn bản, chỉ cần thêm văn bản neo trong dấu ngoặc vuông:

[Some Text](){:name='anchorName'}


Có vẻ như chỉ Marukubiết về cú pháp này. Xem dấu vết
Ulysse BN

3

Đối với hầu hết các máy phát điện markdown phổ biến. Bạn có một neo tự tạo đơn giản trong mỗi tiêu đề. Ví dụ với pandoc , neo được tạo sẽ là một trường hợp sên kebab của tiêu đề của bạn.

 echo "# Hello, world\!" | pandoc
 # => <h1 id="hello-world">Hello, world!</h1>

Tùy thuộc vào trình phân tích cú pháp đánh dấu nào bạn sử dụng, neo có thể thay đổi (lấy ví dụ về các câu trả lời của biểu tượng và La muerte Peluda, chúng khác nhau!). Xem babelmark này nơi bạn có thể thấy các neo được tạo tùy thuộc vào việc thực hiện đánh dấu của bạn .

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.