如何使用 JavaScript 创建唯一 ID?
我有一个表单,用户可以在其中为多个城市添加多个选择框。问题是每个新生成的选择框都需要有一个唯一的 id。这可以用 JavaScript 完成吗?
这是选择城市的表格部分。另请注意,当选择特定州时,我使用一些 PHP 来填充城市。
<form id="form" name="form" method="post" action="citySelect.php">
<select id="state" name="state" onchange="getCity()">
<option></option>
<option value="1">cali</option>
<option value="2">arizona</option>
<option value="3">texas</option>
</select>
<select id="city" name="city" style="width:100px">
</select>
<br/>
</form>
这是 JavaScript:
$("#bt").click(function() {
$("#form").append(
"<select id='state' name='state' onchange='getCity()'>
<option></option>
<option value='1'>cali</option>
<option value='2'>arizona</option>
<option value='3'>texas</option>
</select>
<select id='city' name='city' style='width:100px'></select><br/>"
);
});
I have a form where a user can add multiple select boxes for multiple cities. The problem is that each newly generated select box needs to have a unique id. Can this be done in JavaScript?
Here is the part of the form for selecting cities. Also note that I'm using some PHP to fill in the cities when a specific state is selected.
<form id="form" name="form" method="post" action="citySelect.php">
<select id="state" name="state" onchange="getCity()">
<option></option>
<option value="1">cali</option>
<option value="2">arizona</option>
<option value="3">texas</option>
</select>
<select id="city" name="city" style="width:100px">
</select>
<br/>
</form>
Here is the JavaScript:
$("#bt").click(function() {
$("#form").append(
"<select id='state' name='state' onchange='getCity()'>
<option></option>
<option value='1'>cali</option>
<option value='2'>arizona</option>
<option value='3'>texas</option>
</select>
<select id='city' name='city' style='width:100px'></select><br/>"
);
});
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(30)
该函数生成非常唯一的 ID,并按其生成日期排序。
也可用于数据库中的 ID。
This Function generates very unique IDs that are sorted by its generated Date.
Also useable for IDs in Databases.
使用毫秒计时器的另一种方式:
another way it to use the millisecond timer:
你不能只保留一个运行索引吗?
编辑
经过进一步考虑,您实际上可能更喜欢为您的选择使用数组样式名称...
例如
,在 php 的服务器端,例如:
编辑 2 在对OP评论的响应
使用DOM方法动态创建选项可以如下完成:
假设
cities
数组已经存在或者您可以使用innerHTML方法......
could you not just keep a running index?
EDIT
Upon further consideration, you may actually prefer to use array-style names for your selects...
e.g.
then, on the server side in php for example:
EDIT 2 In response to OP comment
Dynamically creating options using DOM methods can be done as follows:
assuming that the
cities
array already existsAlternatively you could use the innerHTML method.....
最短且没有库,也适用于nodejs
https://developer .mozilla.org/en-US/docs/Web/API/Crypto/randomUUID
The shortest and without libraries, also works in nodejs
https://developer.mozilla.org/en-US/docs/Web/API/Crypto/randomUUID
不需要外部库。证明了唯一性。
你可以做这样的事情。
将自纪元以来的时间(以毫秒为单位)与随机值乘以固定大小。
运行此命令以查看可能的冲突。
你会发现无论是 1000、10000 还是 1000000000,都不会发生冲突。
如果两个用户同时生成 id 并获得相同的随机数,那么这种可能性很小。
为了增加唯一性,您可以将日期乘以更多
Math.random()
。No external libraries needed. Uniqueness proved.
You could do something like this.
Multiply time in milliseconds since epoch with a random value to fixed size.
Run this to see possible collisions.
You would see there are no collisions whether it is 1000, 10000 or 1000000000.
It would have a very small chance if two users generate ids at the same time and gets the rame random number.
To increase the uniqueness you could multiply date more
Math.random()
s.非常短的函数将为您提供唯一的 ID:
Very short function will give you unique ID:
我正在研究与OP类似的问题,并发现@Guy和@Scott的解决方案的元素可以组合起来创建一个在我看来更可靠的解决方案。此处生成的唯一 id 具有以下划线分隔的三个部分:
这个解决方案应该工作得很好,即使对于非常大的集合:
I'm working on a similar problem to the OP, and found that elements of the solutions from @Guy and @Scott can be combined to create a solution that's more solid IMO. The resulting unique id here has three sections separated by underscores:
This solution should work really well, even for very large sets:
您可以使用计时器生成 ID,并使用
performance.now()
避免重复:请注意,高分辨率时间 API 在所有最新浏览器中均可用。
编辑(根据 Ciprian 的评论):不幸的是,这还不够,
performance.now()
仅精确到毫秒。考虑将其与 Math.random() 结合使用:You could generate an ID using a timer and avoiding duplicates using
performance.now()
:Note that the High resolution time API is available in all recent browsers.
EDIT(per Ciprian's comment): That is unfortunately not enough,
performance.now()
is only precise to the millisecond. Consider using it in conjuction withMath.random()
:回复@scott:
有时 JS 运行得很快...所以...
In reply to @scott :
Sometime JS go very fast... so...
在您的命名空间中放入一个类似于以下实例的实例
put in your namespace an instance similar to the following one
您可以使用 ES6 中引入的 Generator 函数(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*)
You can use the Generator function, was introduced in ES6 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*)
随机不是唯一的。时间值不唯一。这些概念非常不同,当您的应用程序扩展和分布式时,这种差异就会显现出来。上面的许多答案都有潜在的危险。
解决发帖者问题的更安全方法是 UUID:Create GUID / UUID in JavaScript?
Random is not unique. Times values are not unique. The concepts are quite different and the difference rears its ugly head when your application scales and is distributed. Many of the answers above are potentially dangerous.
A safer approach to the poster's question is UUIDs: Create GUID / UUID in JavaScript?
有两个软件包可用于此目的。
nanoid
linkuuid
链接There are two packages available for this.
nanoid
linkuuid
link为了避免创建任何计数器并确保 id 是唯一的,即使有一些其他组件在页面上创建带有 id 的元素,您可以使用随机数,如果它不够好则更正它(但您也必须立即设置 id 以避免冲突):
To avoid creating any counters and be sure that the id is unique even if there are some other components that create elements with ids on the page, you can use a random number and than correct it if it's not good enough (but you also have to set the id immediately to avoid conflicts):
我认为如果你真的想拥有一个唯一ID,那么最好的方法是使用如下库:
uuid 或 uniqueid
注意< /em>: 唯一 ID 与随机 ID 不同
仅使用日期时间毫秒的方法是错误的。
如今,计算机速度足够快,能够在一毫秒内运行多次循环迭代。
导入库:
如果您使用 ES 模块
对于 CommonJS:
用法:
I think if you really want to have a unique ID then the best approach is to use a library like:
uuid or uniqueid
Note: Unique ID is not the same as Random ID
To use only date time milliseconds approach is wrong.
Nowadays computers are fast enough and able to run more than one iteration of a loop in a single millisecond.
Importing the library:
If you are using ES modules
And for CommonJS:
Usage:
就像其他人所说的那样,您可以使用运行索引,或者如果您不喜欢使用变量的想法,只需提取列表中最后一个城市的 id 并将 1 添加到其 id 中。
Like others said you can use a running index, or if you don't like the idea of using a variable just pull the id of the last city in the list and add 1 to its id.
警告:这个答案可能不利于这个问题的总体意图,但我还是把它发布在这里,因为它解决了这个问题的部分版本。
您可以使用 lodash 的
uniqueId
(文档此处)。对于数据库记录或在浏览器中保存会话或类似内容的东西来说,这不是一个好的 uniqueId 生成器。但我来这里寻找这个的原因是通过使用它来解决的。如果你需要一个唯一的 id 来处理足够短暂的事情,这就可以了。我需要它是因为我正在创建一个可重用的反应组件,该组件具有标签和表单控件。标签需要有一个
for="controlId"
属性,与实际表单控件(input 或 select 元素)具有的id="controlId"
相对应。在这种情况下,这个 id 不是必需的,但我需要为两个属性生成一个 id 来共享,并确保该 id 在正在呈现的页面上下文中是唯一的。所以lodash的功能运行得很好。以防万一对其他人有用。Warning: This answer may not be good for the general intent of this question, but I post it here nevertheless, because it solves a partial version of this issue.
You can use lodash's
uniqueId
(documentation here). This is not a good uniqueId generator for say, db records, or things that will persist a session in a browser or something like that. But the reason I came here looking for this was solved by using it. If you need a unique id for something transient enough, this will do.I needed it because I was creating a reusable react component that features a label and a form control. The label needs to have a
for="controlId"
attribute, corresponding to theid="controlId"
that the actual form control has (the input or select element). This id is not necessary out of this context, but I need to generate one id for both attributes to share, and make sure this id is unique in the context of the page being rendered. So lodash's function worked just fine. Just in case is useful for someone else.如果您只是想创建一个唯一的 ID:
那么您可以简单地使用 const someId = Symbol();< /code> 确保唯一性。
这对于提交到 PHP 脚本的表单不起作用。但是,我想确保在这里捕获这一点,以防其他人正在寻找更通用的唯一 ID 方法。
If you're just looking to create a unique ID that:
Then you can simply use
const someId = Symbol();
for guaranteed uniqueness.This would not work for your form which submits to a PHP script. But, I want to make sure to capture this here in case others are looking for a more generic approach to unique IDs.
只需两分钱
Just two cents
看看这个函数,它会完成你的工作。
如果您想要字符串中包含大写和小写字符:
仅小写字符:
Look at this functions, it will get ur job done.
If u want uppercase and lowercase chars in ur string:
Only lowercase chars:
简单的解决方案:)
Simple Solution :)
您可以利用
闭包
。如果你想附上它:
generator
可以接受默认前缀;generateId
可以接受可选后缀:如果您希望 id 指示一个序列,这会很方便,非常类似于 new Date().getTime(),但更易于阅读。
You could take advantage of
closure
.If you want to enclose it:
generator
could accept a default prefix;generateId
coud accept an optional suffix:This comes in handy if you want your id to indicate a sequence, very much like
new Date().getTime()
, but easier to read.这是一个函数(下面的函数 genID()),它根据您想要的任何 id 前缀/ID 递归检查 DOM 的唯一性。
在你的情况下,你可能会这样使用它
Here is a function (function genID() below) that recursively checks the DOM for uniqueness based on whatever id prefex/ID you want.
In your case you'd might use it as such
这是我自己根据创建的元素的 xpath 的看法:
首先获取元素的 xpath。
然后计算 xpath 的哈希码。因此,每个 xpath 都有一个唯一的 id。
这里的问题是,如果动态生成唯一元素,则 xpath 不一定是唯一的。因此我们在末尾添加时间戳。
也许我们还可以通过添加最后的 Math.Random() 来保证更多独特的元素。
Here's my own take at it based on the xpath of the element created :
First the xpath of the element is fetched.
The hashcode of the xpath is then computed. We therefore have a unique id per xpath.
The problem here is that xpath are not necesseraly unique if unique elements are generated on the fly. Thus we add the timestamp at the end.
Maybe we could also garantee more unique elements by adding a final Math.Random().
如果需要在 TypeScript 中生成 GUID,可以使用 guid-typescript 包,为此目的提供了一个 Guid 类。
要使用它,您可以通过 npm 安装该包:
npm i guid-typescript --save
然后,在您的 TypeScript 代码中,您可以导入 Guid 类并创建新的 GUID,如下所示:
我希望这会有所帮助
If you need to generate GUIDs in TypeScript, you can use the guid-typescript package, which provides a Guid class for this purpose.
To use it, you can install the package via npm:
npm i guid-typescript --save
Then, in your TypeScript code, you can import the Guid class and create new GUIDs as follows:
I hope this help ????
为了生成唯一的 id:
For generate unique id's: