generuje losowy ciąg dla div id


87

Chcę wyświetlać filmy z YouTube w mojej witrynie, ale muszę mieć możliwość dodania unikatowego iddla każdego filmu, który ma być udostępniany przez użytkowników. Więc złożyłem to razem i napotkałem mały problem. Próbuję zmusić JavaScript do dodania losowego ciągu dla div id, ale to nie działa, pokazując ciąg:

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

1
Być może byłoby to pomocne stackoverflow.com/questions/105034/…
— Maxx

Zwykle po prostu tworzę globalną
— zmienną

Wygląda na to, że OP może wygenerować losowy ciąg, ale nie może go umieścić w identyfikatorze div. Dopóki nie otrzymam potwierdzenia, nie opublikuję rozwiązania.
— Jamiec

@Jamiec tak, że mój problem nie mogę dostać go w DIV ID
— sarsar

@sarsar - jQuery czy waniliowy javascript?
— Jamiec

Odpowiedzi:


153

Bardzo podoba mi się ta funkcja:

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

Z tworzenia GUID / UUID w JavaScript?


4
... ale nie do końca problem, o który pyta :-)
— Soren

171
Ale dokładnie to, czego szukałem w Google: =)
— fnkr

6
Ostrzeżenie: może utworzyć Guid zaczynający się od numeru. Nie można tego użyć bezpośrednio jako identyfikatora. Identyfikator powinien zaczynać się od _ lub litery. :)
— Chaitanya Chandurkar

1
@jbyrd, to zagwarantuje unikalny identyfikator, ale nie może zagwarantować prawidłowego identyfikatora HTMLElement . Identyfikator elementu nie może zaczynać się od numeru. stackoverflow.com/questions/6860853/…
— Ihor

1
Dla każdego, kto się tutaj natknie: nie tak działają prawdziwe identyfikatory GUID, które mogą mieć znaczenie, jeśli zostaną użyte do innego celu. Trzynasta i siedemnasta cyfra szesnastkowa są specjalne i należy je ustawić odpowiednio na 4 i jedną z {8,9, A, B, C, D}. en.wikipedia.org/wiki/Universally_unique_identifier#Format
— The Vee

85

Edycja 2018: Myślę, że ta odpowiedź zawiera kilka interesujących informacji, ale w przypadku wszelkich praktycznych zastosowań powinieneś zamiast tego użyć odpowiedzi Joe .

Prostym sposobem na utworzenie unikalnego identyfikatora w JavaScript jest użycie obiektu Date:

var uniqid = Date.now();

To daje całkowitą liczbę milisekund, które upłynęły od 1 stycznia 1970 r., Co jest unikalną wartością za każdym razem, gdy to wywołasz .

Problem z tą wartością polega teraz na tym, że nie można jej używać jako identyfikatora elementu, ponieważ w HTML identyfikatory muszą zaczynać się od litery alfabetu. Istnieje również problem polegający na tym, że dwóch użytkowników wykonujących akcję dokładnie w tym samym czasie może skutkować tym samym identyfikatorem. Moglibyśmy zmniejszyć prawdopodobieństwo tego i rozwiązać nasz problem ze znakami alfabetycznymi, dodając losową literę przed częścią numeryczną identyfikatora.

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

Wciąż ma to jednak szansę, choćby niewielką, na zderzenie. Najlepszym rozwiązaniem dla unikalnego identyfikatora jest ciągłe liczenie, zwiększanie go za każdym razem i robienie tego wszystkiego w jednym miejscu, tj. Na serwerze.


5
Same daty nie są zbyt przypadkowe, ponieważ dwóch użytkowników wykonujących tę samą operację w tym samym czasie może uzyskać tę samą wartość daty. Jeśli połączysz datę z funkcją liczb losowych, otrzymasz coś znacznie bardziej unikalnego.
— jfriend00

Dodatkowo valueOfreprezentacją jest liczba, która nie jest prawidłowym identyfikatorem html (muszą zaczynać się od znaku alfa)
— Jamiec

3
@Chris moja odpowiedź nie była nieprawidłowa, po prostu nie była najlepsza z odpowiedzi tutaj. Dodałem kilka rzeczy.
— Alex Turpin

6
Collide: var arr = [Date.now(), Date.now()];. Łatwe do odtworzenia na nowoczesnych procesorach.
— mostruash

2
Jest to bardzo złe rozwiązanie problemu wszelkiego rodzaju generowania Id, w szczególności w przypadku zadawanego pytania (wskazując, że pytanie nie jest czytane). Jest całkiem prawdopodobne, że skończysz z tym samym identyfikatorem dla dwóch elementów div (jedna milisekunda to bardzo długi czas). Odpowiedź z @ jfriend00 jest znacznie lepsza (w szczególności „Inny sposób na zrobienie tego”). Jeśli chcesz uzyskać identyfikatory, które prawdopodobnie nie kolidują globalnie, dużo lepszych jest kilka losowych znaków alfanumerycznych - lub po prostu wybierz identyfikatory GUID (UUID), jak sugeruje „Joe”.
— stolsvik

74

Oto funkcja wielokrotnego użytku do generowania losowych identyfikatorów:

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

// Nie będzie zaczynał się od żadnej cyfry, więc będzie obsługiwany przez CSS3


Może to spowodować powstanie pustego ciągu, który nie byłby prawidłowym identyfikatorem. var lengths = {}, total = 1000000; for(var i = 0; i < total; i++){ var newLength = revisedRandId().length; lengths[newLength] = (lengths[newLength] || 0) + 1; } lengths[0] / total- wygląda na to, że w 0,03% przypadków dałoby to nieprawidłowy identyfikator, więc nie często, ale zdecydowanie możliwe.
— 1j01

Dlaczego odrzucasz pierwsze 2 cyfry?
— Fábio

Math.random().toString(36)-> "0.v6doivsvnkg". Odrzucenie pierwszych dwóch znaków jest zbędne, ponieważ usuwa się je za pomocą polecenia zamiany: Math.random().toString(36).replace(/[^a-z]+/g, '')-> "vdoivsvnkg".
— Ivan Kovtun

30

Myślę, że niektórzy ludzie tutaj nie skupili się tak naprawdę na twoim konkretnym pytaniu. Wygląda na to, że masz problem z umieszczeniem losowej liczby na stronie i podłączeniem do niej gracza. Można to zrobić na kilka sposobów. Najprościej jest wprowadzić niewielką zmianę w istniejącym kodzie, taką jak document.write () wynik na stronie. Normalnie nie polecałbym document.write (), ale ponieważ twój kod jest już wbudowany, a to, co już próbowałeś zrobić, to wstawienie div w linii, jest to najprostszy sposób. W miejscu, w którym masz liczbę losową, po prostu użyj tego, aby umieścić ją i element div na stronie:

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

a potem odnosisz się do tego w kodzie konfiguracyjnym jwplayera w ten sposób:

jwplayer(randomId).setup({

A cały blok kodu wyglądałby tak:

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

Inny sposób na zrobienie tego

Na koniec mógłbym dodać, że wygenerowanie prawdziwie losowej liczby tylko w celu utworzenia unikalnego identyfikatora DIV jest przesadą. Nie potrzebujesz liczby losowej. Potrzebujesz tylko identyfikatora, który w innym przypadku nie istniałby na stronie. Struktury takie jak YUI mają taką funkcję i wszystko, co robią, to zmienna globalna, która jest zwiększana za każdym razem, gdy funkcja jest wywoływana, a następnie łączy ją z unikalnym ciągiem bazowym. Może wyglądać mniej więcej tak:

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

A potem w praktyce zrobiłbyś coś takiego:

var randomId = generateID("myMovieContainer");  // "myMovieContainer1"
document.write('<div id="' + randomId + '">This text will be replaced</div>');
jwplayer(randomId).setup({

Dobrze ta odpowiedź jest zbyt, ale zakładam, że w środku, że jwplayerkod powinien być divnie 'div()'.
— Jamiec

@ jfriend00 Jamiec ma rację, muszę być w stanie dopasować identyfikator div do kodu gracza jw tutajjwplayer('div').setup({
— sarsar

Tak, nie miałem pojęcia, co robi kod jwplayera ani jak działa. Nie wiedziałem, że to część pytania. W każdym razie wyszukałem to w sieci i zmodyfikowałem mój kod, aby div z losowym identyfikatorem liczb był teraz również przesyłany do konfiguracji jwplayer. FYI, ponieważ identyfikatory CSS technicznie nie mogą zaczynać się od cyfry, umieszczam również literę na początku.
— jfriend00

Na końcu mojej odpowiedzi dodałem nieco prostszy sposób, aby to zrobić. W tym przypadku liczba losowa nie jest w rzeczywistości potrzebna, po prostu liczba rosnąca monotomicznie w połączeniu z unikalnym ciągiem podstawowym.
— jfriend00

Jeśli potrzebujesz unikalności między plikami, może być uzasadniony losowy identyfikator.
— aleclarson

17

Potrzebowałem również losowego identyfikatora, wybrałem kodowanie base64:

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

Wybierz dowolną liczbę znaków, a wynik zwykle ma co najmniej 24 znaki.


13

Bazując na HTML 4 , identyfikator powinien zaczynać się od litery:

Tokeny ID i NAZWA muszą zaczynać się od litery ([A-Za-z]) i mogą po nich następować dowolne litery, cyfry ([0-9]), łączniki („-”), podkreślenia („_”) , dwukropki („:”) i kropki („.”).

Tak więc jednym z rozwiązań mogłoby być (alfanumeryczne):

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

Inne rozwiązanie - wygeneruj ciąg zawierający same litery:

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

7

podoba mi się ten prosty:

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

ponieważ identyfikator powinien (choć nie musi) zaczynać się od litery, użyłbym go w ten sposób:

let div_id = randstr('youtube_div_');

kilka przykładowych wartości:

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

4

Edytowana wersja wersji @ jfriend000:

    /**
     * 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;
    }

2

Sugerowałbym, abyś zaczął od jakiegoś symbolu zastępczego, być może już go masz, ale jest to miejsce, w którym można dołączyć element div.

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

Teraz chodzi o to, aby dynamicznie utworzyć nowy element div z losowym identyfikatorem:

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

można to dołączyć do symbolu zastępczego w następujący sposób:

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

Możesz następnie użyć tego w swoim kodzie jwplayera:

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

Przykład na żywo: http://jsfiddle.net/pNYZp/

Uwaga: Jestem prawie pewien, że identyfikatory muszą zaczynać się od znaku alfa (tj. Bez liczb) - możesz chcieć zmienić implementację losowego ciągu, aby wymusić tę regułę. ( Ref )


czy muszę się martwić o odtwarzacz jw javascript w szczególności w tej częścijwplayer('placeholder').setup({
— sarsar

@sarsar - nie śledzę twojego pytania! Właśnie dodałem tę część, aby pokazać, że możesz ponownie użyć rndIdzmiennej w swoim kodzie do skonfigurowania jwplayer.
— Jamiec

dla tego kodu jwplayera muszę umieścić ten sam identyfikator dla div w tym kodzie
— sarsar

@sarsar - dokładnie to pokazałem powyżej. rndIdzawiera losowo wygenerowany kod.
— Jamiec

1

Lub możesz użyć Cripto, ponieważ jest już wbudowane (z wyjątkiem IE11, przysięgam, że ci faceci nie aktualizowali się od lat!)

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

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

Znalazłem też to:

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

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

Można to zrobić na wiele sposobów, ale dla większości ludzi nie ma powodu, aby odkrywać koło na nowo :)


0

Pierwszy. Przypisz identyfikator do swojego div. Lubię to:

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

Następnie dodaj do <script>tagu następujący kod:

Document.getElementById("uniqueid").id = randomString(8);

6
randomString(8)nie jest nigdzie zdefiniowany.
— Ethan

3
@David randomString jest definiowany przez osobę, która zadała pytanie. Zobacz oryginalne pytanie powyżej.
— vsushkov

0

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

Używa znaków oprócz liter ASCII, cyfr, „_”, „-” i „.” mogą powodować problemy ze zgodnością, ponieważ nie były dozwolone w HTML 4. Chociaż to ograniczenie zostało zniesione w HTML5, identyfikator powinien zaczynać się od litery w celu zapewnienia zgodności.


to daje wyniki, które zaczynają się od liczby, zawiera +i =znaków ... mogę zasugerować ten smak:'id'+window.crypto.getRandomValues(new Uint32Array(1))[0].toString(36)
— oriadam
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.