【问题标题】:How to use JavaScript variable in an HTML link如何在 HTML 链接中使用 JavaScript 变量
【发布时间】:2012-09-11 11:43:43
【问题描述】:

我正在处理的网站有一个<base> 标记指向与该网站所拥有的不同的URL。我想做的是绕过<base>标签,通过使用下面的trueURL来查找网页的url,因为我需要它来构建一些内部锚点,因为我需要网站的实际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

【问题讨论】:

  • 您无需在 href 属性中添加 [trueURL]。它会自动将 #link 附加到您现有的浏览器 URL。
  • 我看不到您想要解决的问题,如果您使用的是 a 标签,则不需要 trueURL。你能在 jsfiddle.net 中举例说明你试图实现的目标吗?那么我们也许可以帮助你。
  • 对不起,我意识到我没有正确地问我的问题,我希望我的重新表述比以前的版本更好。

标签: javascript html tags


【解决方案1】:

我正在假设您的真实案例比您的示例更复杂。如果不是,请查看其他答案,这可能更适合您需要做的事情。

这会做的是......

  1. window 加载事件上运行一个函数,该函数将...
  2. 找到DOM 中的每个元素,即A 标记,然后...
  3. 循环遍历找到的A 标记并检查元素是否具有enhance 类,如果是...
  4. href 拆分为# 以获得当前a 元素的hash 值,我们将...
  5. 将其与以下内容结合起来:

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

    给我们当前页面的 URL,不带 hash 或查询字符串。如果您想要查询字符串(URL 中? 之后的内容),请添加location.search

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

注意,// 部分与协议相关,因此它将使用base href 的任何协议,例如httphttps。但是,您可能需要指定。

标记

注意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/

将鼠标悬停在链接上可查看当前设置。与往常一样,在多个浏览器中使用真实标记进行彻底测试

【讨论】:

  • 不要试图窃取你的雷声,因为这与我刚刚发布的我自己的答案相同,只是它使用了效率较低但得到更好支持的技术。我的答案最初是针对已关闭的副本。
  • 我做了一些非常繁重的编辑来改进答案,这有一些问题(正如所指出的,它是即兴的)。如果您不想要或不喜欢它,请随意回滚。我还发布了一个小提琴演示。
【解决方案2】:

如果您对trueURL = window.location.href 是认真的,那么您工作太努力了。

只需创建链接#link1 - 它会自动相对于当前的href。

如果这只是一个示例,您可能对以下内容感兴趣:

<BASE href="...">

标签。这将让您一次更改页面中所有链接的相对href。

您可以通过获取每个&lt;A...&gt; DOM 元素并修改href 属性来使用javascript。

【讨论】:

    【解决方案3】:

    首先,如果您还没有使用base,或者现在可以放弃使用它,请阅读:

    Is it recommended to use the &lt;base&gt; html tag?

    这会让您有很多充分的理由三思而后行。故事的寓意:使用base 通常是个坏主意。有充分的理由,而且很有用;在与设计师合作时,我曾多次使用它来获得我可以使用的标记的本地副本,但仍保持与网站资产的连接。但是对于生产现场来说,就太聪明了一半。

    此外,这个答案最初是为 different question 写的,它是完全重复的,所以我在这里发布这个,尽管已经有一个非常相似的答案。


    您是否可以控制标记,或者您可以使用选择器仅获取您想要影响的元素?你可以:

    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 支持。如果您必须支持低于 IE9 的版本,请参阅 Jeremy J Starcher 的回答,了解“效率较低”但支持更好的方法.还有document.querySelectorAll,IE8及以上以及所有其他主流浏览器都支持。如果您只需要支持 IE8,我建议您使用它来选择您的链接,而不是 Jeremy 演示的方法。

    我还将更改延迟了五秒钟,以便您看到它有效。显然,这对您来说不是必需的(很可能)。

    我现在唯一不确定的是我的.replace() 是否总能在所有浏览器中找到要替换的base.href,所以在做之前检测相对 url 的存在可能会更好替换,因此您可以适当地做其他任何事情。有关这个可能的“问题”的一些相关背景,请参阅我的问题,该问题涉及浏览器如何在 DOM 中以不同方式处理 href 属性:

    Method for selecting elements in Sizzle using fully-qualified URLs

    此外,如果它位于内容之后的内联 script 标记中,或者位于 body 标记的末尾,这可能会最无缝地工作,在这种情况下,您将需要删除 window.addEventListener 部分并替换为自执行函数。

    他们是其他选项,都可能有点问题:

    • 彻底清除base 标签。但是,如果您这样做,您首先要检查是否需要手动将 base.href 内容插入链接中,否则我确信事情可能会破裂或变脆。
    • a链接添加一个事件监听器,你想使用你的真实链接并以这种方式操作它onclick,只是不要忘记在点击处理函数的末尾return false,所以浏览器不遵循链接。这可能是最无缝的方法,但可能并不适合所有情况。
    • 可能还有其他人。

    一定要使用真实世界的标记进行测试。base 是一个有点古怪的工具,因此处理它可能会导致不寻常的副作用。 你被警告了

    【讨论】:

      【解决方案4】:

      我会这样做

      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;
          });
      });
      

      工作代码示例Here

      【讨论】:

      • 正如@Ariel 所述,您不需要trueUrl = window.location.href。看看这个fiddle
      • 哦,酷,没想到,我只是专注于这个问题,没想到=D
      • 我重新编辑了我的问题并添加了一些可能使我的问题更清晰的信息
      猜你喜欢
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 1970-01-01
      • 2014-08-21
      • 1970-01-01
      • 2013-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多