2009-01-22 6 views
9

Gibt es eine eingebaute Methode oder defacto Standard-Plugin, mit dem Sie automatisch eine eindeutige ID zu einem Element in jQuery zuweisen können, oder müssen Sie so etwas selbst implementieren? Ich bin auf der Suche nach der jQuery entspricht Prototype's identify methodHat jQuery eine Entsprechung zu Element.identify von Prototype?

Hier ist ein Beispiel. Ich habe einige HTML-Struktur auf einer Seite, die

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

ich jede der Spannweiten eine ID zuweisen möchten, wie diese aussieht, die auf der Seite eindeutig sein wird. Also nach so etwas wie dieser Aufruf

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

Der gerenderte DOM würde wie folgt aussehen

<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> 

Gibt es etwas offizielle ish/robust für jQuery, oder ist dies etwas, die meisten jQuery-Entwickler auf ihrem eigenen Rolle ?

+2

Ich habe noch nie so etwas gebraucht ... Wofür würden Sie es verwenden? Denken Sie daran: jQuery arbeitet mit einer Menge von Elementen, während Prototype mit einzelnen Elementen arbeitet - Sie können besser daran arbeiten, Ihre Logik an dieses Modell anzupassen. – Shog9

+0

Das ist ein wirklich guter Punkt; Ich habe die letzten 6 Monate mit Prototypen verbracht. Ich hatte ursprünglich ein jQuery-Widget/-Plugin geschrieben, das auf einem einzelnen Seitenelement funktionierte, indem ich #id zum Anhängen von Handlern verwendete. Ich dachte, der einfachste Weg, meinen Code zu erweitern, um auf einem Set zu arbeiten, wäre eine Identifizierungsfunktion.Offensichtlich falsch –

+0

Lassen Sie Ihren Kommentar in einer Antwort, wenn Sie immer noch über rep auf der anderen Seite von 10k kümmern. –

Antwort

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'); 

diese Getestet auf:

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

wandte es sich an:

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

Der Code funktioniert und wird geschätzt, aber ich bin immer noch auf der Suche nach etwas, das schon eine Weile existiert und sich in freier Wildbahn bewährt hat (was in keiner Weise einen Kritikpunkt darstellt) –

+0

Ich habe die jQuery-Website durchforstet, bevor ich das geschrieben habe und ich konnte nichts finden, aber ich verstehe, wo du herkommst. Ich denke, ich habe alles abgedeckt. –

+0

Gut gemacht Paolo. – Prestaul

3

Nicht, dass ich weiß, aber Sie könnten dies selbst tun, indem Sie das id Attribut hinzufügen und eine GUID bereitstellen.

das Attribut hinzu:

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

Für die createGuid() Implementierung see this question.

Beachten Sie, dass dies leicht in ein jQuery plug-in drehen könnten, so dass diese Funktion (Sie es sogar nennen könnten identify()) ist auf jeden $- Ausdruck zur Verfügung.

+0

Ja, es ist nicht * zu * schwierig, ein Konzept zu implementieren. Ein anderer Ansatz wäre es, eine Referenzzählung auf der Plugin-Funktion zu speichern und sie bei jedem Aufruf zu erhöhen. Ich habe auf etwas Offizieller gehofft, das jeden Grenzfall erfassen wird, an den ich nicht gedacht habe. –

+0

Verstanden und einverstanden, eine "native" Methode zu bekommen! Ich interessiere mich für eine bessere Antwort auch ... –

+0

(Der info/code wird geschätzt, und es lohnt sich eine Up-Vote, falls das nicht offensichtlich war) –

-1

Vielleicht versuchen

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

Diese werden nicht global-einzigartig sein, was Sie normalerweise wollen in einer ID. –

2

Basierend auf Paolos Lösung:

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'); 

Eine kleine Änderung, die verhindert, dass bereits verwendete IDs erneut gezählt werden.

+0

So hatte ich es ursprünglich, aber wenn es nur ein Element mit dem Namen 'test_2' gibt, springt es direkt zu 'test_3', ohne 'test_1' zu machen - ich bin mir nicht sicher, ob das gewünscht ist oder nicht. –

+0

Ja, das liegt an dem "i" -Argument in dem "each" -Aufruf. Ich habe es entfernt, um dieses Problem zu vermeiden. – gizmo

+0

Yup. Bin auch dazu gekommen. –

1

würde ich die gegebene Funktion leicht ändern und machen es:

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);    
    }); 
}; 

ID Sonderzeichen enthalten könnte, die, um zu entkommen würde erfordern, richtig mit jQuery CSS-Selektor-Engine zu arbeiten - wie „“. Anstatt sie zu finden und ihnen zu entkommen, ist es einfacher und schneller, sie durch die Dokumentenmethode zu ersetzen.

Verwandte Themen