генерировать случайную строку для идентификатора div

87

Я хочу отображать видео YouTube на своем веб-сайте, но мне нужно добавить уникальное idвидео для каждого видео, которым будут делиться пользователи. Я собрал это вместе и столкнулся с небольшой проблемой. Я пытаюсь заставить JavaScript добавить случайную строку для div id, но он не работает, показывая строку:

<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
Возможно, это было бы полезно stackoverflow.com/questions/105034/…
Maxx
Обычно я просто создаю глобальную
переменную
Похоже, OP может генерировать случайную строку, но он не может поместить ее в идентификатор div. Пока я не получу подтверждения, я не буду публиковать решение.
Jamiec
@Jamiec, да, это моя проблема, я не могу
поместить
@sarsar - jQuery или ванильный javascript?
Jamiec

Ответы:

153

Мне очень нравится эта функция:

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

От Создать GUID / UUID в JavaScript?

Джо
источник
4
... но на самом деле это не та проблема, о которой он спрашивает :-)
Сорен
171
Но именно то, что я искал в Google: =)
fnkr
6
Предупреждение: он может создать Guid, начинающийся с номера. Нельзя использовать это напрямую как идентификатор. Идентификатор должен начинаться с символа _ или буквы. :)
Чайтанья Чандуркар
1
@jbyrd, это гарантирует уникальный идентификатор, но не может гарантировать правильный идентификатор HTMLElement . Идентификатор элемента не может начинаться с числа. stackoverflow.com/questions/6860853/…
Игорь
1
Для тех, кто наткнулся на это: настоящие GUID работают не так, что может иметь значение, если они используются для других целей. 13-я и 17-я шестнадцатеричные цифры являются специальными и должны быть установлены на 4 и одно из {8,9, A, B, C, D} соответственно. en.wikipedia.org/wiki/Universally_unique_identifier#Format
Vee
85

Редактировать 2018: я думаю, что в этом ответе есть интересная информация, но для любых практических приложений вы должны вместо этого использовать ответ Джо .

Простой способ создать уникальный идентификатор в JavaScript - использовать объект Date:

var uniqid = Date.now();

Это дает вам общее количество миллисекунд, прошедших с 1 января 1970 года, что является уникальным значением каждый раз, когда вы это вызываете .

Проблема с этим значением сейчас заключается в том, что вы не можете использовать его в качестве идентификатора элемента, поскольку в HTML идентификаторы должны начинаться с алфавитного символа. Существует также проблема, что два пользователя, выполняющие действие в одно и то же время, могут иметь один и тот же идентификатор. Мы могли бы уменьшить вероятность этого и решить нашу проблему с алфавитными символами, добавив случайную букву перед числовой частью идентификатора.

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

Хотя у него все еще есть шанс, хотя и небольшой , на столкновение. Лучше всего для уникального идентификатора вести текущий счетчик, увеличивать его каждый раз и делать все это в одном месте, то есть на сервере.

Алекс Терпин
источник
5
Сами по себе даты не являются случайными, поскольку два пользователя, выполняющие одну и ту же операцию одновременно, могут получить одно и то же значение даты. Если вы объедините дату с функцией случайного числа, вы получите нечто гораздо более уникальное.
jfriend00
Плюс valueOfпредставление - это число, которое не является действительным идентификатором html (они должны начинаться с альфа-символа)
Jamiec
3
@Chris, мой ответ не был фактически неверным, просто он был не лучшим из ответов здесь. Я кое-что добавил.
Alex Turpin
6
Collide: var arr = [Date.now(), Date.now()];. Легко воспроизводится на современных процессорах.
Mostruash
2
Это очень плохое решение проблемы любого типа генерации идентификаторов, в частности, для самого задаваемого вопроса (намекающего на то, что вопрос не читается). Вполне вероятно, что у вас будет один и тот же идентификатор для двух div (одна миллисекунда - это очень много времени). Ответ от @ jfriend00 намного лучше (в частности, «Другой способ сделать это»). Если вы хотите получить идентификаторы, которые с большой вероятностью не глобально конфликтуют, тогда лучше использовать набор случайных буквенных символов - или просто используйте GUID (UUID), как предлагает Джо.
stolsvik
74

Вот функция многократного использования для генерации случайных идентификаторов:

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

// Он не будет начинаться с любой цифры числа, поэтому он будет поддерживаться CSS3

bvmCoder
источник
Это может привести к пустой строке, которая не будет действительным идентификатором. var lengths = {}, total = 1000000; for(var i = 0; i < total; i++){ var newLength = revisedRandId().length; lengths[newLength] = (lengths[newLength] || 0) + 1; } lengths[0] / total- похоже, что примерно в 0,03% случаев он будет выдавать неверный идентификатор, поэтому не часто, но определенно возможно.
1j01
Почему вы отбрасываете первые 2 цифры?
Fábio
Math.random().toString(36)-> "0.v6doivsvnkg". Отказ от первых двух символов является избыточным, поскольку они удаляются с помощью команды replace: Math.random().toString(36).replace(/[^a-z]+/g, '')-> "vdoivsvnkg".
Иван Ковтун
30

Я думаю, что некоторые люди здесь не особо сосредоточились на вашем конкретном вопросе. Похоже, проблема в том, что вы помещаете случайное число на страницу и подключаете к нему игрока. Есть несколько способов сделать это. Самый простой - внести небольшое изменение в существующий код, например, в document.write (), результат на странице. Обычно я бы не рекомендовал document.write (), но поскольку ваш код уже встроен, а то, что вы пытались сделать, уже заключалось в том, чтобы поместить div в строку, это самый простой способ сделать это. Когда у вас есть случайное число, вы просто используете его, чтобы поместить его и div на страницу:

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

а затем вы ссылаетесь на это в коде настройки jwplayer следующим образом:

jwplayer(randomId).setup({

И весь блок кода будет выглядеть так:

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

Другой способ сделать это

Я мог бы добавить здесь в конце, что создание действительно случайного числа только для создания уникального идентификатора div - это слишком много. Вам не нужно случайное число. Вам просто нужен идентификатор, который иначе не существовал бы на странице. Такие фреймворки, как YUI, имеют такую ​​функцию, и все, что они делают, это глобальная переменная, которая увеличивается каждый раз при вызове функции, а затем комбинирует ее с уникальной базовой строкой. Это может выглядеть примерно так:

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

А затем на практике вы сделаете что-то вроде этого:

var randomId = generateID("myMovieContainer");  // "myMovieContainer1"
document.write('<div id="' + randomId + '">This text will be replaced</div>');
jwplayer(randomId).setup({
jfriend00
источник
Этот ответ тоже хорош, но я предполагаю, что внутри этого jwplayerкода быть divне должно 'div()'.
Jamiec
@ jfriend00 Джеймик прав, мне нужно сопоставить идентификатор div с кодом проигрывателя jw здесьjwplayer('div').setup({
sarsar
Да, я понятия не имел, что делает код jwplayer и как он работает. Я не знал, что это было частью вопроса. Во всяком случае, я поискал это в Интернете и изменил свой код так, что теперь div со случайным идентификатором числа также передается в настройку jwplayer. К вашему сведению, поскольку идентификаторы CSS технически не могут начинаться с цифры, я также поставил букву в начале.
jfriend00
Я добавил несколько более простой способ сделать это в конце своего ответа. В этом случае случайное число на самом деле не нужно, просто монотомно увеличивающееся число в сочетании с уникальной базовой строкой.
jfriend00
Если вам нужна уникальность файлов, может потребоваться случайный идентификатор.
aleclarson
17

Мне также нужен был случайный идентификатор, я использовал кодировку base64:

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

Выберите любое количество символов, которое вы хотите, результат обычно составляет не менее 24 символов.

Staale
источник
13

На основе HTML 4 идентификатор должен начинаться с буквы:

Жетоны ID и NAME должны начинаться с буквы ([A-Za-z]) и могут сопровождаться любым количеством букв, цифр ([0-9]), дефисами ("-"), подчеркиванием ("_"). , двоеточия (":") и точки (".").

Итак, одно из решений может быть (буквенно-цифровым):

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

Другое решение - сгенерировать строку только с буквами:

  var length = 9;
  var id = Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, length);
Игорь
источник
7

мне нравится этот простой:

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

поскольку id должен (хотя и не должен) начинаться с буквы, я бы использовал его так:

let div_id = randstr('youtube_div_');

некоторые примерные значения:

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

Отредактированная версия версии @ 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

Я бы посоветовал вам начать с какого-то заполнителя, возможно, он у вас уже есть, но его где-то добавить div.

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

Теперь идея состоит в том, чтобы динамически создать новый div со случайным идентификатором:

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

это может быть добавлено к вашему заполнителю следующим образом:

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

Затем вы можете использовать это в своем коде jwplayer:

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

Живой пример: http://jsfiddle.net/pNYZp/

Примечание: я почти уверен, что идентификатор должен начинаться с альфа-символа (т.е. без чисел) - вы можете изменить свою реализацию randomstring, чтобы обеспечить соблюдение этого правила. ( ссылка )

Jamiec
источник
я должен беспокоиться о jw player javascript, в частности, в этой частиjwplayer('placeholder').setup({
sarsar
@sarsar - я не слежу за вашим вопросом! Я просто добавил эту часть, чтобы показать вам, что вы можете повторно использовать rndIdпеременную в своем коде для настройки jwplayer.
Jamiec
для этого кода jwplayer мне нужно поместить тот же идентификатор для div внутри этого кода
sarsar
@sarsar - это именно то, что я продемонстрировал выше. rndIdсодержит случайно сгенерированный код.
Jamiec
1

Или вы можете использовать Cripto, поскольку он уже встроен (за исключением IE11, клянусь, эти ребята не обновлялись годами!)

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

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

Я тоже нашел это:

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

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

Есть много способов сделать это, но для большинства людей нет смысла изобретать велосипед :)

Яако Торус
источник
0

Первый. Назначьте идентификатор вашему div. Как это:

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

После этого добавьте в свой <script>тег следующий код:

Document.getElementById("uniqueid").id = randomString(8);
всушков
источник
6
randomString(8)нигде не определяется.
Итан
3
@David randomString определяется человеком, задавшим вопрос. См. Исходный вопрос выше.
vsushkov
0

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

Использование символов, кроме букв ASCII, цифр, "_", "-" и "." могут вызвать проблемы совместимости, поскольку они не допускались в HTML 4. Хотя это ограничение было снято в HTML5, для совместимости идентификатор должен начинаться с буквы.

Денис Гиффелер
источник
это приносит результаты, которые начинаются с числа, включает +и =символы ... могу ли я предложить этот вкус:'id'+window.crypto.getRandomValues(new Uint32Array(1))[0].toString(36)
oriadam