0

私が取り組んでいる<base>Web サイトには、Web サイトの URL とは異なる URL を指すタグがあります。私がしたいのは<base>、内部アンカーが正しく機能するようにウェブサイトの実際の URL が必要なため、いくつかの内部アンカーを作成する必要があるため、trueURL ベローを使用して Web ページの URL を見つけることでタグを回避することです。

私が抱えている問題は、trueURL 変数に保存した URL をどのように使用すればよいかわからないことです。それを使用してから、URL に追加の拡張機能を追加して、アンカーを指すようにすることは可能ですか? 以下は、私がやりたいことの大まかな例です

var trueURL = window.location.href;

    <html>

    <ol>
        <li>
            <a href= [trueURL] + "#link1">Link1</a>
        </li>

        <li>
            <a href= [trueURL] + "#link2">Link2</a>
        </li>

        <li>
            <a href= [trueURL] + "#link3">Link2</a>
        </li>
    </ol>

    </html>

したがって、最終的には trueURL#link3 のようなリンクが必要です。

前もって感謝します、

:D:D

4

4 に答える 4

2

あなたの実際のケースはあなたの例よりも複雑であるという仮定に取り組んでいます。そうでない場合は、他の回答を確認してください。これは、必要なことに適している可能性があります。

これが何をするかは...

  1. load イベントで関数を実行windowすると...
  2. DOMタグである内のすべての要素を検索しA、...
  3. A見つかったタグをループして、要素にenhanceクラスがあるかどうかを確認し、そうであれば...
  4. を分割してhref#現在のa要素のhash値を取得します。これを...
  5. 以下と組み合わせます。

    '//' + location.host + location.pathname;
    

    hashまたはクエリ文字列なしで現在のページの URL を指定します。クエリ文字列 (URL の の後にあるもの) が必要な場合は、次?を追加しlocation.searchます。

    '//' + location.host + location.pathname + location.search;
    

この//部分はプロトコル相対であるため、base hrefのプロトコルが何であれ、たとえばhttpまたはを使用することに注意してくださいhttps。ただし、それを指定することもできます。

マークアップ

操作するタグをclass識別するために使用する属性に注意してください。a

<ol>
    <li>
        <a href="#link1">Link 1</a> - 
        No enhance class, should be subject to <strong>BASE HREF</strong>: 
        <strong class="p">&raquo; http://example.com#link1</strong>
    </li>
    <li>
        <a href="#link2" class="enhance">Link 2</a> - 
        Has enhance class, should be:
        <strong class="p">&raquo; http://fiddle.jshell.net/_display/#link2</strong>
    </li>
    <li>
        <a href="#link3" class="enhance">Link 3</a> - 
        Has enhance class, should be:
        <strong class="p">&raquo; http://fiddle.jshell.net/_display/#link3</strong>
    </li>
    <li>
        <a href="#link3" class="enhance">Link 4</a> - 
        Has enhance class, should be:
        <strong class="p">&raquo; http://fiddle.jshell.net/_display/#link4</strong>
    </li>
</ol>​

Javascript

//--
// window.onload is not preferred, window.addEventListener
// should be used. Except that only IE9 supports it, and
// IE8 and lower do not support it, and uses window.attachEvent
// instead, which you can test for. 
//
// I'm using window.onload here simply as a shortcut method and
// for clarity. This can also go in a script tag at the bottom
// of the body tag, in which case you can remove window.onload
// and use a self-calling anonymous function like:
//
//     (function updateLinks(){... all the same as below ...})();
//
// This will ensure you are out of the global variable scope.
//--
window.onload = function updateLinks() {
    //--
    // Modern browsers can use document.getElementsByClassName
    // or you can use a shiv script to add it to browsers that 
    // don't. I'll do it the "manual" way here, and this works
    // cross-browser. The downside is that it will interate 
    // through every A tag on the page, looking for the "small"
    // few that have the el.className we're looking for here.
    //--
    var els = document.getElementsByTagName("a"),
        l = els.length,
        trueURL = '//' + location.host + pathname,
        i, el, hash;

    for (i = 0; i < l; i++) {
        el = els[i];

        if (el.className.indexOf("enhance") != -1) {
            hash = el.href.split('#');
            el.href = trueURL + "#" + hash[1];
        }
    }
};

http://jsfiddle.net/userdude/unnH8/

リンクにカーソルを合わせると、現在の設定が表示されます。いつものように、複数のブラウザで実際のマークアップを徹底的にテストしてください。

于 2012-09-07T08:59:37.603 に答える
1

あなたが真剣trueURL = window.location.hrefに取り組んでいるなら、あなたはあまりにも一生懸命働いています。

リンクを作成するだけ#link1です。自動的に現在のhrefに関連します。

それが単なる例である場合、あなたは興味があるかもしれません:

<BASE href="...">

鬼ごっこ。これにより、ページ内のすべてのリンクの相対的なhrefを一度に変更できます。

<A...>そして、各DOM要素を取得し、プロパティを変更することで、javascriptを使用してそれを行うことができhrefます。

于 2012-09-07T08:57:08.930 に答える
1

最初に、baseまだ使用していない、または使用しているが使用を中止できる場合は、以下をお読みください。

<base>html タグを使用することをお勧めしますか?

これは、二度考えるべき多くの正当な理由を与えてくれます。話の教訓: 通常、 を使用するのは悪い考え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はやや風変わりなツー​​ルであるため、手動で操作すると、異常な副作用が発生する可能性があります。あなたは警告されました。

于 2012-09-10T17:35:23.150 に答える
0

こうすれば良かった

HTML

<ol>
    <li>
        <a class="build">Link1</a>
    </li>

    <li>
        <a class="build">Link2</a>
    </li>

    <li>
        <a class="build">Link2</a>
    </li>
</ol>​

Javascript/Jquery

$(function(){
    var trueURL = window.location.href;
    var i = 1;
    $('a.build').each(function(){
        $(this).attr('href', trueURL + '#link' + i);
        i = i+1;
    });
});

作業コードの例ここ

于 2012-09-07T09:01:38.990 に答える