Tôi có thể tạo liên kết với 'target = Ngày _ trống' trong Markdown không?


462

Có cách nào để tạo một liên kết trong Markdown mở trong một cửa sổ mới không? Nếu không, bạn nên giới thiệu cú pháp nào để làm điều này. Tôi sẽ thêm nó vào trình biên dịch markdown mà tôi sử dụng. Tôi nghĩ rằng nó nên là một lựa chọn.


Vì vậy, như đã chỉ ra trong các câu trả lời, nó không phải là một tính năng trong đánh dấu. Nếu bạn muốn biến điều này thành một sitewide mặc định để liên kết, David Morrow có câu trả lời . Hoặc nếu bạn chỉ muốn làm điều đó trong một trường hợp, thì câu trả lời của Matchu nói rằng bạn thực sự phải viết điều đó bằng HTML.
JGallardo


Câu hỏi của bạn không cụ thể về những gì bạn đang làm, nhưng một số công cụ hoặc trình duyệt đánh dấu (không chắc chắn) nhận ra khi liên kết bạn đang tạo đang trỏ đến một tên miền khác và sẽ mở những thứ đó trong một tab mới. Đối với tôi, có những lúc loại bỏ skhỏi https:là đủ để có được chức năng tôi muốn.
Josh Gust

Câu trả lời:


379

Theo như cú pháp Markdown, nếu bạn muốn có được chi tiết đó, bạn sẽ phải sử dụng HTML.

<a href="http://example.com/" target="_blank">Hello, world!</a>

Hầu hết các động cơ Markdown Tôi đã nhìn thấy cho phép xem HTML thuần tuý cũ, chỉ dành riêng cho những tình huống như thế này, nơi một hệ thống đánh dấu chữ đơn thuần chỉ là sẽ không cắt nó. (Ví dụ: công cụ StackOverflow.) Sau đó, họ chạy toàn bộ đầu ra thông qua bộ lọc danh sách trắng HTML, bất kể, vì ngay cả một tài liệu chỉ có Markdown cũng có thể dễ dàng chứa các cuộc tấn công XSS. Như vậy, nếu bạn hoặc người dùng của bạn muốn tạo _blankliên kết, thì có lẽ họ vẫn có thể.

Nếu đó là một tính năng bạn sẽ sử dụng thường xuyên, có thể có ý nghĩa để tạo cú pháp của riêng bạn, nhưng nói chung nó không phải là một tính năng quan trọng. Nếu tôi muốn khởi chạy liên kết đó trong một cửa sổ mới, tôi sẽ tự bấm vào nó, cảm ơn.


19
Bạn biết gì không? Tôi đồng ý với bạn và alex . Tôi quyết định không sử dụng _blankchút nào. Đó là trải nghiệm người dùng tốt hơn để giữ mọi thứ trong một trình duyệt. Họ chỉ có thể nhấn trở lại hoặc nhấp chuột lệnh (người dùng Mac ở đây :)), như bạn nói.
ma11hew28

1
Tôi có javascript chạy trên trang có thêm _blank cho tất cả các liên kết bên ngoài miền của tôi. like @alex có trong câu trả lời tiếp theo
David Silva Smith

3
Tôi muốn đề xuất (với mong muốn có thể đọc rõ ràng và nội tuyến) cú pháp sau: [Visit this page](http::/link.com(để có được ý tưởng mở .
Augustin Riedinger

4
Mục tiêu đơn giản = "_ trống" có thể nguy hiểm! Thêm cũng rel = "noopener" vào thẻ! ( site.google.com.vn/site/bughunteruniversity/nonvuln/ Kẻ )
Max Vyaznikov

1
@MaxVyaznikov Thú vị. Bạn có nghĩ rằng sẽ an toàn hơn nếu các trình duyệt cung cấp một cửa sổ bật lên trên cạnh để đăng nhập? Tách giao diện người dùng đăng nhập cho các trang web khỏi giao diện người dùng đăng nhập giả mạo và giả mạo được tạo bởi các trang web "trông giống nhau". Nó có thể là nhiều hơn bây giờ, nơi nó khó khăn hơn trong quá khứ.
1,21 gigawatt

350

Kramdown hỗ trợ nó. Nó tương thích với cú pháp Markdown tiêu chuẩn, nhưng cũng có nhiều phần mở rộng. Bạn sẽ sử dụng nó như thế này:

[link](url){:target="_blank"}

7
Điều này dường như không hoạt động khi sử dụng công cụ Markdown trên Mac :-(
Netsi1964 24/03/13

48
Hoạt động tuyệt vời với jekyll!
bholagabbar

1
Các kramdown cú pháp: [tên link] (URL_LINK) {: target = "_ blank"} có thể được phân tích vào HTML bằng cách sử dụng kramdown biên tập trực tuyến: http://trykramdown.herokuapp.com/ tôi đã sử dụng nó bởi vì tôi đã có khá một vài tài liệu tham khảo kramdown, và muốn tránh gõ lại chúng.
algoquant

4
Có cách nào trong jekyll để đặt cái này làm mặc định không? Tôi muốn tất cả các liên kết trong bài đăng trên blog của tôi mở ratarget="_blank"
ahirschberg

10
Nó không hoạt động. Nó chỉ hiển thị {: target = "_ blank"} dưới dạng văn bản.
Benny

113

Tôi không nghĩ có một tính năng đánh dấu.

Mặc dù có thể có các tùy chọn khác khả dụng nếu bạn muốn mở các liên kết bên ngoài trang web của riêng bạn bằng JavaScript.

var links = document.links;

for (var i = 0, linksLength = links.length; i < linksLength; i++) {
   if (links[i].hostname != window.location.hostname) {
       links[i].target = '_blank';
   } 
}

jsFiddle .

Nếu bạn đang sử dụng jQuery, nó đơn giản hơn một chút ...

$(document.links).filter(function() {
    return this.hostname != window.location.hostname;
}).attr('target', '_blank');

jsFiddle .


1
Tôi đồng ý với bạn, nhưng trong trường hợp bạn đang ở trong iframe, bạn cần phải thoát ra khỏi khung với liên kết.
David Morrow

2
Tôi thấy lần duy nhất tôi buộc mọi người vào một cửa sổ mới là khi tôi đi được nửa câu liên kết ở đâu đó bên ngoài và tôi muốn cung cấp nguồn cho nhận xét của mình mà không làm gián đoạn dòng chảy. Đoạn trích js này là lý tưởng cho mục đích - cảm ơn, được nâng cấp :)
tehwalrus

14
Tôi nghĩ rằng trích dẫn từ Jakob Nielson không áp dụng ở đây nữa. Anh ta phàn nàn về việc mở các cửa sổ mới, nhưng ngày nay target = "_ blank" mở trong một tab mới thay thế. Cá nhân tôi không thích nó khi các liên kết đến các tên miền khác không mở trong các tab mới.
Alexander Rechsteiner

3
Ngoài ra: bởi vì nói Jakob Nielsen says you shouldn't do thatlà một cuộc tranh luận khủng khiếp.
Ola Tuvesson

2
Tôi sẽ thêm vào đây rằng NÀY cũng thích hợp hơn là một giải pháp toàn cầu. Nó giữ Markdown của bạn sạch sẽ, đó là điểm của Markdown.
Adam Michael Wood

47

Với Markdown-2.5.2, bạn có thể sử dụng:

[link](url){:target="_blank"}

2
Tôi đã thử điều này và nó đã không làm việc cho tôi. Sử dụng với django 1.6
joel goldstick 9/2/2015

5
Hoạt động với Jekyll v2.4.0 (cũng có thể hoạt động với các phiên bản trước đó)
nicksuch

5
Đây là kramdown (và vì Jekyll sử dụng kramdown, nó hoạt động với Jekyll).
z3ntu

1
Dường như không thể có được cú pháp này để làm việc trong GitLab. Tôi không chắc phiên bản nào của Markdown hiện đang được sử dụng.
Rockin4Life33

Có cách nào để làm điều này thành mặc định để tôi không phải chỉ định nó cho mọi liên kết không?
Connel

8

Một giải pháp toàn cầu là đưa <base target="_blank"> vào <head>yếu tố trang của bạn . Điều đó có hiệu quả thêm một mục tiêu mặc định cho mọi yếu tố neo. Tôi sử dụng markdown để tạo nội dung trên trang web dựa trên Wordpress của mình và tùy biến chủ đề của tôi sẽ cho phép tôi đưa mã đó vào đầu mỗi trang. Nếu chủ đề của bạn không làm điều đó, có một trình cắm


8

Tôi đang sử dụng Grav CMS và điều này hoạt động hoàn hảo:

Nội dung / Nội dung:
Some text[1]

Thân bài / Tham khảo:
[1]: http://somelink.com/?target=_blank

Chỉ cần đảm bảo rằng thuộc tính đích được truyền trước, nếu có các thuộc tính bổ sung trong liên kết, sao chép / dán chúng vào cuối URL tham chiếu.

Cũng hoạt động như liên kết trực tiếp:
[Go to this page](http://somelink.com/?target=_blank)


Để tham khảo, đây là chương tài liệu liên quan .
domsson

7

Đối với sử dụng đánh dấu ma:

[Google](https://google.com" target="_blank)

Tìm thấy nó ở đây: https://cmatskas.com/open-external-links-in-a-new-window-ghost/


1
tôi thích giải pháp của bạn Như tôi đã thử nó với các cấu hình khác nhau, có vẻ như nó chỉ hoạt động trong liên kết nội tuyến . có thể có một cách để liên kết với các liên kết tham chiếu . đại loại như : [open new window][1] \n [1]: (https://abc.xyz" target="_blank). có lẽ tôi nhầm lẫn một cái gì đó, hoặc điều này không phải là để làm việc theo cách đó?
MrIsaacs

7

Vì vậy, không đúng khi bạn không thể thêm thuộc tính liên kết vào URL Markdown. Để thêm thuộc tính, hãy kiểm tra trình phân tích cú pháp đánh dấu cơ bản đang được sử dụng và phần mở rộng của chúng là gì.

Đặc biệt, pandoccó một phần mở rộng để kích hoạt link_attributes, cho phép đánh dấu trong liên kết. ví dụ

[Hello, world!](http://example.com/){target="_blank"}
  • Đối với những người đến từ R (ví dụ sử dụng rmarkdown, bookdown,blogdown và vân vân), đây là cú pháp mà bạn muốn.
  • Đối với những người không sử dụng R , bạn có thể cần bật tiện ích mở rộng trong cuộc gọi đến pandocvới+link_attributes

Lưu ý: Điều này khác với kramdownhỗ trợ của trình phân tích cú pháp, đây là một trong những câu trả lời được chấp nhận ở trên. Cụ thể, lưu ý rằng kramdown khác với pandoc vì nó yêu cầu dấu hai chấm - :- khi bắt đầu dấu ngoặc nhọn - {}ví dụ:

[link](http://example.com){:hreflang="de"}

Đặc biệt:

# Pandoc
{ attribute1="value1" attribute2="value2"}

# Kramdown
{: attribute1="value1" attribute2="value2"}
 ^
 ^ Colon

Điều này làm việc cho tôi trong môi trường markdown tùy chỉnh của chúng tôi. Cảm ơn!
klewis

6

Bạn có thể làm điều này thông qua mã javascript như vậy:

 
var pattern = /a href=/g;
var sanitizedMarkDownText = rawMarkDownText.replace(pattern,"a target='_blank' href=");

Mã JSFiddle


6

Trong dự án của tôi, tôi đang làm điều này và nó hoạt động tốt:

[Link](https://example.org/ "title" target="_blank")

Liên kết

Nhưng không phải tất cả các trình phân tích cú pháp cho phép bạn làm điều đó.


Hầu như hoạt động, nhưng ngay cả ví dụ của bạn hiển thị với url được mã hóa vào attr tiêu đề, chứ không phải là attrs mới (xem nguồn hoặc chỉnh sửa nút dưới dạng html): <a href="https://example.org/" rel="nofollow" title="title&quot; target=&quot;_blank">Link</a>
Graham P Heath

6

Không có cách nào dễ dàng để làm điều đó và như @alex đã lưu ý rằng bạn sẽ cần sử dụng JavaScript. Câu trả lời của anh ấy là giải pháp tốt nhất nhưng để tối ưu hóa nó, bạn có thể chỉ muốn lọc các liên kết sau nội dung.

<script>
    var links = document.querySelectorAll( '.post-content a' );  
    for (var i = 0, length = links.length; i < length; i++) {  
        if (links[i].hostname != window.location.hostname) {
            links[i].target = '_blank';
        }
    }
</script>

Mã này tương thích với IE8 + và bạn có thể thêm nó vào cuối trang. Lưu ý rằng bạn sẽ cần thay đổi ".post-content a" thành lớp bạn đang sử dụng cho bài đăng của mình.

Như đã thấy ở đây: http://blog.hubii.com/target-etric-for-links-on-ghost/


0

Tôi gặp vấn đề này khi cố gắng thực hiện markdown bằng PHP.

Vì người dùng đã tạo các liên kết được tạo bằng markdown cần phải mở trong một tab mới nhưng các liên kết trang web cần ở trong tab, tôi đã thay đổi markdown để chỉ tạo các liên kết mở trong một tab mới. Vì vậy, không phải tất cả các liên kết trên trang liên kết ra, chỉ những liên kết sử dụng markdown.

Trong markdown, tôi đã thay đổi tất cả đầu ra liên kết để <a target='_blank' href="...">đủ dễ sử dụng find / thay thế.


0

Tôi không đồng ý rằng đó là trải nghiệm người dùng tốt hơn để ở trong một tab trình duyệt. Nếu bạn muốn mọi người ở lại trên trang web của bạn hoặc quay lại để đọc xong bài viết đó, hãy gửi chúng đi trong một tab mới.

Dựa trên câu trả lời của @ davidmorrow, hãy ném javascript này vào trang web của bạn và biến các liên kết bên ngoài thành các liên kết với target = _blank:

    <script type="text/javascript" charset="utf-8">
      // Creating custom :external selector
      $.expr[':'].external = function(obj){
          return !obj.href.match(/^mailto\:/)
                  && (obj.hostname != location.hostname);
      };

      $(function(){
        // Add 'external' CSS class to all external links
        $('a:external').addClass('external');

        // turn target into target=_blank for elements w external class
        $(".external").attr('target','_blank');

      })

    </script>


0

Để hoàn thành alex trả lời (ngày 13 tháng 12 '10)

Một mục tiêu tiêm thông minh hơn có thể được thực hiện với mã này:

/*
 * For all links in the current page...
 */
$(document.links).filter(function() {
    /*
     * ...keep them without `target` already setted...
     */
    return !this.target;
}).filter(function() {
    /*
     * ...and keep them are not on current domain...
     */
    return this.hostname !== window.location.hostname ||
        /*
         * ...or are not a web file (.pdf, .jpg, .png, .js, .mp4, etc.).
         */
        /\.(?!html?|php3?|aspx?)([a-z]{0,3}|[a-zt]{0,4})$/.test(this.pathname);
/*
 * For all link kept, add the `target="_blank"` attribute. 
 */
}).attr('target', '_blank');

Bạn có thể thay đổi các ngoại lệ regrec bằng cách thêm nhiều tiện ích mở rộng trong (?!html?|php3?|aspx?)cấu trúc nhóm (hiểu regrec này tại đây: https://regex101.com/r/sE6gT9/3 ).

và đối với phiên bản không có jQuery, hãy kiểm tra mã bên dưới:

var links = document.links;
for (var i = 0; i < links.length; i++) {
    if (!links[i].target) {
        if (
            links[i].hostname !== window.location.hostname || 
            /\.(?!html?)([a-z]{0,3}|[a-zt]{0,4})$/.test(links[i].pathname)
        ) {
            links[i].target = '_blank';
        } 
    }
}

0

Tự động hóa chỉ cho các liên kết bên ngoài, sử dụng GNU sed & make

Nếu ai đó muốn làm điều này một cách có hệ thống cho tất cả các liên kết bên ngoài, CSS không có tùy chọn . Tuy nhiên, người ta có thể chạy sedlệnh sau khi HTML (X) được tạo từ Markdown:

sed -i 's|href="http|target="_blank" href="http|g' index.html

Điều này có thể được tự động hóa thêm bằng cách thêm sedlệnh trên vào a makefile. Để biết chi tiết, xem GNU makehoặc xem tôi đã làm điều đó như thế nào trên trang web của mình .


-3

Điều này hoạt động với tôi: [Liên kết trang] (url của bạn ở đây "(mục tiêu | _blank)")

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.