Javascript 使用jQuery'测试现有元素;s.长度不';看不到新创建的元素
我正在尝试使用jQuery和上下文菜单插件为HTML表创建一个复制/粘贴系统,并尝试对所有新创建的行进行唯一命名。因此,我有一个功能,可以克隆选定的行并在上面插入新行:Javascript 使用jQuery'测试现有元素;s.长度不';看不到新创建的元素,javascript,jquery,html-table,Javascript,Jquery,Html Table,我正在尝试使用jQuery和上下文菜单插件为HTML表创建一个复制/粘贴系统,并尝试对所有新创建的行进行唯一命名。因此,我有一个功能,可以克隆选定的行并在上面插入新行: function cloneAbove(TR) { var newRow = $(TR).clone(); var lastID = $(TR).attr('id'); var newID = Number(lastID.substring(3))-0.1; //See if that row
function cloneAbove(TR) {
var newRow = $(TR).clone();
var lastID = $(TR).attr('id');
var newID = Number(lastID.substring(3))-0.1;
//See if that row already exists:
if($('#tr_'+newID).length){
alert('#tr_'+newID+' Exists');
//If it does exist, we divide the newID by 10 until we find one that doesn't:
var i = 0;
while(i < 1){
newID = newID/10;
if($('#tr_'+newID).length > 0){
i = 1;
}
}
}
$(newRow).attr('id','tr_'+newID);
$(TR).before(newRow);
$(".target").contextmenu(option);
}
函数cloneAbove(TR){
var newRow=$(TR.clone();
var lastID=$(TR.attr('id');
var newID=编号(lastID.substring(3))-0.1;
//查看该行是否已存在:
if($('#tr#'+newID).length){
警报(“#tr#”+newID+“存在”);
//如果确实存在,我们将newID除以10,直到找到一个不存在:
var i=0;
而(i<1){
newID=newID/10;
如果($('#tr#'+newID).length>0){
i=1;
}
}
}
$(newRow).attr('id','tr_uu'+newID);
美元(TR).之前(纽罗);
$(“.target”).contextmenu(选项);
}
首先,它克隆所选行(即:“#tr_1”),减去新行id的0.1(即:“#tr_0.9”),然后检查该id是否已经存在-这就是我的问题所在-如果它存在,它将进入一个循环,除以10,直到找到一个不存在的id
以下是表格的示例:
<table id="table" border=1>
<tr class="target" id="tr_1" oncontextmenu="context('tr1')">
<td id="tr_1_1">Row1</td>
<td id="tr_1_2">Row1</td>
</tr>
<tr class="target" id="tr_2" oncontextmenu="context('tr2')">
<td id="tr_2_1">Row2</td>
<td id="tr_2_2">Row2</td>
</tr>
</table>
第1行
第1行
第2行
第2行
.length适用于页面加载时存在的“硬编码”元素,但它不会检测任何新创建的元素。有什么建议吗?您正在构建的“id”值会让jQuery感到困惑。选择器“#tr_0.9”表示“查找id为'tr_0'且类为'9'的元素”,而不是“查找id为'tr_0.9'的元素”
撇开这一事实不谈,我认为这是一种构造“id”值的非常奇怪的方式,您可以通过“引用”这些“.”字符使其工作:
if ($(('#tr_' + newId).replace(/\./g, "\\.")).length) {
// ... found a duplicate ...
这样做的目的是在构造的试验“id”值中用“.”替换“.”。当然,您只想在通过jQuery选择器查找元素时执行此操作;您不希望实际的“id”值中有反斜杠
或者,您可以将“.”字符替换为“u”或其他字符。您需要考虑如何解析jQuery选择器。添加新行时,新行的id设置为十进制数字(即“0.9”)。但是当使用jQuery选择器时
$('tr#u 0.9')
你是说:
获取id为“tr_0”的an元素
还有一个“9”级
点运算符是类选择器的符号。尝试使用整数值而不是小数
编辑:我太慢了 这很有效,但我明白你的意思,我的方法显然有缺陷。该表将包括表单字段,这些字段将遵循与其TR ID相同的命名约定,我可以看到,在通过POST(PHP)发送其值时,这是一个问题。重要的是,所有字段都可以根据其父TR轻松地分组在一起,并按照用户创建的顺序排列。因此,将tr_1复制到上面的行将给出它的ID和子表单字段名,其结束号小于1。有没有更好的方法来实现这一点?保持“id”值干净可能是一个好主意,只是为了控制总体头痛水平。您可以在“id”值中使用破折号和下划线,如果您想继续使用该数字技巧,可以将原始数值存储在单独的属性中,如“data num id”。在为新元素计算新的“id”时,您会使用该属性值,但“id”字符串本身会“.”更改为“-”。只是一个想法;可能还有其他方法。