锚标记href函数

Posted

技术标签:

【中文标题】锚标记href函数【英文标题】:Anchor Tag href functions 【发布时间】:2020-10-13 23:29:20 【问题描述】:

我正在尝试创建一个函数来查找锚标记指向的元素的 id,并将类附加到该元素。我需要这是 vanilla js 而不是 jquery。

例如:

<div id="firstDiv"></div>

<div> Destination </div>
<div> Destination #2 </div>

我们的想法是,一旦您单击锚标记,它会将您带到 div 并将一个类附加到该 div 以启动一个函数。

我编写的脚本运行循环,从 javascript 对象中添加 href 属性和 id 属性的值。见下文:

var rooms = [

id: 1,
name: Example,
,

id:2,
name: Example #2,

]

         for ( x in rooms ) 
           var i = document.getElementById("firstDiv");
           var a = document.createElement("a");
           i.appendChild(a);
           a.href = "#" + rooms[x].id;
           a.innerhtml += rooms[x].name + "<br>";
           a.classList.add("show");
          
        

        var rect = document.getElementsByTagName("rect");
        for ( i = 0; i < rect.length; i++ ) 
           rect[i].setAttribute("id", rooms[i].id);
         

输出:

<div id="firstDiv">
<a href="#1"> Example </a>
<a href="#2"> Example #2 </a>
</div>

<div id="1"> Destination </div>
<div id="2"> Destination #2 </div>

下面的函数是我希望该函数在单击 a 标签时对每个相应的 div 执行的操作的示例。

function attach() 
var div = document.getElementById(rooms[i].id);
div.classList.toggle("active");

关于如何根据我的特殊需要正确编写此函数的任何建议。 for 循环是否最适合这个或 if/else 语句。我都试过了,但都没有成功。

如果我需要进一步澄清,请告诉我。

【问题讨论】:

您的初始 HTML 示例不包含锚点。 锚标签由第一个for循环创建 为什么要在锚标记中添加 BR?使用 CSS。 【参考方案1】:

看来这就是您要问的问题。见内联 cmets。

document.addEventListener("click", function(event)
  // First, check to see if it was an anchor that was clicked
  // in the document
  if(event.target.nodeName === "A")
    // If so, add a class to the target 
    // Get the href attribute and strip off the "#", then find that element and toggle the class
  document.getElementById(event.target.getAttribute("href").replace("#","")).classList.toggle("highlight");
  
);
.highlight  background-color:yellow; 
<div id="firstDiv">
  <a href="#one"> Example </a>
  <a href="#two"> Example #2 </a>
</div>

<div id="one"> Destination </div>
<div id="two"> Destination #2 </div>

【讨论】:

我想这可能就是我想要的。我是否可以将 if 语句中的“A”替换为 js 对象,例如 room[i].id?或者我是否需要将 if 语句放在某种 for 循环中?对不起,我是一个 JavaScript 菜鸟【参考方案2】:

试试这个:

let anchors = document.querySelectorAll("#firstDiv a");

for (let i = 0; i < anchors.length; i++) 
    anchors[i].addEventListener("click", () => 
        var div = document.getElementById(rooms[i].id);
        div.classList.toggle("active");

【讨论】:

【参考方案3】:

你快到了,你只需要为锚标记添加一个 onclick 属性,现在你可以或不能使用第三个附加功能。我将两个实现都包括在内,供你参考。

for ( x in rooms ) 
       var i = document.getElementById("firstDiv");
       var a = document.createElement("a");
       i.appendChild(a);
       a.href = "#" + rooms[x].id;
       a.innerHTML += rooms[x].name + "<br>";
       a.classList.add("show");
       a.onClick=`document.getElementById($rooms[x].id).classList.toggle("active")`;
    

如果你想拥有一个专门的功能,你的循环就变成了

for ( x in rooms ) 
       var i = document.getElementById("firstDiv");
       var a = document.createElement("a");
       i.appendChild(a);
       a.href = "#" + rooms[x].id;
       a.innerHTML += rooms[x].name + "<br>";
       a.classList.add("show");
       a.onClick=`attach($rooms[x].id)`;
    

然后你的附加函数变成:

function attach(id) 
 var div = document.getElementById(id);
 div.classList.toggle("active");
  

如果您有任何问题,请告诉我。

【讨论】:

【参考方案4】:

仅 CSS ?

这个有点跑题了,不过你可以使用:target选择器来设置对应id的样式不用JS

/* element with an id matching the URL fragment */
:target 
   background: gold;  


/* you can combine target with other selectors */
#c:target 
   background: orange




/* just a bit of styling */
a,div 
  padding: .5rem;
  display: block;
  width: 20%;
  float:left;
<a href="#a">Link to A</a>
<a href="#b">Link to B</a>
<a href="#c">Link to C</a>
<a href="#d">Link to D</a>

<div id="a">A</div>
<div id="b">B</div>
<div id="c">C</div>
<div id="d">D</div>

【讨论】:

以上是关于锚标记href函数的主要内容,如果未能解决你的问题,请参考以下文章

锚标记href和onclick

没有 href 属性的锚标记是不是安全?

没有 href 属性的锚标记是不是安全?

在回调函数中调用href

通过锚标签的点击功能停止滚动顶部

锚标记的数据绑定 href 属性