Wie kann ich mit JavaScript eindeutige IDs erstellen?
Lesezeit: 7 Minuten
JamesTBennett
Ich habe ein Formular, in dem ein Benutzer mehrere Auswahlfelder für mehrere Städte hinzufügen kann. Das Problem ist, dass jedes neu generierte Auswahlfeld eine eindeutige ID haben muss. Kann dies getan werden, ist JavaScript?
Hier ist der Teil des Formulars zur Auswahl von Städten. Beachten Sie auch, dass ich etwas PHP verwende, um die Städte auszufüllen, wenn ein bestimmter Staat ausgewählt ist.
Verwenden Sie ein Framework/Toolkit wie Jquery oder nur Vanilla Js? Können Sie auch einen Teil Ihres Codes posten, zumindest die generierte HTML-Ausgabe?
– DiakonDesperado
12. Juli 2010 um 19:15 Uhr
Möglicherweise ist es besser, Optionsfelder für diese Art von Verhalten zu verwenden. Andernfalls können Sie sich in Javascript einen Namen wie “Städte” einfallen lassen und dann einen Iterator wie “var i = 0;” verwenden. Führen Sie für jedes Auswahlfeld .setAttribute(‘id’, ‘cities’ + i) aus. Hier hilft getElementsByTagName(‘?’). Sie müssen ein Beispiel-HTML bereitstellen, damit jemand wirklich helfen kann.
– Metallhai
12. Juli 2010 um 19:16 Uhr
Fragen Sie nach dem Generieren eines eindeutigen ID-Attributs für jede neue? Sie können in Javascript einen Verweis auf das spezifische neue DOM-Element statt nur auf seine ID beibehalten. Sie müssen also keine eindeutige ID generieren, je nachdem, was Sie versuchen zu tun.
– Pioto
12. Juli 2010 um 19:17 Uhr
Ich glaube, er sagt, dass sie eine oder mehrere Städte auflisten können, die jeweils aus einer Auswahl stammen
– Jonathan Finland
12. Juli 2010 um 19:19 Uhr
Die Antwort darauf können Sie hier sehen
– Sanjay Nishad
24. Mai 2016 um 22:06 Uhr
var id = "id" + Math.random().toString(16).slice(2)
Obwohl entfernt, ist die Wahrscheinlichkeit einer Kollision nicht null
– Fedeghe
9. September 2015 um 10:39 Uhr
eine andere Möglichkeit, den Millisekunden-Timer zu verwenden:
var uniq = 'id' + (new Date()).getTime();
scheinen keine gute Idee zu sein (+new Date + +new Date )/2 === +new Date;
– Fedeghe
17. Juli 2013 um 12:58 Uhr
Was passiert, wenn der Benutzer die ID in einem anderen Land erstellt?\
– Max Lynn
8. Januar 2016 um 9:46 Uhr
ES IST NICHT EINZIGARTIG, wenn Sie 2 IDs nacheinander erstellen. var first = (new Date()).getTime(); var second = (new Date()).getTime(); console.log(first == second);
– Adam Pietrasiak
6. April 2016 um 21:32 Uhr
In diesem Fall sollten Sie besser verwenden performance.now(): performance.now() === performance.now() === false
– Ulysse BN
17. August 2017 um 18:40 Uhr
@UlysseBN Gerade versucht performance.now() und es funktioniert auf meiner Maschine trotz der ultrahohen Auflösung nicht so, wie Sie es beschreiben.
Diese Funktion generiert sehr eindeutige IDs, die nach ihrem generierten Datum sortiert sind. Auch verwendbar für IDs in Datenbanken.
Beachten Sie, dass es unterschiedliche Längen haben kann
– schweizerisch
15. August 2021 um 1:38 Uhr
Schön, vielleicht eine kleine Änderung, um die Länge zu fixieren: Date.now().toString(36) + Math.floor(Math.pow(10, 12) + Math.random() * 9*Math.pow(10, 12)).toString(36)
– Kumar Aditya Mohta
7. Juni um 4:54
Jonathan Finland
könnten Sie nicht einfach einen laufenden Index führen?
var _selectIndex = 0;
...code...
var newSelectBox = document.createElement("select");
newSelectBox.setAttribute("id","select-"+_selectIndex++);
BEARBEITEN
Nach weiterer Überlegung ziehen Sie es vielleicht vor, Namen im Array-Stil für Ihre Auswahlen zu verwenden …
$cities = $_POST['city']; //array of option values from selects
BEARBEITEN 2 Als Antwort auf den OP-Kommentar
Das dynamische Erstellen von Optionen mit DOM-Methoden kann wie folgt erfolgen:
var newSelectBox = document.createElement("select");
newSelectBox.setAttribute("id","select-"+_selectIndex++);
var city = null,city_opt=null;
for (var i=0, len=cities.length; i< len; i++) {
city = cities[i];
var city_opt = document.createElement("option");
city_opt.setAttribute("value",city);
city_opt.appendChild(document.createTextNode(city));
newSelectBox.appendChild(city_opt);
}
document.getElementById("example_element").appendChild(newSelectBox);
davon ausgegangen, dass die cities Array existiert bereits
Alternativ könnten Sie die innerHTML-Methode verwenden…..
var newSelectBox = document.createElement("select");
newSelectBox.setAttribute("id","select-"+_selectIndex++);
document.getElementById("example_element").appendChild(newSelectBox);
var city = null,htmlStr="";
for (var i=0, len=cities.length; i< len; i++) {
city = cities[i];
htmlStr += "<option value="" + city + "">" + city + "</option>";
}
newSelectBox.innerHTML = htmlStr;
function uniqueid(){
// always start with a letter (for DOM friendlyness)
var idstr=String.fromCharCode(Math.floor((Math.random()*25)+65));
do {
// between numbers and characters (48 is 0 and 90 is Z (42-48 = 90)
var ascicode=Math.floor((Math.random()*42)+48);
if (ascicode<58 || ascicode>64){
// exclude all chars between : (58) and @ (64)
idstr+=String.fromCharCode(ascicode);
}
} while (idstr.length<32);
return (idstr);
}
Vielleicht möchten Sie Ihre Antwort zugunsten des OP erläutern
– Lukas
20. Oktober 2012 um 1:17 Uhr
Was ist die Möglichkeit, dass Sie mit diesem Beispiel dieselbe ID generieren würden? Scheint möglich, aber höchst unwahrscheinlich.
– Benutzer699242
23. Oktober 2012 um 20:03 Uhr
Wenn man bedenkt, dass das RNG in Javascript scheiße ist, ist es wahrscheinlicher als Sie denken.
– Nisch
20. Mai 2013 um 15:23 Uhr
Aus Spaß entschied ich mich zu sehen, wie wahrscheinlich es ist: var meh=fun();while(meh !== fun()){ console.log(‘.’); } in der Befehlszeile von Chrome … bis jetzt ist es eine Million ohne Duplikate, für die meisten Fälle können Sie das mehr als genug haben. Mit 32 Zeichen Länge zu erwarten, denke ich.
– Nisch
20. Mai 2013 um 15:32 Uhr
Diese Funktion hat die Möglichkeit, dieselbe ID zu generieren, aber +1 für Dom “Freundlichkeit”.
– Burak Tokak
26. August 2016 um 13:06 Uhr
Cliffniff
Keine externen Bibliotheken erforderlich. Einzigartigkeit bewiesen.
Sie könnten so etwas tun.
// Function to generate unique id
const uniqueId = (length=16) => {
return parseInt(Math.ceil(Math.random() * Date.now()).toPrecision(length).toString().replace(".", ""))
}
// ----------------------------
document.querySelector("#butt01").onclick = () => {
document.querySelector("#span01").innerHTML = uniqueId()
}
ids = []
count = 0
document.querySelector("#butt02").onclick = () => {
for (let i = 0; i< 1000; i++){
ids.push(uniqueId())
}
for (el of ids){
for (ell of ids){
if(el == ell && ids.indexOf(el) != ids.indexOf(ell)){
count += 1
}
}
}
document.querySelector("#span02").innerHTML = `Found ${count} duplicated random values.`
}
Multiplizieren Sie die Zeit in Millisekunden seit der Epoche mit einem zufälligen Wert auf eine feste Größe.
Führen Sie dies aus, um mögliche Kollisionen zu sehen.
Sie würden sehen, dass es keine Kollisionen gibt, egal ob es 1000, 10000 oder 1000000000 ist.
Es hätte eine sehr geringe Chance, wenn zwei Benutzer gleichzeitig IDs generieren und die gleiche Zufallszahl erhalten.
Um die Eindeutigkeit zu erhöhen, könnten Sie das Datum weiter multiplizieren Math.random()s.
Vielleicht möchten Sie Ihre Antwort zugunsten des OP erläutern
– Lukas
20. Oktober 2012 um 1:17 Uhr
Was ist die Möglichkeit, dass Sie mit diesem Beispiel dieselbe ID generieren würden? Scheint möglich, aber höchst unwahrscheinlich.
– Benutzer699242
23. Oktober 2012 um 20:03 Uhr
Wenn man bedenkt, dass das RNG in Javascript scheiße ist, ist es wahrscheinlicher als Sie denken.
– Nisch
20. Mai 2013 um 15:23 Uhr
Aus Spaß entschied ich mich zu sehen, wie wahrscheinlich es ist: var meh=fun();while(meh !== fun()){ console.log(‘.’); } in der Befehlszeile von Chrome … bis jetzt ist es eine Million ohne Duplikate, für die meisten Fälle können Sie das mehr als genug haben. Mit 32 Zeichen Länge zu erwarten, denke ich.
– Nisch
20. Mai 2013 um 15:32 Uhr
Diese Funktion hat die Möglichkeit, dieselbe ID zu generieren, aber +1 für Dom “Freundlichkeit”.
– Burak Tokak
26. August 2016 um 13:06 Uhr
Juniid Atari
Eine sehr kurze Funktion gibt Ihnen eine eindeutige ID:
var uid = (function(){var id=0;return function(){if(arguments[0]===0)id=0;return id++;}})();
Warnung (uid());
schlägt fehl, wenn Sie zufällig ein Element mit der nächsten ID in der Reihe bereits auf der Seite haben.
– Michael
3. März 2014 um 22:45 Uhr
10193200cookie-checkWie kann ich mit JavaScript eindeutige IDs erstellen?yes
Verwenden Sie ein Framework/Toolkit wie Jquery oder nur Vanilla Js? Können Sie auch einen Teil Ihres Codes posten, zumindest die generierte HTML-Ausgabe?
– DiakonDesperado
12. Juli 2010 um 19:15 Uhr
Möglicherweise ist es besser, Optionsfelder für diese Art von Verhalten zu verwenden. Andernfalls können Sie sich in Javascript einen Namen wie “Städte” einfallen lassen und dann einen Iterator wie “var i = 0;” verwenden. Führen Sie für jedes Auswahlfeld .setAttribute(‘id’, ‘cities’ + i) aus. Hier hilft getElementsByTagName(‘?’). Sie müssen ein Beispiel-HTML bereitstellen, damit jemand wirklich helfen kann.
– Metallhai
12. Juli 2010 um 19:16 Uhr
Fragen Sie nach dem Generieren eines eindeutigen ID-Attributs für jede neue? Sie können in Javascript einen Verweis auf das spezifische neue DOM-Element statt nur auf seine ID beibehalten. Sie müssen also keine eindeutige ID generieren, je nachdem, was Sie versuchen zu tun.
– Pioto
12. Juli 2010 um 19:17 Uhr
Ich glaube, er sagt, dass sie eine oder mehrere Städte auflisten können, die jeweils aus einer Auswahl stammen
– Jonathan Finland
12. Juli 2010 um 19:19 Uhr
Die Antwort darauf können Sie hier sehen
– Sanjay Nishad
24. Mai 2016 um 22:06 Uhr