Получить идентификатор элемента там, где его нет?
Итак, я использую jqPlot, который имеет это глупое требование, что ему нужен элемент id
приписать сюжет.
Тем не менее, мой javascript использует jQuery, который работает с элементами, и я не хочу полагаться на div, имеющий идентификатор.
Можно ли как-нибудь, учитывая JQuery $(this)
элемент, генерировать id
на лету для div и передать этот идентификатор в мою функцию jqPlot?
Что-то вроде этого:
(function($){ //jquery plugin style
$.fn.myPlot = function(){
//Somehow get id for "this"
var generatedId = somehowCreateID(this);
jqPlot.plot( generatedId );
}
})(jQuery);
Любые советы приветствуются!
3 ответа
Так как идентификаторы должны быть гарантированы, чтобы быть незаполненными, но не должны быть случайными, гораздо лучше просто использовать монотонно увеличивающийся номер идентификатора с префиксом альфа, например так:
function assignID(elem, prefix) {
prefix = prefix || "autoId_";
if (elem.id) {
return (elem.id);
} else {
if (!assignID.cntr) {
assignID.cntr = 1;
}
var id = prefix + assignID.cntr++;
elem.id = id;
return(id);
}
}
Это использует свойство функции assignID.cntr
отслеживать счетчик, который увеличивается на единицу каждый раз, когда он используется, поэтому идентификаторы, назначенные здесь, никогда не будут такими же, как ранее назначенные идентификаторы.
Затем вы можете убедиться, что любой элемент всегда имеет идентификатор, просто выполнив это:
assignID(elem, "plot");
Если вам нужен метод jQuery, который бы делал это, то вы можете сделать это так:
jQuery.assignIDCntr = 1;
jQuery.fn.assignID = function(prefix) {
prefix = prefix || "autoId_";
return this.each(function() {
if (!this.id) {
this.id = prefix + jQuery.assignIDCntr++;
}
});
}
И тогда вы бы использовали это так:
$(".myobjects").assignID("plot");
function generateID(element) {
var id;
do {
id = "_" + Math.floor(Math.random() * 1000000000);
} while (document.getElementById(id) != null);
element.id = id;
return id;
}
Вы можете использовать счетчик с префиксом хотя бы одной буквы (для совместимости с документами, отличными от HTML5):
(function($) {
var counter = 0;
$.fn.myPlot = function() {
return this.each(function() {
jqPlot.plot(this.id || (this.id = "plot" + counter++));
});
}
})(jQuery);