Получить идентификатор элемента там, где его нет? - PullRequest
4 голосов
/ 17 января 2012

Итак, я использую 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 ]

4 голосов
/ 17 января 2012

Поскольку идентификаторы должны быть гарантированы, чтобы быть незаполненными, но не обязательно быть случайными, гораздо лучше просто использовать монотонно увеличивающийся номер идентификатора с префиксом альфа, например так:

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");
0 голосов
/ 17 января 2012

Вы можете использовать счетчик с префиксом хотя бы одной буквы (для совместимости с документами, отличными от HTML5):

(function($) {
    var counter = 0;
    $.fn.myPlot = function() {
       return this.each(function() {
           jqPlot.plot(this.id || (this.id = "plot" + counter++));
       });
    }
})(jQuery);
0 голосов
/ 17 января 2012
function generateID(element) {
    var id;
    do {
        id = "_" + Math.floor(Math.random() * 1000000000);
    } while (document.getElementById(id) != null);

    element.id = id;
    return id;
}
...