2009-01-22 12 views
9

Czy istnieje wbudowana metoda lub domyślna wtyczka defacto, która pozwoli automatycznie przypisać unikalny identyfikator do elementu w jQuery, czy też trzeba zaimplementować coś takiego samemu? Szukam odpowiednika jQuery do Prototype's identify methodCzy jQuery ma odpowiednik Elementu Elementu Prototypu?

Oto przykład. Mam pewną strukturę HTML na stronę, która wygląda tak

<span id="prefix_1">foo bar</span> 
... 
<div id="foo"> 
    <span></span> 
    <span></span> 
    <span></span> 
</div> 

chcę przypisać każde z przęseł identyfikator, który będzie przypisany do strony. Więc po wywołaniu coś takiego

$('#foo span').identify('prefix'); //fake code, no such method 

wytopione DOM będzie wyglądać następująco

<span id="prefix_1">foo bar</span> 
... 
<div id="foo"> 
    <span id="prefix_2"></span> 
    <span id="prefix_3"></span> 
    <span id="prefix_4"></span> 
</div> 

Czy jest coś urzędnik-owski/wytrzymałe dla jQuery, czy jest to coś, co większość deweloperów jQuery toczyć na własną rękę ?

+2

Nigdy nie potrzebowałem czegoś takiego ... Do czego byś tego użył? Pamiętaj: jQuery działa z zestawami elementów, a prototyp działa z poszczególnymi elementami - możesz lepiej dopasować swoją logikę do tego modelu. – Shog9

+0

To naprawdę dobry punkt; Spędziłem ostatnie 6 miesięcy z prototypem. Pierwotnie napisałem widżet/wtyczkę jQuery, które działało na pojedynczym elemencie strony, używająC#id do obsługi załączników. Pomyślałem, że najprostszym sposobem na rozszerzenie mojego kodu, by działał na planie, byłaby funkcja identyfikacji.Wyraźnie źle –

+0

Upuść swój komentarz w odpowiedzi, jeśli nadal dbasz o przedstawiciela po drugiej stronie 10k. –

Odpowiedz

22
jQuery.fn.identify = function(prefix) { 
    var i = 0; 
    return this.each(function() { 
     if(this.id) return; 
     do { 
      i++; 
      var id = prefix + '_' + i; 
     } while($('#' + id).length > 0);    
     $(this).attr('id', id);    
    }); 
}; 

$('span').identify('test'); 

przetestowane na:

<span id='test_2'></span> 
<span>test1</span> 
<span>test2</span> 
<span>test3</span> 

włączeniu go do:

<span id="test_2"></span> 
<span id="test_1">test1</span> 
<span id="test_3">test2</span> 
<span id="test_4">test3</span> 
+1

Kod działa i jest doceniany, ale wciąż szukam czegoś, co działo się od jakiegoś czasu i sprawdziłem się w środowisku naturalnym (co w żaden sposób nie jest krytyką podanego kodu) –

+0

Przed pisaniem tego artykułu obejrzałem stronę jQuery. i nie mogłem nic znaleźć, ale dostałem to, skąd przybywasz. Myślę, że wszystko omawiałem. –

+0

Dobra robota Paolo. – Prestaul

3

Nie wiem, ale można to zrobić samodzielnie, dodając atrybut id i dostarczając identyfikator GUID.

Aby dodać atrybut:

$(foo).attr("id", createGuid()); 

Dla realizacji createGuid(), see this question.

Zauważ, że możesz z łatwością przekształcić to w jQuery plug-in, dzięki czemu ta funkcja (możesz nawet nazwać ją identify()) jest dostępna pod dowolnym wyrażeniem $-.

+0

Tak, to nie jest zbyt trudne wdrożenie. Innym podejściem byłoby zapisanie liczby referencyjnej na funkcji wtyczki i jej inkrementacja za każdym razem, gdy została wywołana. Miałem nadzieję, że pojawi się coś bardziej oficjalnego, co złapie wszelkie skrajne przypadki, o których nie pomyślałem. –

+0

Zrozumiano i zgodziłem się na uzyskanie bardziej "natywnej" metody! Interesuje mnie też lepsza odpowiedź ... –

+0

(Informacja/kod jest doceniany i warty oddania głosu, w przypadku, gdy nie było to oczywiste) –

-1

Może spróbuj

$("#foo span").each(function(){ 
    $(this).attr("id", "prefix_" + $(this).parent().index($(this))); 
}); 
+0

Te nie będą unikalne na skalę globalną, którą zazwyczaj chcesz w identyfikatorze. –

2

podstawie Paola rozwiązania:

jQuery.fn.identify = function(prefix) { 
    var i = 0; 
    return this.each(function() { 
     if($(this).attr('id')) return; 
     do { 
      i++; 
      var id = prefix + '_' + i; 
     } while($('#' + id).length > 0);    
     $(this).attr('id', id);    
    }); 
}; 

$('span').identify('test'); 

Mała zmiana, która pozwoli uniknąć ponownego liczenia już wykorzystanych identyfikatorów.

+0

Tak to miałem początkowo, ale jeśli jest tylko element o nazwie "test_2", przeskoczy on prosto do "test_3", nie robiąc nigdy "testu_1" - nie jestem pewien, czy jest to pożądane, czy nie. –

+0

Tak, to z powodu argumentu "i" w wywołaniu "każdy". Usunąłem go, aby uniknąć tego problemu. – gizmo

+0

Yup. Dotarłem też. –

1

bym zmodyfikować daną funkcję lekko i uczynić go:

jQuery.fn.identify = function(prefix) { 
    var i = 0; 
    return this.each(function() { 
     if($(this).attr('id')) return; 
     do { 
      i++; 
      var id = prefix + '_' + i; 
     } while(document.getElementById(id) != null);    
     $(this).attr('id', id);    
    }); 
}; 

identyfikatora może zawierać znaków specjalnych, które wymagają ucieczki w celu poprawnego działania z silnikiem selektora CSS jQuery - jak „”. Zamiast więc znajdować i uciekać, łatwiej i szybciej zastąpić je metodą dokumentu.

Powiązane problemy