javascript - 获取点击链接的 ID 并更改其类别

标签 javascript html css dom

我使用 HTML、CSS 和 JavaScript 构建了一个单页“网络应用程序”。有 3 个链接,当用户单击一个链接时,它会显示该链接的内容并隐藏其他链接的内容。单击链接时,它应该变为粗体,但事实并非如此。我做了一些研究,发现我应该使用:

// Bold selected link
this.className = "selectedLink";

在我的函数中获取点击链接的 ID,但它不起作用。为什么我无法在我的函数中获取点击链接的 ID?我想将我的 HTML、CSS 和 JavaScript 分开。

fiddle :http://jsfiddle.net/ZYEUV/

<style>
.selectedLink {
    font-weight: bold;  
}
</style>

<p><a href="#" id="linkPage1" class="selectedLink">Example Page 1</a> | <a href="#" id="linkPage2">Example Page 2</a> | <a href="#" id="linkPage3">Example Page 3</a></p>

<div id="page1">
<h1>Example Page 1</h1>
<p>Content goes here.</p>
</div>

<div id="page2">
<h1>Example Page 2</h1>
<p>Content goes here.</p>
</div>

<div id="page3">
<h1>Example Page 3</h1>
<p>Content goes here.</p>
</div>

<script>
var pages = [page1, page2, page3];

 // Displays page and hides all other pages
function goToPage(pageID) {
    console.log(pageID);
    // Display page
    for (var i = 0; i < pages.length; i++) {
        if (pageID == pages[i].id) {
            // Show page
            pages[i].style.display = "block";

            // Bold selected link
            this.className = "selectedLink";
        } else {
            console.log(pages[i]);
            // Hide page
            pages[i].style.display = "none";

            // Unbold unselected link
            this.className = "selectedLink";
        }
    }
}

linkPage1.onclick = function () {
    goToPage("page1");
};

linkPage2.onclick = function () {
    goToPage("page2");
};

linkPage3.onclick = function () {
    goToPage("page3");
};

goToPage("page1");
</script>

最佳答案

您在设置类名时遇到的问题与函数的调用方式有关。

在您的点击事件处理程序中,this 上下文是定位点。但是,当您调用 goToPage() 时,this 上下文是 window

您可以通过将对 goToPage 的调用更改为

来解决这个问题
goToPage.call(this, "page1");

但是,您随后遇到了下一个问题,即 this 现在指的是最近单击的 anchor 。因此,根据您当前的逻辑,无法删除 selectedLink 类。

快速的解决方案是稍微重构您的代码以匹配您已经使用 pages 数组建立的模式。

Example

脚本:

var pages = [page1, page2, page3];
var links = [linkPage1, linkPage2, linkPage3];

// Displays page and hides all other pages
function goToPage(pageID, evt) {
    console.log(pageID);
    // Display page
    for (var i = 0; i < pages.length; i++) {
        if (pageID == pages[i].id) {
            // Show page
            pages[i].style.display = "block";

            // Bold selcted link
            links[i].className = "selectedLink";
        } else {
            console.log(pages[i]);
            // Hide page
            pages[i].style.display = "none";

            // Unbold unselected link
            links[i].className = "";
        }
    }
}

替代方法

通过稍微更改标记,您可以减少代码中的一些重复并简化添加新页面的过程。

在您的 HTML 中,将数据页面属性添加到您的链接:

<a href="#" id="linkPage1" class="selectedLink" data-page="page1">…</a>

有了这个改变,你的脚本可以被重构为这样的东西:

// List of links with a data-page attribute
var links = document.querySelectorAll("a[data-page]");
var pages = {};

function clickHandler() {
    var page = this.dataset.page;

    for(var i = 0; i < links.length; ++i) {
        links[i].className = "";
        pages[links[i].dataset.page].style.display = "none";
    }

    this.className = "selectedLink";
    pages[page].style.display = "block";
}

// Setup handlers in a loop (maybe use addEventListener here instead)
// Store map of pages by id
for(var i = 0; i < links.length; ++i) {
    links[i].onclick = clickHandler;
    pages[links[i].dataset.page] = document.getElementById(links[i].dataset.page);
}

// Call the click handler with the context of the link to initialize
links[0].onclick.call(links[0]);

Demo

关于javascript - 获取点击链接的 ID 并更改其类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18607416/

相关文章:

javascript - 如何使用 vue js 创建多个输入字段中继器?

html - 仅将 CSS 样式表应用于一个 Div

javascript - 仅针对选定的数据属性?

javascript - 包含冒号的 ID 的 jQuery 选择器

javascript - 如何通过工具 'read-excel-file' 在 ReactJS 上导入 excel?

javascript - 网页抓取/从 Tizen 网站获取数据

javascript - 最后单击的图像周围的边框

html - 具有多个水平元素的包装器的 CSS 文本溢出省略号

css - 对于 Web 应用程序结构的最佳实践,您有哪些建议?

javascript - 使用 Jest 时如何访问外部 javascript 方法/对象?