dividのランダムな文字列を生成します


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のIDにそれを取得することはできません。確認が得られるまで、解決策を投稿しません。
Jamiec 2011

@Jamiecはい、それが私の問題です。divIDに入れることができません
sarsar 2011

@ sarsar-jQueryまたはvanillajavascript?
Jamiec 2011

回答:


157

私はこの関数が本当に好きです:

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

JavaScriptでGUID / UUIDを作成するから


4
...しかし、実際には彼が尋ねている問題ではありません:-)
Soren

177
しかし、まさに私が
グーグルで検索

6
警告:番号で始まるGUIDが作成される可能性があります。それをIDとして直接使用することはできません。IDは_または文字で始まる必要があります。:)
Chaitanya Chandurkar 2015年

1
@jbyrd、これは一意のIDを保証しますが、正しいHTMLElementIDを保証することはできません。要素のIDを数字から始めることはできません。stackoverflow.com/questions/6860853/...
Ihor

1
ここでつまずいた人のために:これは実際のGUIDがどのように機能するかではなく、別の目的で使用される場合に関連する可能性があります。13番目と17番目の16進数は特殊であり、それぞれ4と{8,9、A、B、C、D}のいずれかに設定する必要があります。en.wikipedia.org/wiki/Universally_unique_identifier#Format
The Vee

85

2018年の編集:この回答には興味深い情報があると思いますが、実際のアプリケーションでは、代わりにJoeの回答を使用する必要があります。

JavaScriptで一意のIDを作成する簡単な方法は、Dateオブジェクトを使用することです。

var uniqid = Date.now();

これにより、1970年1月1日から経過した合計ミリ秒が得られます。これは、を呼び出すたびに一意の値です

この値の問題は、HTMLではIDがアルファベット文字で始まる必要があるため、要素のIDとして使用できないことです。また、2人のユーザーがまったく同時にアクションを実行すると、同じIDになる可能性があるという問題もあります。IDの数値部分の前にランダムな文字を追加することで、その可能性を減らし、アルファベット文字の問題を修正することができます。

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

これは、スリムではありますが、衝突する可能性があります。一意のIDの最善の策は、実行カウントを維持し、毎回インクリメントして、すべてを1か所(サーバー上)で実行することです。


5
同じ操作を同時に実行する2人のユーザーが同じ日付値を取得できるため、日付自体はそれほどランダムではありません。日付と乱数関数を組み合わせると、はるかにユニークなものが得られます。
jfriend00 2011

さらに、valueOf表現は数値であり、有効なhtml IDではありません(英字で始める必要があります)
Jamiec 2011

3
@Chris私の答えは事実上間違っていませんでした、それはここでの答えから最高ではありませんでした。いくつか追加しました。
Alex Turpin 2013年

6
衝突:var arr = [Date.now(), Date.now()];。最新のCPUで簡単に再現できます。
mostruash 2016年

2
これは、特に実際に提起されている質問(質問が読まれていないことを示唆している)にとって、あらゆるタイプのId生成の問題に対する非常に悪い解決策です。2つのdivで同じIDになる可能性が非常に高くなります(1ミリ秒は非常に長い時間です)。@ jfriend00からの回答ははるかに優れています(特に「それを行う別の方法」)。グローバルに衝突する可能性が非常に低いIDを取得する場合は、ランダムな英数字の束の方がはるかに優れています。または、「Joe」が提案するようなGUID(UUID)を使用することもできます。
stolsvik 2017年

75

ランダムIDを生成するための再利用可能な関数は次のとおりです。

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

//任意の数字で始まらないため、CSS3でサポートされます


これにより、空の文字列が生成される可能性があり、これは有効なIDではありません。var lengths = {}, total = 1000000; for(var i = 0; i < total; i++){ var newLength = revisedRandId().length; lengths[newLength] = (lengths[newLength] || 0) + 1; } lengths[0] / total-無効なIDが約0.03%の確率で発生するようです。それほど頻繁ではありませんが、確実に可能です。
1j01 2018年

なぜ最初の2桁を破棄するのですか?
ファビオ2018年

Math.random().toString(36)-> "0.v6doivsvnkg"。最初の2文字は、replaceコマンドで削除されるため、冗長です:Math.random().toString(36).replace(/[^a-z]+/g, '')-> "vdoivsvnkg"
IvanKovtun20年

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>

それを行う別の方法

最後に、一意のdivIDを作成するためだけに真の乱数を生成するのはやり過ぎだと付け加えるかもしれません。乱数は必要ありません。必要なのは、他の方法ではページに存在しないIDだけです。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({

この答えも問題ありませんが、そのjwplayerコード内ではそうでdivはないと思います'div()'
Jamiec 2011

@ jfriend00 Jamiecは正しいです。ここで、div idをjwプレーヤーコードと一致させる必要がありますjwplayer('div').setup({
sarsar 2011

ええ、私はjwplayerコードが何をしているのか、それがどのように機能するのかわかりませんでした。それが質問の一部だとは知りませんでした。とにかく、私はそれをWebで調べ、コードを変更して、乱数IDを持つdivがjwplayerセットアップにも渡されるようにしました。参考までに、CSS IDは技術的に数字で始めることは許可されていないため、先頭にも文字を付けます。
jfriend00 2011

答えの最後に、これを行うためのやや簡単な方法を追加しました。この場合、乱数は実際には必要ありません。一意のベース文字列と組み合わされた、単調に増加する数だけです。
jfriend00 2011

ファイル間で一意性が必要な場合は、ランダムなIDが必要になる場合があります。
aleclarson 2015

18

ランダムなIDも必要でした。base64エンコーディングを使用しました。

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

必要な文字数を選択してください。通常、結果は少なくとも24文字になります。


13

HTML 4に基づいて、IDは文字で始まる必要があります

IDトークンとNAMEトークンは、文字([A-Za-z])で始まる必要があり、その後に任意の数の文字、数字([0-9])、ハイフン( "-")、アンダースコア( "_")を続けることができます。 、コロン( ":")、およびピリオド( "。")。

したがって、解決策の1つは(英数字)である可能性があります。

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

9

私はこの単純なものが好きです:

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>

さて、アイデアはあなたのランダムなIDで新しい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/

補足:IDは英字で始まる必要があることは間違いありません(つまり、数字はありません)。このルールを適用するには、randomstringの実装を変更することをお勧めします。(参照


特にこの部分のjwプレーヤーjavascriptについて心配する必要がありますかjwplayer('placeholder').setup({
sarsar 2011

@ sarsar-私はあなたの質問に従わない!その部分を追加してrndId、コード内の変数を再利用してjwplayerの設定を行うことができることを示しました。
Jamiec 2011

そのjwplayerコードの場合、このコード内にもdivの同じIDを配置する必要があります
sarsar 2011

@ sarsar-それはまさに私が上で示したものです。rndIdランダムに生成されたコードが含まれています。
Jamiec 2011

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にIDを割り当てます。このような:

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

その後、<script>次のコードをタグ内に追加します。

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

6
randomString(8)どこにも定義されていません。
イーサン

3
@David randomStringは、質問をした人によって定義されます。上記の元の質問を参照してください。
vsushkov 2016

0

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

ASCII文字、数字、「_」、「-」、および「。」以外の文字を使用する。HTML 4では許可されていなかったため、互換性の問題が発生する可能性があります。この制限はHTML5で解除されましたが、ID互換性のために文字で始まる必要があります。


これは、数字で始まるが、含まれていることの結果をもたらす+=文字が...私はこの味を提案することができる:'id'+window.crypto.getRandomValues(new Uint32Array(1))[0].toString(36)
oriadam
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.