最初に、base
まだ使用していない、または使用しているが使用を中止できる場合は、以下をお読みください。
これは、二度考えるべき多くの正当な理由を与えてくれます。話の教訓: 通常、 を使用するのは悪い考えbase
です。正当な理由があり、便利です。私は、デザイナーと協力してマークアップのローカル コピーを作成し、サイトのアセットへの接続を維持するために何度も使用してきました。しかし、本番サイトにとっては、半分賢すぎます。
また、この回答はもともと完全に重複した別の質問に対して書かれたものであるため、ここに投稿していますが、すでに非常によく似た回答があります。
マークアップを制御できますか、またはセレクターを使用して、影響を与えたい要素のみを取得できますか? あなたは出来る:
HTML (クラスに注意してくださいtruelink
。)
<ol>
<li>
<a href="#link1" class="truelink">True Link1</a>
</li>
<li>
<a href="#link2" class="truelink">True Link2</a>
</li>
<li>
<a href="#link3" class="truelink">True Link3</a>
</li>
</ol>
Javascript
window.addEventListener('load', function links(){
var base = document.getElementsByTagName('base')[0],
links = document.getElementsByClassName('truelink'),
l = links.length,
uri = 'http://www.host.tld/path?query=test';
console.log('Base:', base, ', True Links:', links);
console.log('Modifying links in five seconds...');
setTimeout(function go(){
console.log('Modifying links now...');
while (l--){
links[l].href = links[l].href.replace(base.href, uri);
}
console.log('Base: ', base, 'True Links: ', links);
}, 5000);
});
http://jsfiddle.net/M5Hdk/
このテクニックはdocument.getElementsByClassName
、バージョン 9 まで IE でサポートされていない の使用を示していることに注意してください。またdocument.querySelectorAll
、IE8 以降およびその他すべての主要なブラウザでサポートされている もあります。IE8 のみをサポートする必要がある場合は、これを使用して、Jeremy が示す方法でリンクを選択することをお勧めします。
また、変更を 5 秒間遅らせて、動作を確認できるようにします。明らかに、これは必要ありません (ほとんどの場合)。
.replace()
現時点で確信が持てない唯一のことは、すべてのブラウザで常に置換対象が見つかるかどうかということbase.href
です。そのため、置換を行う前に相対 URL の存在を検出する方がよい場合があります。そうすれば、他のことを行うことができます。適切に。この考えられる「問題」に関連する背景については、ブラウザhref
がDOMで属性を異なる方法で処理する方法を扱っている私の質問を参照してください。
完全修飾 URL を使用して Sizzle で要素を選択する方法
script
また、コンテンツの直後またはタグの最後にあるインライン タグに含まれる場合、これはおそらく最もシームレスに機能します。body
この場合、その部分を削除window.addEventListener
して自己実行関数に置き換えます。
それらは他のオプションであり、すべておそらくもう少し問題があります。
base
タグを完全に吹き飛ばします。base.href
ただし、これを行う場合は、コンテンツをリンクに手動で挿入する必要があるかどうかを最初に確認する必要があります。
a
真のリンクを使用するリンクにイベントリスナーを追加し、そのようonclick
に操作します。クリックハンドラー関数の最後に忘れないreturn false
でください。これにより、ブラウザーはリンクをたどりません。これはおそらく最もシームレスな方法ですが、すべての状況に適しているとは限りません。
- おそらく他の人。
実際のマークアップで必ずテストしてください。 base
はやや風変わりなツールであるため、手動で操作すると、異常な副作用が発生する可能性があります。あなたは警告されました。