jQuery检查DOM中是否有重复的ID


106

我正在使用ASP.NET MVC编写应用程序。与传统的ASP.NET相比,您在生成的页面中创建所有ID的责任要大得多。ASP.NET会给您带来讨厌但唯一的ID。

我想添加一个快速的小jQuery脚本来检查我的文档中是否有重复的ID。它们可能是DIVS,图像,复选框,按钮等的ID。

<div id="pnlMain"> My main panel </div>
<div id="pnlMain"> Oops we accidentally used the same ID </div> 

我正在寻找一种设置并忘记类型的实用程序,当我不小心做某事时会警告我。

是的,我只会在测试期间使用此工具,也欢迎使用其他替代方法(例如firebug插件)。

Answers:


214

以下将警告记录到控制台:

// Warning Duplicate IDs
$('[id]').each(function(){
  var ids = $('[id="'+this.id+'"]');
  if(ids.length>1 && ids[0]==this)
    console.warn('Multiple IDs #'+this.id);
});

完善!谢谢!已经发现了三个我有重复ID的地方。令我有些沮丧的是,大多数人对此问题的解决方案是使用“萤火虫”或“ html验证程序”。这还不够好!我想在更糟糕的情况下捕捉意外的重复。
Simon_Weaver

4
hehe和我切换了console.warn发出警报(...),所以我必须修复它们:)
Simon_Weaver

已经发现这非常有用和有价值。我认为它应该成为框架中的标准-特别是在调试过程中
Simon_Weaver 2009年

6
这项工作所需的DOM遍历数量非常惊人
Josh Stodola

8
非常好的解决方案,但是它需要额外的引号,var ids = $('[id=\''+this.id+'\']');因此它可以与ID中的点和其他奇怪的东西一起使用。
zidarsk8 2011年

33

此版本的速度稍快一些,您可以将其复制到书签按钮以使其成为书签。

javascript:(function () {
  var ids = {};
  var found = false;
  $('[id]').each(function() {
    if (this.id && ids[this.id]) {
      found = true;
      console.warn('Duplicate ID #'+this.id);
    }
    ids[this.id] = 1;
  });
  if (!found) console.log('No duplicate IDs found');
})();

3
该算法更好,只需要遍历一个dom遍历,而不是每个匹配元素一个。应该是公认的答案。
m_x 2015年

1
对于输入了name = id的表单,它给出假肯定。 javascript:(function () { var ids = {}; var found = false; $('[id]').each(function() { var id = this.getAttribute('id'); if (id && ids[id]) { found = true; console.warn('Duplicate ID #'+id); } ids[id] = 1; }); if (!found) console.log('No duplicate IDs found'); })(); 会更好。
alpo

14

我的页面很大,因此脚本运行太慢而无法完成(多条“继续脚本”消息)。这很好。

(function () {
    var elms = document.getElementsByTagName("*"), i, len, ids = {}, id;
    for (i = 0, len = elms.length; i < len; i += 1) {
        id = elms[i].id || null;
        if (id) {
            ids[id] =  ids.hasOwnProperty(id) ? ids[id] +=1 : 0;
        }
    }
    for (id in ids) {
        if (ids.hasOwnProperty(id)) {
            if (ids[id]) {
                console.warn("Multiple IDs #" + id);
            }
        }
    }
}());

大!谢谢。我经常忘记我已经在生产环境中运行了它,现在真的应该对其进行优化-或添加调试设置以将其打开/关闭!
Simon_Weaver 2011年

我一直在努力组合不同配置的脚本,这肯定会对我有很大帮助。谢谢:)
Andy Gee 2012年

+1为普通的JavaScript解决方案。找到重复的ID之后,我$x("//*[@id='duplicated-id']")在控制台中使用了XPath表达式()查询具有重复的ID的元素。
卡西莫林2015年


8

您为什么不只是验证html?

不允许使用双ID,通常您会收到解析错误。


2
有什么选择呢?
Simon_Weaver

同样在FF中,在具有验证器的工具下使用Web开发人员工具栏
-IEnumerator

4
当使用来自jQuery ui的对话框之类的小部件时,经常会在创建对话框后不进行清理的情况下,最终在DOM中出现重复项。
guido 2012年

4

定位重复项的另一种方法,但这会添加一类错误,因此将显示红色文本:

// waits for document load then highlights any duplicate element id's
$(function(){ highlight_duplicates();});

function highlight_duplicates() {
  // add errors when duplicate element id's exist
  $('[id]').each(function(){ // iterate all id's on the page
    var elements_with_specified_id = $('[id='+this.id+']');
    if(elements_with_specified_id.length>1){
      elements_with_specified_id.addClass('error');
    }
  });


  // update flash area when warning or errors are present
  var number_of_errors = $('.error').length;
  if(number_of_errors > 0)
    $('#notice').append('<p class="error">The '+number_of_errors+
      ' items below in Red have identical ids.  Please remove one of the items from its associated report!</p>');
}

那真是太酷了!谢谢。我实际上发现最初接受的答案非常宝贵。捕获了很多东西并节省了数小时的时间!
Simon_Weaver 2009年

很酷,但是为什么不只使用控制台功能,而让其余功能呢?逻辑和表示等的分离……
摩根(Morgan)

3

最好的jQuery答案,用ES6重写:

  [...document.querySelectorAll('[id]')].forEach(el => {
    const dups = document.querySelectorAll(`[id="${el.id}"]`);

    if (dups.length > 1 && dups[0] === el) {
      console.error(`Duplicate IDs #${el.id}`, ...dups);
    }
  });

2

这可能会解决问题,它将警告具有重复项的所有元素ID。

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<html>
    	<head>
    		<script type="text/javascript" src="jquery-1.3.1.min.js"></script>
    		<script type="text/javascript">
    			function findDupes()
    			{
    			  var all = $("*");
    			  for(var i = 0; i < all.length; i++)
    			  {
    			      if (all[i].id.length > 0 && $("[id='" + all[i].id + "']").length > 1) alert(all[i].id);
    			  }
    			}
    		</script>
    	</head>
    	<body onload="findDupes()">
    		<div id="s"></div>
    		<div id="f"></div>
    		<div id="g"></div>
    		<div id="h"></div>
    		<div id="d"></div>
    		<div id="j"></div>
    		<div id="k"></div>
    		<div id="l"></div>
    		<div id="d"></div>
    		<div id="e"></div>
    	</body>
    </html>


1

我喜欢它,因为它向控制台吐出了实际的元素。这样可以更轻松地调查正在发生的事情。

function CheckForDuplicateIds() {
var ids = {};
var duplicates = [];

$("[id]").each(function() {
    var thisId = $(this).attr("id");
    if (ids[thisId] == null) {
        ids[thisId] = true;
    } else {
        if (ids[thisId] == true) {
            duplicates.push(thisId);
            ids[thisId] = false;
        }
    }
});
if (duplicates.length > 0) {
    console.log("=======================================================");
    console.log("The following " + duplicates.length + " ids are used by multiple DOM elements:");
    console.log("=======================================================");
    $(duplicates).each(function() {
        console.warn("Elements with an id of " + this + ":");
        $("[id='" + this + "']").each(function() {
            console.log(this);
        });
        console.log("");
    });
} else {
    console.log("No duplicate ids were found.");
}
return "Duplicate ID check complete.";

}


在建议的Chrome扩展HTML验证程序对我不起作用的情况下,此功能非常有用,因为当将新HTML添加到页面时,它能够检测到重复的ID。
Giselle Serate

1

您可以使用此解决方案,该解决方案将在控制台中打印出重复ID(如果有)的列表。

加载DOM后,您可以直接在控制台中运行代码(复制/粘贴),并且不需要像jQuery这样的附加依赖项。

您可以使用它来快速发现HTML标记中的可能错误。

    (function (document) {
        var elms = document.body.querySelectorAll('*[id]'),
            ids = [];
        for (var i = 0, len = elms.length; i < len; i++) {
            if (ids.indexOf(elms[i].id) === -1) {
                ids.push(elms[i].id);
            } else {
                console.log('Multiple IDs #' + elms[i].id);
            }
        }
    })(document);

一个例子:

https://jsbin.com/cigusegube/edit?html,控制台,输出

(此处在关闭body标签之前添加了代码)


0

我创建了一个函数,您可以在其中检查特定元素,以搜索整个页面内或整个页面上的重复ID:

function duplicatedIDs(container) {

    var $container  = container ? $(container) : $('body'),
        elements = {},
        duplicatedIDs = 0;
        totalIDs = 0;

    $container.find('[ID]').each(function(){
        var element = this;

        if(elements[element.id]){
            elements[element.id].push(element);
        } else  {
            elements[element.id] = [element];
        }
        totalIDs += 1;

    });

    for( var k in elements ){
        if(elements[k].length > 1){
            console.warn('######################################')
            console.warn('        ' + k )
            console.warn('######################################')
            console.log(elements[k]);
            console.log('---------------------------------------');
            duplicatedIDs += elements[k].length
        }
    }
    console.info('totalIDs', totalIDs);
    console.error('duplicatedIDs', duplicatedIDs);
}

duplicatedIDs('#element'); //find duplicated ids under that element
duplicatedIDs(); // entire page
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.