我正在使用ASP.NET MVC编写应用程序。与传统的ASP.NET相比,您更负责在生成的页面中创建所有ID。 ASP.NET会给你讨厌但独特的ID。
我想添加一个快速的小jQuery脚本来检查我的文档是否有重复的ID。它们可能是DIVS的图像,图像,复选框,按钮等。
<div id="pnlMain"> My main panel </div>
<div id="pnlMain"> Oops we accidentally used the same ID </div>
我正在寻找一个设置和忘记类型的实用程序,当我做一些粗心的事情时,它会警告我。
是的,我只在测试期间使用它,并且也欢迎替代品(例如firebug插件)。
答案 0 :(得分:199)
以下内容将向控制台记录警告:
// Warning Duplicate IDs
$('[id]').each(function(){
var ids = $('[id="'+this.id+'"]');
if(ids.length>1 && ids[0]==this)
console.warn('Multiple IDs #'+this.id);
});
答案 1 :(得分:31)
此版本稍微快一些,您可以将其复制到书签按钮,使其成为书签。
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');
})();
答案 2 :(得分: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);
}
}
}
}());
答案 3 :(得分:12)
您应该尝试HTML Validator(Firefox扩展程序)。它肯定会告诉你页面有重复的ID以及更多。
答案 4 :(得分:7)
为什么不验证你的HTML?
不允许使用双ID,通常会出现解析错误。
答案 5 :(得分: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>');
}
答案 6 :(得分:3)
在ES6中重写的jQuery最佳答案:
[...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);
}
});
答案 7 :(得分:1)
这可能会成功 它会警告重复的所有元素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>
答案 8 :(得分: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.";
}
答案 9 :(得分: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,console,output
(此处代码是在关闭body
代码之前添加的)
答案 10 :(得分: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
答案 11 :(得分:0)
我们可以将以下脚本直接粘贴到浏览器控制台中以获取重复的ID
[...document.querySelectorAll('[id]')].filter(el => [...document.querySelectorAll('[id]')].map(el => el.id).filter(id => id === el.id).length > 1);
参考:radio group