【问题标题】:Creating a selected tab in a HTML tabstrip在 HTML 选项卡条中创建选定的选项卡
【发布时间】:2022-01-15 18:05:53
【问题描述】:

2022 年 2 月 17 日:我花了一段时间,但我弄清楚了发生了什么。每个 TD 都有一个锚点(A 标记),并且 TD 和锚点都有类。锚只有一个类,但它是最后应用的,所以 TD 显然将该类作为其类列表的一部分。因此,当前类被应用于锚标记,而不是 TD。我还没有弄清楚该怎么做。 “当前”类需要在锚类之前应用到 TD,而不是之后。但这可能会影响发生的事情。锚文本颜色可能会覆盖选定的文本颜色,因此我不确定如何纠正此问题。

2022 年 1 月 19 日:我认为这很好,但是直到我开始将它应用到另一个页面时我才注意到的一个问题,我有两行选项卡,其中一些在两侧都有更多空间链接文字。当链接文本占据单元格内的大部分空间时,这种情况就不那么普遍了。

如果您单击链接文本,页面将更新以显示新文档,但选项卡中唯一被隐藏的部分是链接文本。单元格区域的其余部分保持未选择的颜色。

如果您单击链接文本周围的区域,则整个单元格背景会被隐藏,但链接文本颜色不会更改为 hilite 颜色,并且页面不会更新以显示新文档(链接不会被关注)。

脚本正在构建所有 td.td1 类的列表。该链接在其中,但不是同一类。如何让脚本将整个单元格视为单击的内容,并在单击链接或单元格区域时更新单元格和链接文本,以及如何在单元格区域中单击以被视为点击链接?

我正在处理的页面仍然是一个框架集页面。我正在对它做与其他页面相同的事情,但是在这个页面中要处理 33 张工作表,所以我需要一段时间才能将它放到 iframe 页面上。 Here is the link 到现在的页面,这样你就可以看到我在说什么。脚本代码是相同的,对已放置在此线程中的代码所做的任何更改都将对此页面有用。


2022 年 1 月 17 日:最终解决方案:它不起作用,因为脚本需要在页面加载之后运行,而不是之前。最简单的解决方案是将脚本放在表格之后(在结束 body 标记之前),但是(正如 sean-7777 在他的最新评论中指出的那样)您也可以让文档加载器在页面加载之前不运行脚本。我选择将脚本放在表格之后。它适用于页面的框架集和 iframe 版本。现在要弄清楚当你使用后退按钮时如何让hilite重置......

2022 年 1 月 16 日-2:在 Firefox 中使用 Web 开发人员工具后,我发现在加载页面时初次使用后脚本被忽略。我相信这就是它不起作用的原因。


2022 年 1 月 16 日-1:我已将页面从具有单独的 tabstrip 文件的框架集转换为具有 iframe 的单个文档,以包含目标页面和 iframe 下方的 tabstrip 代码。 JavaScript 代码仍然不起作用。

为了进一步解释,我发现 body、iframe 和 table/link css 不会从单独的 css 文件中应用,所以我将样式信息放入 head 部分的样式标签中并且它起作用了。我将使用样式表的代码留在了头部,但注释掉了。 JavaScript 代码也是如此,只是它仍然无法工作,甚至放在 head 部分的脚本标记中。

我的网站上有这两个版本,因此任何阅读本文的人都可以并排查看它们,看看它们看起来是否相同(即使一个是框架集而另一个是 iframe),并且 javascript 代码不起作用.非常感谢任何帮助找出原因。

Frameset versioniFrame version


2022 年 1 月 15 日-3 日:感谢 sean-7777 的帮助。我在下面添加了他的代码,并且该函数在运行代码片段中按预期工作。但是它在我的页面中不起作用。我不知道为什么。它可能与框架集有关,但只有将其转换为 div 和 iframe 才能确定地告诉我。
2022 年 1 月 15 日-2:在 Firefox 中试用 Web 开发人员工具后,我确定问题出在框架集上。因为 tabstrip 在一个框架中,所以其中的 javascript 在第一次之后永远不会被执行。将脚本放入框架集中不起作用,因为包含标签条的框架永远不知道发生了什么,而标签条也不知道。我将尝试将框架集修改为包含 tabstrip 和 iframe 的单个文档,以在单击选项卡时包含其他文档,看看是否能解决问题。
2022 年 1 月 15 日-1 日:我找到了 https://stackoverflow.com/questions/42089472/javascript-change-td-bgcolor-onclick (由于某种原因无法修复链接),这实际上可以回答我的问题,但请愿人正在使用无序列表,而我正在使用由 Excel 生成的 HTML 标签条(并由我进行了大量修改)。我使用 CSS 来创建翻转效果,它完美无缺。但我缺乏的是一种突出显示当前选定选项卡的方法。我不确定它是否可以单独使用 CSS 完成,或者我是否必须使用 JavaScript。

这是标签条代码:

// Get all the tabs
const tabs = document.querySelectorAll("td.td1");
// Store the previous selected tab so we know which one to remove the class from
let prevSelected;
// Give each tab code
for (const tab of tabs) {
  // Add a function to run when it is clicked
  tab.addEventListener("click", evt => {
    // Remove the current class from the last selected element
    // On first run, prevSelected is not defined, so we need to check
    if (prevSelected) prevSelected.classList.remove("current");
    // Update prevSelected
    prevSelected = evt.srcElement;
    // Add the current class
    evt.srcElement.classList.add("current");
  });
}
.bold {font-weight:700;}

/* tabstrip */

.body1 {
  background-image: none;
  font-size: 10.0pt;
  font-style: normal;
  font-family: Arial, sans-serif;
  text-decoration: none;
  vertical-align: middle;
}

.td1 {
  background-color: springgreen;
  font-family: Arial, sans-serif;
  white-space: nowrap;
  padding: 0 0 0 0;
}

.td1:hover {
  background-color: lightyellow;
  color: orange;
}

.smaller {
  font-size: small;
}

.anchor {
  text-decoration: none;
  color: darkgreen;
}

.anchor:hover {
  background-color: lightyellow;
  color: orange;
}
.current {background-color:red;}
<BODY class='body1'>
  <TABLE style='border:none;border-spacing:1px'>
    <TR>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet001.htm' target='frSheet'>One-Handed Weapons</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet002.htm' target='frSheet'>Two-Handed Weapons</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet003.htm' target='frSheet'>Ranged Weapons</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet004.htm' target='frSheet'>Ammunition</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet005.htm' target='frSheet'>Shields & Armor</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet006.htm' target='frSheet'>Accessories</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet007.htm' target='frSheet'>Technicks & Magicks</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet008.htm' target='frSheet'>Augments</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet009.htm' target='frSheet'>Items</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet010.htm' target='frSheet'>The Bazaar</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet011.htm' target='frSheet'>Grimoires</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet012.htm' target='frSheet'>Bazaar Packages</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet013.htm' target='frSheet'>Shops</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet014.htm' target='frSheet'>License Board</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet015.htm' target='frSheet'>Lower Half</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet016.htm' target='frSheet'>Upper Half</a>&nbsp;</TD>
    </TR>
  </TABLE>
</BODY>

【问题讨论】:

  • 这看起来像是维护的噩梦,尤其是当您必须更新演示文稿时。
  • 你是如何实现这个的?它是在 iFrames 中还是类似于“主页”?您能否分享更多代码。
  • David Thomas - 这是最终产品,不,我这样做是为了简化维护。不知道你在说什么。
  • Jonas m - Excel 生成一个框架集。我还没有将其更改为 div/iframe。那即将到来。如果有帮助,我可以添加框架集页面。

标签: javascript html css


【解决方案1】:

为元素添加一个onClick事件监听器,并为其添加一个类。

// Get all the tabs
const tabs = document.querySelectorAll("td.td1");
// Store the previous selected tab so we know which one to remove the class from
let prevSelected;
// Give each tab code
for (const tab of tabs) {
  // Add a function to run when it is clicked
  tab.addEventListener("click", evt => {
    // Remove the current class from the last selected element
    // On first run, prevSelected is not defined, so we need to check
    if (prevSelected) prevSelected.classList.remove("current");
    // Update prevSelected
    prevSelected = evt.srcElement;
    // Add the current class
    evt.srcElement.classList.add("current");
  });
}
/* tabstrip */

.body1 {
  background-image: none;
  font-size: 10.0pt;
  font-style: normal;
  font-family: Arial, sans-serif;
  text-decoration: none;
  vertical-align: middle;
}

.current {
  background-color: red;
}

.td1 {
  background-color: springgreen;
  font-family: Arial, sans-serif;
  white-space: nowrap;
  padding: 0 0 0 0;
}

.td1:hover {
  background-color: lightyellow;
  color: orange;
}

.smaller {
  font-size: small;
}

.anchor {
  text-decoration: none;
  color: darkgreen;
}

.anchor:hover {
  background-color: lightyellow;
  color: orange;
}
<BODY class='body1'>
  <TABLE style='border:none;border-spacing:1px'>
    <TR>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet001.htm' target='frSheet'>One-Handed Weapons</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet002.htm' target='frSheet'>Two-Handed Weapons</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet003.htm' target='frSheet'>Ranged Weapons</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet004.htm' target='frSheet'>Ammunition</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet005.htm' target='frSheet'>Shields & Armor</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet006.htm' target='frSheet'>Accessories</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet007.htm' target='frSheet'>Technicks & Magicks</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet008.htm' target='frSheet'>Augments</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet009.htm' target='frSheet'>Items</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet010.htm' target='frSheet'>The Bazaar</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet011.htm' target='frSheet'>Grimoires</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet012.htm' target='frSheet'>Bazaar Packages</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet013.htm' target='frSheet'>Shops</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet014.htm' target='frSheet'>License Board</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet015.htm' target='frSheet'>Lower Half</a>&nbsp;</TD>
      <TD class='td1 bold smaller'>&nbsp;<a class='anchor' href='sheet016.htm' target='frSheet'>Upper Half</a>&nbsp;</TD>
    </TR>
  </TABLE>
</BODY>

【讨论】:

  • 我对 JavaScript 不是很精通。您没有展示如何实现事件处理程序。我自己尝试过这样做,但所发生的只是使用 .current 选择器选择了第一个选项卡,当我单击其他选项卡时没有任何变化。
  • 为了澄清,我将脚本代码添加到标签页头部的脚本标签中。然后我将当前类添加到第一个选项卡中,这样它就会被选中。然后我为每个 TD 添加了一个 onClick 属性。然后我意识到我没有办法调用脚本,因为 onClick 需要一个函数来调用。我尝试在脚本中添加一个函数包装器,但这也不起作用。然后我将 onClick 从 TD 移动到每个选项卡上的 A。那也没有用。你能告诉我如何实现这个脚本吗?
  • 我想我可能已经弄清楚为什么它不起作用了。你的脚本代码是jquery吗?我没有使用 jquery,所以我不知道这是否会按预期工作。
  • 我已确定您的代码不是 jquery,但在此处或我的页面中无法正常工作。我找到了另一个查询stackoverflow.com/questions/42089472/…,第三个答案在那个 sn-p 跑步者中有效,但不是作为独立页面。不知道为什么。
  • @WayneCa 对此感到抱歉。我已经更新了代码。出于某种原因,我不得不使用addEventListener 而不是.onClick
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多