Generieren Sie eine zufällige Zeichenfolge für die Div-ID

87

Ich möchte YouTube-Videos auf meiner Website anzeigen, muss jedoch in der Lage sein, idfür jedes Video, das von Benutzern geteilt wird , ein eindeutiges Video hinzuzufügen . Also habe ich das zusammengestellt und bin auf ein kleines Problem gestoßen. Ich versuche, das JavaScript dazu zu bringen, eine zufällige Zeichenfolge für das div hinzuzufügen id, aber es funktioniert nicht und zeigt die Zeichenfolge:

<script type='text/javascript' src='jwplayer.js'></script>
<script type='text/javascript'>
function randomString(length) {
    var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'.split('');

    if (! length) {
        length = Math.floor(Math.random() * chars.length);
    }

    var str = '';
    for (var i = 0; i < length; i++) {
        str += chars[Math.floor(Math.random() * chars.length)];
    }
    return str;
}

var div = randomString(8);
</script>

<div id='div()'>This text will be replaced</div>

<script type='text/javascript'>
  jwplayer('div()').setup({
    'flashplayer': 'player.swf',
    'file': 'http://www.youtube.com/watch?v=4AX0bi9GXXY',
    'controlbar': 'bottom',
    'width': '470',
    'height': '320'
  });
</script>
Sarsar
quelle
1
Vielleicht wäre dies hilfreich stackoverflow.com/questions/105034/…
Maxx
Normalerweise
Es sieht so aus, als ob das OP eine zufällige Zeichenfolge generieren kann, aber er kann sie nicht in die ID des Divs aufnehmen. Bis ich eine Bestätigung bekomme, werde ich keine Lösung veröffentlichen.
Jamiec
@ Jamieie ja das ist mein problem ich kann es nicht in die divs ID bekommen
sarsar
@sarsar - jQuery oder Vanille-Javascript?
Jamiec

Antworten:

153

Diese Funktion gefällt mir sehr gut:

function guidGenerator() {
    var S4 = function() {
       return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
    };
    return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());
}

Von GUID / UUID in JavaScript erstellen?

Joe
quelle
4
... aber nicht wirklich das Problem, nach dem er fragt :-)
Soren
173
Aber genau das, wonach ich gegoogelt habe: =)
fnkr
6
Warnung: Es könnte Guid erstellen, das mit der Nummer beginnt. Kann das nicht direkt als ID verwenden. ID sollte mit _ oder Buchstabe beginnen. :)
Chaitanya Chandurkar
1
@jbyrd, dies garantiert eine eindeutige ID, kann jedoch keine korrekte HTMLElement-ID garantieren . Die ID für das Element kann nicht mit der Nummer beginnen. stackoverflow.com/questions/6860853/…
Ihor
1
Für alle, die hier stolpern: So funktionieren echte GUIDs nicht, was relevant sein kann, wenn sie für einen anderen Zweck verwendet werden. Die 13. und 17. Hexadezimalstelle sind speziell und müssen auf 4 bzw. eine von {8,9, A, B, C, D} gesetzt werden. en.wikipedia.org/wiki/Universally_unique_identifier#Format
The Vee
86

Bearbeiten 2018: Ich denke, diese Antwort enthält einige interessante Informationen, aber für alle praktischen Anwendungen sollten Sie stattdessen Joes Antwort verwenden .

Eine einfache Möglichkeit, eine eindeutige ID in JavaScript zu erstellen, besteht darin, das Date-Objekt zu verwenden:

var uniqid = Date.now();

Das gibt Ihnen die gesamten Millisekunden, die seit dem 1. Januar 1970 vergangen sind. Dies ist jedes Mal ein eindeutiger Wert, wenn Sie dies aufrufen .

Das Problem mit diesem Wert ist jetzt, dass Sie ihn nicht als ID eines Elements verwenden können, da IDs in HTML mit einem alphabetischen Zeichen beginnen müssen. Es gibt auch das Problem, dass zwei Benutzer, die genau zur gleichen Zeit eine Aktion ausführen, möglicherweise zur gleichen ID führen. Wir könnten die Wahrscheinlichkeit dafür verringern und unser Problem mit alphabetischen Zeichen beheben, indem wir einen zufälligen Buchstaben vor den numerischen Teil der ID anhängen.

var randLetter = String.fromCharCode(65 + Math.floor(Math.random() * 26));
var uniqid = randLetter + Date.now();

Dies hat jedoch immer noch die Chance, wie gering es auch sein mag, zusammenzustoßen. Die beste Wahl für eine eindeutige ID besteht darin, eine laufende Zählung beizubehalten, jedes Mal zu erhöhen und all dies an einem einzigen Ort, dh auf dem Server, auszuführen.

Alex Turpin
quelle
5
Daten an sich sind nicht sehr zufällig, da zwei Benutzer, die dieselbe Operation zur gleichen Zeit ausführen, denselben Datumswert erhalten können. Wenn Sie ein Datum mit einer Zufallszahlenfunktion kombinieren, erhalten Sie etwas viel Einzigartigeres.
jfriend00
Außerdem ist die valueOfDarstellung eine Zahl, die keine gültige HTML-ID ist (sie müssen mit einem Alpha-Zeichen beginnen)
Jamiec
3
@ Chris meine Antwort war nicht sachlich falsch, es war einfach nicht die beste Antwort hier. Ich habe einige Dinge hinzugefügt.
Alex Turpin
6
Kollidieren : var arr = [Date.now(), Date.now()];. Einfach auf modernen CPUs zu reproduzieren.
Mostruash
2
Dies ist eine sehr schlechte Lösung für das Problem jeglicher Art der ID-Generierung, insbesondere für die tatsächlich gestellte Frage (was darauf hindeutet, dass die Frage nicht gelesen wird). Es ist ziemlich wahrscheinlich, dass Sie für zwei Divs dieselbe ID erhalten (eine Millisekunde ist eine sehr lange Zeit). Die Antwort von @ jfriend00 ist viel besser (insbesondere die "andere Art, es zu tun"). Wenn Sie sehr wahrscheinlich nicht global kollidierende IDs erhalten möchten, sind eine Reihe zufälliger Alphanums viel besser - oder wählen Sie einfach GUIDs (UUIDs), wie 'Joe' vorschlägt.
Stolsvik
75

Hier ist die wiederverwendbare Funktion zum Generieren der zufälligen IDs:

function revisedRandId() {
     return Math.random().toString(36).replace(/[^a-z]+/g, '').substr(2, 10);
}

// Es beginnt nicht mit einer beliebigen Ziffer, daher wird es von CSS3 unterstützt

bvmCoder
quelle
Dies könnte zu einer leeren Zeichenfolge führen, die keine gültige ID wäre. var lengths = {}, total = 1000000; for(var i = 0; i < total; i++){ var newLength = revisedRandId().length; lengths[newLength] = (lengths[newLength] || 0) + 1; } lengths[0] / total- Es sieht so aus, als würde es in etwa 0,03% der Fälle eine ungültige ID geben, also nicht oft, aber definitiv möglich.
1j01
Warum verwerfen Sie die ersten 2 Ziffern?
Fábio
Math.random().toString(36)-> "0.v6doivsvnkg". Das Verwerfen der ersten beiden Zeichen ist redundant, da sie mit dem Befehl replace entfernt werden: Math.random().toString(36).replace(/[^a-z]+/g, '')-> "vdoivsvnkg".
Ivan Kovtun
30

Ich denke, einige Leute hier haben sich nicht wirklich auf Ihre spezielle Frage konzentriert. Es sieht so aus, als ob das Problem darin besteht, die Zufallszahl auf die Seite zu setzen und den Player daran anzuschließen. Dafür gibt es verschiedene Möglichkeiten. Am einfachsten ist es, wenn Sie Ihren vorhandenen Code wie folgt ändern, um das Ergebnis auf der Seite zu dokumentieren. Normalerweise würde ich document.write () nicht empfehlen, aber da Ihr Code bereits inline ist und Sie bereits versucht haben, das div inline zu setzen, ist dies der einfachste Weg, dies zu tun. An dem Punkt, an dem Sie die Zufallszahl haben, verwenden Sie diese einfach, um sie und das Div in die Seite einzufügen:

var randomId = "x" + randomString(8);
document.write('<div id="' + randomId + '">This text will be replaced</div>');

und dann verweisen Sie darauf im jwplayer-Setup-Code wie folgt:

jwplayer(randomId).setup({

Und der ganze Codeblock würde so aussehen:

<script type='text/javascript' src='jwplayer.js'></script>
<script type='text/javascript'>
function randomString(length) {
    var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghiklmnopqrstuvwxyz'.split('');

    if (! length) {
        length = Math.floor(Math.random() * chars.length);
    }

    var str = '';
    for (var i = 0; i < length; i++) {
        str += chars[Math.floor(Math.random() * chars.length)];
    }
    return str;
}

var randomId = "x" + randomString(8);
document.write('<div id="' + randomId + '">This text will be replaced</div>'); 

  jwplayer(randomId).setup({
    'flashplayer': 'player.swf',
    'file': 'http://www.youtube.com/watch?v=4AX0bi9GXXY',
    'controlbar': 'bottom',
    'width': '470',
    'height': '320'
  });
</script>

Ein anderer Weg, es zu tun

Ich könnte hier am Ende hinzufügen, dass das Generieren einer wirklich zufälligen Zahl, nur um eine eindeutige Div-ID zu erstellen, viel zu viel des Guten ist. Sie brauchen keine Zufallszahl. Sie benötigen lediglich eine ID, die sonst auf der Seite nicht vorhanden ist. Frameworks wie YUI haben eine solche Funktion und alles, was sie tun, ist eine globale Variable, die bei jedem Aufruf der Funktion inkrementiert wird und diese dann mit einer eindeutigen Basiszeichenfolge kombiniert. Es kann ungefähr so ​​aussehen:

var generateID = (function() {
    var globalIdCounter = 0;
    return function(baseStr) {
        return(baseStr + globalIdCounter++);
    }
})();

Und dann würden Sie im praktischen Gebrauch so etwas tun:

var randomId = generateID("myMovieContainer");  // "myMovieContainer1"
document.write('<div id="' + randomId + '">This text will be replaced</div>');
jwplayer(randomId).setup({
jfriend00
quelle
Diese Antwort ist auch in Ordnung, aber ich nehme an, dass im Innern , dass jwplayerCode sollte sein divnicht 'div()'.
Jamiec
@ jfriend00 Jamiec ist richtig, ich muss in der Lage sein, die Div-ID mit dem JW-Spieler-Code hier jwplayer('div').setup({
abzugleichen
Ja, ich hatte keine Ahnung, was der JWplayer-Code tat oder wie er funktionierte. Ich wusste nicht, dass das Teil der Frage war. Wie auch immer, ich habe das im Web nachgeschlagen und meinen Code so geändert, dass das div mit der Zufallszahlen-ID jetzt auch an das jwplayer-Setup übergeben wird. Zu Ihrer Information, da CSS-IDs technisch nicht mit einer Ziffer beginnen dürfen, habe ich auch einen Buchstaben am Anfang gesetzt.
jfriend00
Ich habe am Ende meiner Antwort einen etwas einfacheren Weg hinzugefügt, dies zu tun. Eine Zufallszahl wird in diesem Fall eigentlich nicht benötigt, sondern nur eine monotomisch zunehmende Zahl in Kombination mit einer eindeutigen Basiszeichenfolge.
jfriend00
Wenn Sie eine Eindeutigkeit zwischen Dateien benötigen, ist möglicherweise eine zufällige ID erforderlich.
Aleclarson
17

Ich brauchte auch eine zufällige ID, ich habe Base64-Codierung verwendet:

btoa(Math.random()).substring(0,12)

Wählen Sie so viele Zeichen aus, wie Sie möchten. Das Ergebnis sind normalerweise mindestens 24 Zeichen.

Staale
quelle
13

Basierend auf HTML 4 sollte die ID mit dem Buchstaben beginnen:

ID- und NAME-Token müssen mit einem Buchstaben ([A-Za-z]) beginnen und können von einer beliebigen Anzahl von Buchstaben, Ziffern ([0-9]), Bindestrichen ("-") und Unterstrichen ("_") gefolgt werden. , Doppelpunkte (":") und Punkte (".").

Eine der Lösungen könnte also sein (alphanumerisch):

  var length = 9;
  var prefix = 'my-awesome-prefix-'; // To be 100% sure id starts with letter

  // Convert it to base 36 (numbers + letters), and grab the first 9 characters
  // after the decimal.
  var id = prefix + Math.random().toString(36).substr(2, length);

Eine andere Lösung - Zeichenfolge nur mit Buchstaben generieren:

  var length = 9;
  var id = Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, length);
Ihor
quelle
8

Ich mag dieses einfache:

function randstr(prefix)
{
    return Math.random().toString(36).replace('0.',prefix || '');
}

Da id mit einem Buchstaben beginnen sollte (aber nicht muss), würde ich ihn folgendermaßen verwenden:

let div_id = randstr('youtube_div_');

Einige Beispielwerte:

youtube_div_4vvbgs01076
youtube_div_1rofi36hslx
youtube_div_i62wtpptnpo
youtube_div_rl4fc05xahs
youtube_div_jb9bu85go7
youtube_div_etmk8u7a3r9
youtube_div_7jrzty7x4ft
youtube_div_f41t3hxrxy
youtube_div_8822fmp5sc8
youtube_div_bv3a3flv425
Oriadam
quelle
4

Eine bearbeitete Version der @ jfriend000-Version:

    /**
     * Generates a random string
     * 
     * @param int length_
     * @return string
     */
    function randomString(length_) {

        var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghiklmnopqrstuvwxyz'.split('');
        if (typeof length_ !== "number") {
            length_ = Math.floor(Math.random() * chars.length_);
        }
        var str = '';
        for (var i = 0; i < length_; i++) {
            str += chars[Math.floor(Math.random() * chars.length)];
        }
        return str;
    }
Kumpel
quelle
2

Ich würde vorschlagen, dass Sie mit einer Art Platzhalter beginnen, den Sie vielleicht schon haben, aber es ist irgendwo, um die Div anzuhängen.

<div id="placeholder"></div>

Die Idee ist nun, dynamisch ein neues Div mit Ihrer zufälligen ID zu erstellen:

var rndId = randomString(8); 
var div = document.createElement('div');
div.id = rndId
div.innerHTML = "Whatever you want the content of your div to be";

Dies kann wie folgt an Ihren Platzhalter angehängt werden:

document.getElementById('placeholder').appendChild(div);

Sie können das dann in Ihrem JWplayer-Code verwenden:

jwplayer(rndId).setup(...);

Live-Beispiel: http://jsfiddle.net/pNYZp/

Nebenbemerkung: Ich bin mir ziemlich sicher, dass IDs mit einem Alpha-Zeichen beginnen müssen (dh ohne Zahlen). Möglicherweise möchten Sie Ihre Implementierung von Randomstring ändern, um diese Regel durchzusetzen. ( ref )

Jamiec
quelle
jwplayer('placeholder').setup({
Muss
@sarsar - Ich folge deiner Frage nicht! Ich habe diesen Teil hinzugefügt, um Ihnen zu zeigen, dass Sie die rndIdVariable in Ihrem Code für die Einrichtung von jwplayer wiederverwenden können.
Jamiec
für diesen jwplayer code muss ich die gleiche id für das div auch in diesen code
einfügen
@sarsar - genau das habe ich oben demonstriert. rndIdenthält den zufällig generierten Code.
Jamiec
1

Oder Sie könnten Cripto verwenden, da es bereits eingebaut ist (außer in IE11, ich schwöre, diese Jungs wurden seit Jahren nicht mehr aktualisiert!)

https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues#Examples

var id = new Uint32Array(10);
window.crypto.getRandomValues(array);

Ich habe auch folgendes gefunden:

https://gist.github.com/6174/6062387#gistcomment-3255605

let length = 32;
let id = crypto.randomBytes(length).toString("base64");

Es gibt viele Möglichkeiten, dies zu tun, aber für die meisten Menschen gibt es keinen Grund, das Rad neu zu erfinden :)

Jaacko Torus
quelle
0

Zuerst. Weisen Sie Ihrem Div eine ID zu. So was:

<div id="uniqueid">This text will be replaced</div>

Fügen Sie danach den <script>folgenden Code in Ihr Tag ein:

Document.getElementById("uniqueid").id = randomString(8);
vsushkov
quelle
6
randomString(8)ist nirgendwo definiert.
Ethan
3
@ David randomString wird von der Person definiert, die die Frage gestellt hat. Siehe die ursprüngliche Frage oben.
vsushkov
0

window.btoa(String.fromCharCode(...window.crypto.getRandomValues(new Uint8Array(5))))

Verwenden von Zeichen außer ASCII-Buchstaben, Ziffern, '_', '-' und '.' kann es zu Kompatibilitätsproblemen führen, da sie nicht in HTML 4. durften Obwohl diese Einschränkung in HTML5 aufgehoben wurde, eine ID sollte mit einem Buchstaben für die Kompatibilität starten.

Denis Giffeler
quelle
Dies bringt Ergebnisse, die mit einer Zahl beginnen, einschließlich +und =Zeichen ... Darf ich diesen Geschmack vorschlagen:'id'+window.crypto.getRandomValues(new Uint32Array(1))[0].toString(36)
Oriadam