tạo chuỗi ngẫu nhiên cho id div


87

Tôi muốn hiển thị video YouTube trên trang web của mình, nhưng tôi cần có thể thêm một idvideo duy nhất cho mỗi video mà người dùng sẽ chia sẻ. Vì vậy, tôi kết hợp điều này lại với nhau, và tôi đã gặp phải một vấn đề nhỏ. Tôi đang cố gắng lấy JavaScript để thêm một chuỗi ngẫu nhiên cho div id, nhưng nó không hoạt động, hiển thị chuỗi:

<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
Có lẽ điều này sẽ hữu ích stackoverflow.com/questions/105034/…
Maxx

Tôi thường chỉ cần tạo một var toàn cầu và tăng nó: P
Joseph Marikle

Có vẻ như OP có thể tạo một chuỗi ngẫu nhiên, nhưng anh ta không thể đưa nó vào id của div. Cho đến khi tôi nhận được xác nhận, tôi sẽ không đăng một giải pháp.
Jamiec

Vâng @Jamiec đó là vấn đề của tôi, tôi không thể có được nó vào divs ID
sarsar

@sarsar - jQuery hay javascript vani?
Jamiec

Câu trả lời:


153

Tôi thực sự thích chức năng này:

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

Từ Tạo GUID / UUID trong JavaScript?


4
... nhưng không thực sự là vấn đề anh ấy đang hỏi :-)
Soren

171
Nhưng chính xác những gì tôi đã tìm kiếm trên
Google

6
Cảnh báo: Nó có thể tạo Hướng dẫn bắt đầu bằng số. Không thể sử dụng trực tiếp đó làm id. Id phải bắt đầu bằng _ hoặc chữ cái. :)
Chaitanya Chandurkar

1
@jbyrd, điều này sẽ đảm bảo id duy nhất, nhưng không thể đảm bảo id HTMLElement chính xác . Id cho phần tử không được bắt đầu từ số. stackoverflow.com/questions/6860853/…
Ihor

1
Đối với bất kỳ ai tình cờ gặp ở đây: Đây không phải là cách thức hoạt động thực sự của các GUID, có thể có liên quan nếu được sử dụng cho mục đích khác. Chữ số thập lục phân thứ 13 và 17 là đặc biệt và cần được đặt thành 4 và một trong {8,9, A, B, C, D}, tương ứng. vi.wikipedia.org/wiki/Universally_unique_identifier#Format
The Vee

85

2018 chỉnh sửa: Tôi nghĩ câu trả lời này có một số thông tin thú vị, nhưng đối với bất kỳ ứng dụng thực tế nào, bạn nên sử dụng câu trả lời của Joe để thay thế .

Một cách đơn giản để tạo một ID duy nhất trong JavaScript là sử dụng đối tượng Ngày:

var uniqid = Date.now();

Điều đó cung cấp cho bạn tổng số mili giây đã trôi qua kể từ ngày 1 tháng 1 năm 1970, là một giá trị duy nhất mỗi khi bạn gọi như vậy .

Vấn đề với giá trị đó bây giờ là bạn không thể sử dụng nó làm ID của phần tử, vì trong HTML, ID cần bắt đầu bằng một ký tự chữ cái. Cũng có một vấn đề là hai người dùng thực hiện một hành động cùng một lúc có thể dẫn đến cùng một ID. Chúng tôi có thể làm giảm xác suất của điều đó và khắc phục sự cố ký tự chữ cái của chúng tôi, bằng cách thêm một chữ cái ngẫu nhiên vào trước phần số của ID.

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

Mặc dù vậy , điều này vẫn có cơ hội va chạm, dù mong manh . Đặt cược tốt nhất của bạn cho một id duy nhất là giữ một số lượng đang chạy, tăng nó lên mọi lúc và thực hiện tất cả những điều đó ở một nơi duy nhất, tức là trên máy chủ.


5
Bản thân các ngày không phải là rất ngẫu nhiên vì hai người dùng thực hiện cùng một thao tác cùng một lúc có thể nhận được cùng một giá trị ngày. Nếu bạn kết hợp một ngày với một hàm số ngẫu nhiên, bạn sẽ nhận được một cái gì đó độc đáo hơn nhiều.
jfriend00

Cộng với valueOfđại diện là một con số, mà không phải là một id html hợp lệ (họ phải bắt đầu bằng ký tự chữ)
Jamiec

3
@Chris câu trả lời của tôi không thực sự sai, nó không phải là câu trả lời tốt nhất từ ​​những câu trả lời ở đây. Tôi đã thêm một số thứ.
Alex Turpin

6
Va chạm: var arr = [Date.now(), Date.now()];. Dễ dàng tái tạo trên các CPU hiện đại.
mostruash

2
Đây là một giải pháp rất tồi cho vấn đề của bất kỳ kiểu tạo Id nào, đặc biệt là đối với câu hỏi thực tế đang được đặt ra (ám chỉ rằng câu hỏi không được đọc). Rất có thể bạn sẽ có cùng một id cho hai div (một mili giây là một khoảng thời gian rất dài). Câu trả lời từ @ jfriend00 tốt hơn nhiều (cụ thể là "Một cách khác để thực hiện"). Nếu bạn ra ngoài để nhận các id rất có khả năng không va chạm trên toàn cầu, thì một loạt các alphanums ngẫu nhiên sẽ tốt hơn nhiều - hoặc chỉ cần tìm GUID (UUID) như 'Joe' gợi ý.
stolsvik

74

Đây là chức năng có thể sử dụng lại để tạo ID ngẫu nhiên:

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

// Nó sẽ không bắt đầu bằng bất kỳ chữ số nào nên sẽ được CSS3 hỗ trợ


Điều này có thể dẫn đến một chuỗi trống, không phải là một ID hợp lệ. var lengths = {}, total = 1000000; for(var i = 0; i < total; i++){ var newLength = revisedRandId().length; lengths[newLength] = (lengths[newLength] || 0) + 1; } lengths[0] / total- có vẻ như nó sẽ cung cấp một ID không hợp lệ khoảng 0,03% thời gian, vì vậy không thường xuyên, nhưng chắc chắn là có thể.
1j01

Tại sao bạn lại bỏ đi 2 chữ số đầu tiên?
Fábio

Math.random().toString(36)-> "0.v6doivsvnkg". Việc loại bỏ hai ký tự đầu tiên là dư thừa vì chúng được xóa bằng lệnh thay thế: Math.random().toString(36).replace(/[^a-z]+/g, '')-> "vdoivsvnkg".
Ivan Kovtun

30

Tôi nghĩ rằng một số người ở đây đã không thực sự tập trung vào câu hỏi cụ thể của bạn. Có vẻ như vấn đề bạn gặp phải là đưa số ngẫu nhiên vào trang và kết nối người chơi với nó. Có một số cách để làm điều đó. Đơn giản nhất là với một thay đổi nhỏ đối với mã hiện tại của bạn như thế này thành document.write () kết quả vào trang. Thông thường, tôi sẽ không giới thiệu document.write (), nhưng vì mã của bạn đã có sẵn và những gì bạn đang cố gắng làm là đặt div vào nội tuyến, đây là cách đơn giản nhất để làm điều đó. Tại thời điểm bạn có số ngẫu nhiên, bạn chỉ cần sử dụng điều này để đặt nó và div vào trang:

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

và sau đó, bạn tham khảo điều đó trong mã thiết lập jwplayer như sau:

jwplayer(randomId).setup({

Và toàn bộ khối mã sẽ trông như thế này:

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

Một cách khác để làm điều đó

Tôi có thể thêm vào đây ở phần cuối rằng việc tạo một số thực sự ngẫu nhiên chỉ để tạo một ID div duy nhất là quá mức cần thiết. Bạn không cần một số ngẫu nhiên. Bạn chỉ cần một ID sẽ không tồn tại trong trang. Các khung công tác như YUI có một chức năng như vậy và tất cả những gì chúng làm là có một biến toàn cục được tăng lên mỗi khi hàm được gọi và sau đó kết hợp nó với một chuỗi cơ sở duy nhất. Nó có thể trông giống như sau:

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

Và, khi sử dụng thực tế, bạn sẽ làm như sau:

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

Của câu trả lời này tốt quá, nhưng tôi cho rằng bên trong đó là jwplayermã nên được divkhông 'div()'.
Jamiec

@ jfriend00 Jamiec nói đúng, tôi cần phải đối sánh id div với mã trình phát jw ở đâyjwplayer('div').setup({
sarsar

Vâng, tôi không biết mã jwplayer đang làm gì hoặc nó hoạt động như thế nào. Tôi không biết đó là một phần của câu hỏi. Dù sao, tôi đã tìm kiếm điều đó trên web và sửa đổi mã của mình để div với ID số ngẫu nhiên hiện cũng được chuyển cho thiết lập jwplayer. FYI, vì các ID CSS về mặt kỹ thuật không được phép bắt đầu bằng một chữ số, tôi cũng đặt một chữ cái ở đầu.
jfriend00

Tôi đã thêm một cách đơn giản hơn để thực hiện việc này ở cuối câu trả lời của mình. Một số ngẫu nhiên không thực sự cần thiết trong trường hợp này, chỉ là một số tăng đơn điệu kết hợp với một chuỗi cơ sở duy nhất.
jfriend00

Nếu bạn cần tính duy nhất trên các tệp, một ID ngẫu nhiên có thể được đảm bảo.
aleclarson

17

Tôi cũng cần một id ngẫu nhiên, tôi đã sử dụng mã hóa base64:

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

Chọn bao nhiêu ký tự bạn muốn, kết quả thường có ít nhất 24 ký tự.


13

Dựa trên HTML 4 , id phải bắt đầu từ ký tự:

Mã thông báo ID và NAME phải bắt đầu bằng một chữ cái ([A-Za-z]) và có thể được theo sau bởi bất kỳ số lượng chữ cái, chữ số ([0-9]), dấu gạch ngang ("-"), dấu gạch dưới ("_") , dấu hai chấm (":") và dấu chấm (".").

Vì vậy, một trong những giải pháp có thể là (chữ và số):

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

Một giải pháp khác - tạo chuỗi chỉ với các chữ cái:

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

7

tôi thích cái đơn giản này:

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

vì id phải (mặc dù không phải) bắt đầu bằng một chữ cái, tôi sẽ sử dụng nó như thế này:

let div_id = randstr('youtube_div_');

một số giá trị ví dụ:

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

Một phiên bản đã chỉnh sửa của phiên bản @ 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

Tôi khuyên bạn nên bắt đầu với một số loại trình giữ chỗ, bạn có thể đã có cái này rồi, nhưng nó ở đâu đó để nối div.

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

Bây giờ, ý tưởng là tạo động một div mới, với id ngẫu nhiên của bạn:

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

điều này có thể được bổ sung cho trình giữ chỗ của bạn như sau:

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

Sau đó, bạn có thể sử dụng nó trong mã jwplayer của mình:

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

Ví dụ trực tiếp: http://jsfiddle.net/pNYZp/

Ghi chú bên lề: Tôi khá chắc chắn rằng id phải bắt đầu bằng ký tự alpha (tức là không có số) - bạn có thể muốn thay đổi cách triển khai chuỗi ngẫu nhiên để thực thi quy tắc này. ( Ref )


tôi có phải lo lắng về jw player javascript phần này nói riêng khôngjwplayer('placeholder').setup({
sarsar

@sarsar - Tôi không theo dõi câu hỏi của bạn! Tôi chỉ thêm phần đó để cho bạn thấy bạn có thể sử dụng lại rndIdbiến trong mã của mình để thiết lập jwplayer.
Jamiec

đối với mã jwplayer đó, tôi cũng cần đặt cùng một id cho div bên trong mã này
sarsar

@sarsar - đó chính xác là những gì tôi đã trình bày ở trên. rndIdchứa mã được tạo ngẫu nhiên.
Jamiec

1

Hoặc bạn có thể sử dụng Cripto vì nó đã được tích hợp sẵn (ngoại trừ IE11, tôi thề rằng những kẻ này không thể cập nhật trong nhiều năm!)

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

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

Tôi cũng tìm thấy điều này:

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

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

Có rất nhiều cách để làm điều này, nhưng đối với hầu hết mọi người, không có lý do gì để phát minh lại bánh xe :)


0

Đầu tiên. Gán một id cho div của bạn. Như thế này:

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

Sau đó, thêm vào bên trong <script>thẻ của bạn mã sau:

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

6
randomString(8)không được xác định ở bất cứ đâu.
Ethan

3
@David randomString được xác định bởi người đặt câu hỏi. Xem câu hỏi gốc ở trên.
vsushkov

0

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

Sử dụng các ký tự ngoại trừ các chữ cái ASCII, chữ số, '_', '-' và '.' có thể gây ra sự cố tương thích, vì chúng không được phép trong HTML 4. Mặc dù hạn chế này đã được dỡ bỏ trong HTML5, nhưng ID phải bắt đầu bằng một chữ cái để tương thích.


điều này mang lại kết quả bắt đầu bằng một số, bao gồm +=ký tự ... tôi có thể gợi ý hương vị này không:'id'+window.crypto.getRandomValues(new Uint32Array(1))[0].toString(36)
oriadam
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.