【问题标题】:Identify a DOM element between requests if DOM element doesn't have an id attribute?如果 DOM 元素没有 id 属性,则在请求之间识别 DOM 元素?
【发布时间】:2023-03-20 02:58:01
【问题描述】:

我使用localStorage(实际上是在store.js shim 的帮助下)编写了一个快速而肮脏的解决方案来存储(并激活)页面请求上最后选择的Bootstrap 3 导航选项卡窗格。它似乎工作正常,是的,我不太擅长 JavaScript。

无论如何,脚本都可以存储基于window.location.href 和导航选项卡id 属性计算的密钥:

<!-- Nav tabs -->
<ul id="nav-tab-settings" class="nav nav-tabs nav-remember">
    <li class="active"><a href="#home" data-toggle="tab">Home</a></li>
    <li><a href="#profile" data-toggle="tab">Profile</a></li>
    <li><a href="#messages" data-toggle="tab">Messages</a></li>
    <li><a href="#settings" data-toggle="tab">Settings</a></li>
</ul>

<!-- Tab panes -->
<div class="tab-content">
    <div class="tab-pane active" id="home"><h2>Home</h2></div>
    <div class="tab-pane" id="profile"><h2>Profile</h2></div>
    <div class="tab-pane" id="messages"><h2>Messages</h2></div>
    <div class="tab-pane" id="settings"><h2>Settings</h2></div>
</div>

问题:导航选项卡的id 属性在Bootstrap 3 中不是强制性的。我可以在不强制设置id 属性的情况下使我的脚本工作吗?有没有办法在没有id(可能是它的位置)的情况下识别 DOM 元素?如果同一页面在请求之间返回稍微修改的 DOM 怎么办?

如果重要,这里是脚本navs-remember.js

(function ($, store) {
    // Storage not available
    if (!store.enabled) {
        return;
    }

    $(function () {               
        var tabsSelector = '.nav.nav-tabs.nav-remember[id]',
            toggleSelector = 'a[data-toggle="tab"][href]';

        // Identify each nav tabs by current location and its id 
        var computeStorageKey = function (navId) {
            return window.location.href + '#' + navId;
        };

        // Restore last selected tab
        $(tabsSelector).each(function () {
            var nav = $(this),
                navId = nav.attr('id'),
                storedActiveHref = store.get(computeStorageKey(navId)),
                lastActiveToggle = null;

            if (!navId.length || (undefined === storedActiveHref)) {
                return;
            }

            // Get the toggle itself
            lastActiveToggle = nav.find('a[href="' + storedActiveHref + '"]')
                .first();

            // Show the tab
            if (lastActiveToggle.length) {
                lastActiveToggle.tab('show');
            }
        });

        $(tabsSelector + ' ' + toggleSelector).click(function () {
            var toggle = $(this),
                toggleHref = toggle.attr('href'),
                nav = toggle.closest(tabsSelector),
                navId = nav.attr('id');

            // Store toggle href attribute value
            if (toggleHref.length && nav.length && navId.length) {
                store.set(computeStorageKey(navId), toggleHref);
            }
        });
    });
}(jQuery, store));

【问题讨论】:

    标签: javascript jquery twitter-bootstrap dom local-storage


    【解决方案1】:

    您可以使用jQuery.eq(index)将其按位置放置在jquery结果中,因此要获得“主页”选项卡,您需要查找$("tabselector li").eq(0)

    注意它是基于 0 的。


    文档:https://api.jquery.com/eq/

    【讨论】:

    • 问题是在 localStorage 中唯一地存储导航选项卡首选项。因为您可以在不同的页面中拥有具有相同 id 的不同导航选项卡。有什么方法可以在不使用 id 属性的情况下做到这一点?
    • @gremo 如果它们在不同的页面中,因为您正在使用页面的 ID 和 URL 计算它,那么它们在不同页面上具有相同的 ID 肯定不是问题。如果你只反对元素的 ID,你可以给它一个像data-tab-id="GUID" 这样的属性,否则你可以得到它的父级(如果它可能共享一个父级,则可以从中获取.eq)。如果您上传 JSFiddle,它可能会更容易准确地查看您的问题。
    猜你喜欢
    • 2021-01-21
    • 2015-12-23
    • 2021-11-19
    • 2018-11-01
    • 2019-01-11
    • 2019-03-25
    • 2019-05-02
    • 2019-10-18
    • 2020-10-05
    相关资源
    最近更新 更多