Wie kann ich mit JavaScript eindeutige IDs erstellen?

Lesezeit: 7 Minuten

Benutzer-Avatar
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.

<form id="form" name="form" method="post" action="citySelect.php">
<select id="state" name="state" onchange="getCity()">
    <option></option>
    <option value="1">cali</option>
    <option value="2">arizona</option>
    <option value="3">texas</option>
</select>
<select id="city" name="city" style="width:100px">
    
</select>

    <br/>
</form>

Hier ist das JavaScript:

$("#bt").click(function() {

$("#form").append(
       "<select id='state' name="state" onchange="getCity()">
           <option></option>
           <option value="1">cali</option>
           <option value="2">arizona</option>
           <option value="3">texas</option>
        </select>
        <select id='city' name="city" style="width:100px"></select><br/>"
     );
});

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

    Benutzer234932

    14. Mai 2018 um 12:46 Uhr

const uid = function(){
    return Date.now().toString(36) + Math.random().toString(36).substr(2);
}

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


Benutzer-Avatar
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 …

z.B

<select name="city[]"><option ..../></select>
<select name="city[]"><option ..../></select>
<select name="city[]"><option ..../></select>

dann auf der Serverseite in PHP zum Beispiel:

$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

Benutzer-Avatar
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.`
}
<button id="butt01">Generate</button>
<br>
<span id="span01"></span>
<br>
<hr>
<br>
<button id="butt02">Check collision potentiality in 1000 cases</button>
<br>
<span id="span02"></span>

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

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


1019320cookie-checkWie kann ich mit JavaScript eindeutige IDs erstellen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy