12

カスタムの業界固有の cms (django を使用) を構築しています。バックエンドでは、ウェブマスターは、「/page1」などの内部リンク、またはウェブサイト全体のさまざまなナビゲーション要素に使用する外部リンク (<a>レンダリング時にすべて使用) を指定できます。問題は、内部リンクを現在のタブで開きたいのですが、外部リンクを使用target="_blank"して新しいタブまたはウィンドウを開く必要があることです。

これを達成するためにhtmlを処理するにはどうすればよいですか?

私はサーバー側のソリューションを好みますが、django でレンダリングされたテンプレートを前処理するクリーンな方法を認識していません。したがって、これを行う最も簡単な方法は、おそらく javascript/jquery ソリューションであると思います。各ページの読み込み時に実行されるスクリプトで、すべての外部リンクに target="_blank" 属性を追加しますが、内部リンクには追加しません。しかし、これを行う方法もわかりません。

4

8 に答える 8

42

私はしばらくの間、以下を使用しています。最初に見つけた場所を思い出せません:

$.expr[':'].external = function(obj){
    return !obj.href.match(/^mailto\:/)
           && (obj.hostname != location.hostname)
           && !obj.href.match(/^javascript\:/)
           && !obj.href.match(/^$/)
};

これによりjQueryセレクターが追加される:externalため、次のことができます。

$('a:external').attr('target', '_blank');

カスタム セレクターを使用する利点は、「外部」リンクを構成するものを変更する必要がある場合、1 か所で変更でき、残りのコードについて心配する必要がないことです。たとえば、私の組織には、「外部」ではない特定のサブドメインがありますが、それでも新しいウィンドウで開きたいと考えています。

于 2012-08-20T17:24:18.703 に答える
7

次のようなものを試してください

for (var links = document.links, i = 0, a; a = links[i]; i++) {
        if (a.host !== location.host) {
                a.target = '_blank';
        }
}

すべてのリンクがドキュメントツリーに存在するまでに、スクリプトを実行することを忘れないでくださいwindow.onload

于 2012-08-20T17:13:40.253 に答える
4

次のようなことができます。

$(document.body).on('mouseover', 'a[target!=_blank]:not(.local)', function (evt) {
    var a = $(this);
    var href = a.attr('href');
    var domain = href.match(/^https?:\/\/([^:\/]+)/);
    if (domain && domain[1] && domain[1] !== "yourdomain.com") {
        a.attr('target', '_blank');
    } else {
        a.addClass('local');
    }
});

これにより、クリックするたびに各リンクが処理され、各リンクが複数回処理されることはありません。外部にする必要がある場合は、targetに設定さ_blankれ、新しいウィンドウで開く必要があります。これが動作する jsfiddleです。

更新: リンクがオンサイトにとどまるかどうかを判断する私の方法は、非常に大雑把です。この回答の方法はより徹底しています。代わりに、単純な正規表現の一致をそのテストに置き換えるでしょう。

于 2012-08-20T17:25:22.400 に答える
2

サーバー側で行うことをお勧めします。リンクの場所に応じて、ページのテンプレートを変更します。

于 2012-08-20T17:09:37.793 に答える