【问题标题】:Generate ID dynamically based on position in DOM根据 DOM 中的位置动态生成 ID
【发布时间】:2012-09-12 02:09:50
【问题描述】:

我需要根据 DOM 中的级别生成元素的值。例如如果我在文档级别有一个点击事件(即监听页面上的任何点击)并且呈现这样的 HTML,它需要遍历 DOM,直到您看到填充的“ID”属性。

<div id="someid">
<div>
    <span>
        <p>
            <a href="javascript:void(0);">
                <span>
                    <strong>Googlie</strong> 
                </span>
            </a>                
        </p>
    </span>
</div>

当我点击“Googlie”时,它应该会生成如下内容: someid__div_span_p_a_span_strong

问题: 我确实有一些代码可以做到这一点,但它有问题。在上面,如果我有两个元素,如下所示。如何为强元素生成独特的价值?我可以在不使用 childNodes 位置的情况下拥有一些东西吗?如果有人更改元素之间的空白,则 childNodes 值会更改。

...<span>
<strong>Googlie</strong> <br/> <strong>Bingie</strong>

...

    document.onclick = function(obj) {
    var node = obj.target;
    var res = [];
    var etA = "";
    res[0] = false;
    while (!res[0]) {
        res = GetIdFor(node);
        if (!res[0]) {
            var end = node.parentNode.childNodes.length;
            for (var i = 0; i < end; i++) {
                var j = node.parentNode.childNodes[i];
                if (j.nodeType === 1 && j === node) {
                    break;
                }
            }
            etA = "_" + node.tagName + etA;
            node = node.parentNode;
        }
        else {
            etA = res[1] + "_" + etA;
        }
    }
    alert(etA);
};
function GetIdFor(elem) {
    var res = [];
    res[0] = false;
    var d = elem.getAttribute("ID");
    if (d !== "undefined" && d !== null) {
        res[0] = true;
        res[1] = d;
    }
    return res;
}

现在,我知道 jQuery 可以在这里提供帮助,但这不是重点。 :) 想法?除了使用 childNodes 级别来生成此值之外,我没有其他选择吗?

【问题讨论】:

  • 你想用那个 id 达到什么目的?
  • @Oriol。我们的想法是获取该 id 并能够进行逆向工程并在某种报告中再次找到以显示单击的位置。谢谢!
  • @Rac123 然后,如果我理解得很好,你会得到元素,设置一个 id,然后使用该 id 来查找具有该 id 的元素(本身)。是不是有点废话?

标签: javascript-events javascript


【解决方案1】:

我从Here 改编了这个答案。作者建议将 [#] 作为兄弟编号,以便您可以区分兄弟姐妹,例如someid__div_span_p_a_span_strong[0]

工作 jsFiddle Here.

function elementPath(element)
{
    return $(element).parents().andSelf().map(function() {
        var $this = $(this);
        var tagName = this.nodeName;
        if ($this.siblings(tagName).length > 0) {
            tagName += "[" + $this.prevAll(tagName).length + "]";
        }
        return tagName;
    }).get().join(".").toLowerCase();
}

$(document).ready(function() {
    $(document).click(function(e) {
        e.stopPropagation();
        window.alert(elementPath(e.target));
    });
});

【讨论】:

  • 感谢阿瑞斯阿凡达!发布后,我阅读了 jQuery 选择器,发现它总是只返回 ElementType 节点(值 ===1)而不是其他节点,这使我所追求的变得容易,事实上你在你的回答中回答了它。我选择这个作为答案,但我更多的是研究非 jQuery 方式。我想我实际上得到了它,它产生了这样的结果: __#someid__TBODY-1_TR-1_TD-2_DIV-1_DIV-2_A-1 其中“-1”是 childNodes 的位置。我的想法是使用 jQuery 进行逆向工程。不过感谢您的帮助!
  • 如果您解决了问题,请随时发布并接受您自己的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-24
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
  • 2015-01-11
  • 1970-01-01
  • 2020-10-22
相关资源
最近更新 更多