menghasilkan string acak untuk id div

87

Saya ingin menampilkan video YouTube di situs web saya, tetapi saya harus dapat menambahkan keunikan iduntuk setiap video yang akan dibagikan oleh pengguna. Jadi saya gabungkan ini, dan saya mengalami sedikit masalah. Saya mencoba membuat JavaScript menambahkan string acak untuk div id, tetapi tidak berfungsi, menampilkan string:

<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
sumber
1
Mungkin ini akan membantu stackoverflow.com/questions/105034/…
Maxx
Saya biasanya hanya membuat var global dan menaikkannya: P
Joseph Marikle
Sepertinya OP bisa menghasilkan string acak, tapi dia tidak bisa memasukkannya ke dalam id div. Sampai saya mendapat konfirmasi, saya tidak akan memposting solusi.
Jamiec
@ Jamiec ya itu masalah saya, saya tidak bisa memasukkannya ke divs ID
sarsar
@sarsar - jQuery atau vanilla javascript?
Jamiec

Jawaban:

157

Saya sangat menyukai fungsi ini:

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

Dari Buat GUID / UUID di JavaScript?

Joe
sumber
4
... tapi sebenarnya bukan masalah yang dia tanyakan :-)
Soren
177
Tapi apa tepatnya yang saya cari di Google: =)
fnkr
6
Peringatan: Itu bisa membuat Panduan dimulai dengan angka. Tidak bisa menggunakannya secara langsung sebagai id. Id harus dimulai dengan _ atau huruf. :)
Chaitanya Chandurkar
1
@jbyrd, ini akan menjamin id unik, tapi tidak bisa menjamin id HTMLElement benar . Id untuk elemen tidak boleh dimulai dari angka. stackoverflow.com/questions/6860853/…
Ihor
1
Untuk siapa pun yang tersandung di sini: Ini bukanlah cara kerja GUID yang sebenarnya, yang mungkin relevan jika digunakan untuk tujuan lain. Digit hex ke-13 dan ke-17 adalah spesial dan perlu disetel ke 4 dan salah satu dari {8,9, A, B, C, D}, masing-masing. en.wikipedia.org/wiki/Universally_unique_identifier#Format
The Vee
85

Edit 2018: Saya pikir jawaban ini memiliki beberapa info menarik, tetapi untuk aplikasi praktis apa pun Anda harus menggunakan jawaban Joe .

Cara sederhana untuk membuat ID unik di JavaScript adalah dengan menggunakan objek Date:

var uniqid = Date.now();

Itu memberi Anda total milidetik yang telah berlalu sejak 1 Januari 1970, yang merupakan nilai unik setiap kali Anda memanggilnya .

Masalah dengan nilai itu sekarang adalah Anda tidak dapat menggunakannya sebagai ID elemen, karena dalam HTML, ID harus dimulai dengan karakter alfabet. Ada juga masalah bahwa dua pengguna yang melakukan tindakan pada waktu yang sama dapat menghasilkan ID yang sama. Kita bisa mengurangi kemungkinan itu, dan memperbaiki masalah karakter alfabet kita, dengan menambahkan huruf acak sebelum bagian numerik dari ID.

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

Ini masih memiliki peluang, betapapun kecilnya, untuk bertabrakan. Taruhan terbaik Anda untuk id unik adalah dengan terus menghitung, meningkatkannya setiap saat, dan melakukan semua itu di satu tempat, yaitu di server.

Alex Turpin
sumber
5
Tanggal itu sendiri tidak terlalu acak karena dua pengguna yang melakukan operasi yang sama pada waktu yang sama bisa mendapatkan nilai tanggal yang sama. Jika Anda menggabungkan tanggal dengan fungsi angka acak, Anda akan mendapatkan sesuatu yang jauh lebih unik.
jfriend00
Ditambah valueOfrepresentasi adalah angka, yang bukan merupakan id html yang valid (mereka harus dimulai dengan karakter alfa)
Jamiec
3
@Chris, jawaban saya tidak salah secara faktual, hanya saja bukan yang terbaik dari jawaban di sini. Saya menambahkan beberapa hal.
Alex Turpin
6
Collide: var arr = [Date.now(), Date.now()];. Mudah direproduksi pada CPU modern.
mostruash
2
Ini adalah solusi yang sangat buruk untuk masalah semua jenis pembuatan-Id, khususnya untuk pertanyaan aktual yang diajukan (mengisyaratkan bahwa pertanyaan tidak dibaca). Kemungkinan besar Anda akan mendapatkan id yang sama untuk dua div (satu milidetik adalah waktu yang sangat lama). Jawaban dari @ jfriend00 jauh lebih baik (khususnya "Cara lain untuk melakukannya"). Jika Anda ingin mendapatkan id yang sangat mungkin-tidak-bertabrakan secara global, maka sekelompok alfanum acak jauh lebih baik - atau cukup gunakan GUID (UUID) seperti yang disarankan 'Joe'.
stolsvik
75

Berikut adalah fungsi yang dapat digunakan kembali untuk menghasilkan ID acak:

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

// Ini tidak akan dimulai dengan digit angka apa pun sehingga akan didukung oleh CSS3

bvmCoder
sumber
Ini bisa menghasilkan string kosong, yang bukan merupakan ID yang valid. var lengths = {}, total = 1000000; for(var i = 0; i < total; i++){ var newLength = revisedRandId().length; lengths[newLength] = (lengths[newLength] || 0) + 1; } lengths[0] / total- sepertinya itu akan memberikan ID yang tidak valid sekitar 0,03% dari waktu, jadi tidak sering, tapi pasti mungkin.
1j01
Mengapa Anda membuang 2 digit pertama?
Fábio
Math.random().toString(36)-> "0.v6doivsvnkg". Membuang dua karakter pertama adalah mubazir karena mereka dihapus dengan perintah ganti: Math.random().toString(36).replace(/[^a-z]+/g, '')-> "vdoivsvnkg".
Ivan Kovtun
30

Saya pikir beberapa orang di sini belum benar-benar fokus pada pertanyaan khusus Anda. Sepertinya masalah yang Anda hadapi adalah menempatkan nomor acak di halaman dan menghubungkan pemain ke sana. Ada beberapa cara untuk melakukannya. Yang paling sederhana adalah dengan sedikit perubahan pada kode yang sudah ada seperti ini ke document.write () hasilnya ke halaman. Saya biasanya tidak merekomendasikan document.write (), tetapi karena kode Anda sudah sebaris dan apa yang sudah Anda coba lakukan adalah meletakkan div sebaris, ini adalah cara termudah untuk melakukannya. Pada titik di mana Anda memiliki nomor acak, Anda cukup menggunakan ini untuk meletakkannya dan div ke halaman:

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

dan kemudian, Anda mengacu pada kode pengaturan jwplayer seperti ini:

jwplayer(randomId).setup({

Dan seluruh blok kode akan terlihat seperti ini:

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

Cara lain untuk melakukannya

Saya dapat menambahkan di sini pada akhirnya bahwa menghasilkan nomor yang benar-benar acak hanya untuk membuat ID div yang unik adalah cara yang berlebihan. Anda tidak membutuhkan nomor acak. Anda hanya perlu ID yang tidak akan ada di halaman. Framework seperti YUI memiliki fungsi seperti itu dan yang mereka lakukan hanyalah memiliki variabel global yang bertambah setiap kali fungsi tersebut dipanggil dan kemudian menggabungkannya dengan string dasar yang unik. Ini bisa terlihat seperti ini:

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

Dan, kemudian dalam penggunaan praktis, Anda akan melakukan sesuatu seperti ini:

var randomId = generateID("myMovieContainer");  // "myMovieContainer1"
document.write('<div id="' + randomId + '">This text will be replaced</div>');
jwplayer(randomId).setup({
jfriend00
sumber
Jawaban ini juga baik-baik saja, tetapi saya berasumsi bahwa di dalam jwplayerkode itu seharusnya divtidak 'div()'.
Jamiec
@ jfriend00 Jamiec benar saya harus bisa mencocokkan id div dengan kode pemain jw di sinijwplayer('div').setup({
sarsar
Ya, saya tidak tahu apa yang dilakukan kode jwplayer atau bagaimana cara kerjanya. Saya tidak tahu itu bagian dari pertanyaan. Bagaimanapun, saya mencarinya di web dan memodifikasi kode saya sehingga div dengan ID nomor acak sekarang diteruskan ke pengaturan jwplayer juga. FYI, karena ID CSS secara teknis tidak diperbolehkan untuk dimulai dengan angka, saya juga meletakkan huruf di awal.
jfriend00
Saya menambahkan cara yang agak sederhana untuk melakukan ini di akhir jawaban saya. Dalam kasus ini, bilangan acak sebenarnya tidak diperlukan, hanya bilangan yang meningkat secara monotomis yang dikombinasikan dengan string dasar yang unik.
jfriend00
Jika Anda membutuhkan keunikan di seluruh file, ID acak mungkin diperlukan.
aleclarson
18

Saya juga membutuhkan id acak, saya menggunakan pengkodean base64:

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

Pilih berapa banyak karakter yang Anda inginkan, hasilnya biasanya setidaknya 24 karakter.

Staale
sumber
13

Berdasarkan HTML 4 , id harus dimulai dari huruf:

Token ID dan NAMA harus dimulai dengan huruf ([A-Za-z]) dan dapat diikuti dengan sejumlah huruf, angka ([0-9]), tanda hubung ("-"), setrip bawah ("_") , titik dua (":"), dan titik (".").

Jadi, salah satu solusinya bisa jadi (alfanumerik):

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

Solusi lain - buat string hanya dengan huruf:

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

Saya suka yang sederhana ini:

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

karena id harus (meskipun tidak harus) dimulai dengan huruf, saya akan menggunakannya seperti ini:

let div_id = randstr('youtube_div_');

beberapa nilai contoh:

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

Versi @ jfriend000 yang telah diedit:

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

Saya menyarankan agar Anda mulai dengan semacam placeholder, Anda mungkin sudah memiliki ini, tetapi di suatu tempat untuk menambahkan div.

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

Sekarang, idenya adalah membuat div baru secara dinamis, dengan id acak Anda:

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

ini dapat diterapkan ke placeholder Anda sebagai berikut:

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

Anda kemudian dapat menggunakannya di kode jwplayer Anda:

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

Contoh langsung: http://jsfiddle.net/pNYZp/

Catatan: Saya cukup yakin id harus dimulai dengan karakter alfa (yaitu, tidak ada angka) - Anda mungkin ingin mengubah implementasi string acak untuk menegakkan aturan ini. ( ref )

Jamiec
sumber
apakah saya harus khawatir tentang javascript jw player khususnya bagian inijwplayer('placeholder').setup({
sarsar
@sarsar - Saya tidak mengikuti pertanyaan Anda! Saya baru saja menambahkan bagian itu untuk menunjukkan kepada Anda bahwa Anda dapat menggunakan kembali rndIdvariabel dalam kode Anda untuk dilakukan dengan menyiapkan jwplayer.
Jamiec
untuk kode jwplayer itu saya perlu menempatkan id yang sama untuk div di dalam kode ini juga
sarsar
@sarsar - itulah yang saya tunjukkan di atas. rndIdberisi kode yang dibuat secara acak.
Jamiec
1

Atau Anda bisa menggunakan Cripto karena sudah ada di dalamnya (kecuali di IE11, saya bersumpah orang-orang ini belum diperbarui dalam beberapa tahun!)

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

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

Saya juga menemukan ini:

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

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

Ada banyak cara untuk melakukan ini, tetapi bagi kebanyakan orang, tidak ada alasan untuk menemukan kembali roda :)

Jaacko Torus
sumber
0

Pertama. Tetapkan id ke div Anda. Seperti ini:

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

Setelah itu, tambahkan <script>kode berikut di dalam tag Anda :

Document.getElementById("uniqueid").id = randomString(8);
vsushkov
sumber
6
randomString(8)tidak ditentukan di mana pun.
Ethan
3
@David randomString ditentukan oleh orang yang mengajukan pertanyaan. Lihat pertanyaan asli di atas.
vsushkov
0

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

Menggunakan karakter kecuali huruf ASCII, angka, '_', '-' dan '.' dapat menyebabkan masalah kompatibilitas, karena tidak diizinkan di HTML 4. Meskipun pembatasan ini telah dicabut di HTML5, ID harus dimulai dengan huruf untuk kompatibilitas.

Denis Giffeler
sumber
ini membawa hasil yang dimulai dengan angka, termasuk +dan =karakter ... bolehkah saya menyarankan rasa ini:'id'+window.crypto.getRandomValues(new Uint32Array(1))[0].toString(36)
oriadam