jQuery的:克隆元素和事件 [英] jQuery: clone elements AND events
问题描述
每当我使用Ajax动态创建新内容,.clone(),追加()等新元素失去我编程=(
的触发器和事件制作副本,简单的事情,像添加一个类,在复制的元素不再工作等元素后做事。任何新的Ajax内容不工作。命令按钮不再起作用。我该怎么办?
我复制此HTML和命令按钮不再起作用。造型跨度元素不再在克隆的元素工作:
< div名称=显示ID =X>< BR /> < - !此ID取决于数据库 - >
< div名称=显示ID =X>
编号:LT;输入禁用=禁用大小=7价值=的XNAME =ID/>
状态:
<选择名称=状态>
<选项选择=选择>显示与LT; /选项>
<选项>隐藏< /选项>
< /选择>
< BR />< BR />
<跨度类=必需的ID =date_txt> *日期:< / SPAN><输入类型=文本值=NAME =日期/>
&安培; NBSP;&安培; NBSP;
<跨度类=必需的ID =的title_txt> *标题:< / SPAN><输入类型=文字大小=65值=NAME =头衔/>
< BR />
<跨度类=必需的ID =venue_txt> *地点:< / SPAN><输入类型=文字大小=45值=NAME =场地/>
电话:LT;输入类型=文本值=NAME =电话/>
< BR />
网址:<输入类型=文字大小=100值=NAME =URL/>
< BR />< BR />
地址:<输入类型=文字大小=45值=NAME =地址/>
&安培; NBSP;&安培; NBSP;
<跨度类=必需的ID =city_txt> *城市:其中; / SPAN><输入类型=文本值=NAME =城市/>
< BR />
状态:其中,INPUT TYPE =文本值=NAME =状态/>
ZIP:<输入类型=文本值=NAME =拉链/>
<跨度ID =country_txt> *国家:< / SPAN><输入类型=文本值=美国NAME =国家/>
< BR />
< BR />注释:其中; BR />
< textarea的COLS =80行=8NAME =意见>< / textarea的>
< / DIV>
< - 开始时间:!命令 - >
< DIV ID =命令>
<按钮名称=编辑ID =编辑>编辑< /按钮>
<按钮名称=删除ID =删除>删除< /按钮>
< BR />
<小时/>
< BR />
< / DIV>
!< - 结束:命令 - >
< / DIV>
< - 结束:!新 - >
新添加注释,11/03/2011:
好吧,我想通了这个问题,我在我的jQuery有一个错误。现在,当我添加.clone(真)几乎所有的工作。
我的新问题是UI日期选择器。
克隆HTML之后,当我点击新克隆的日期字段,焦点转到(旧)的DateField数据被克隆。更过,如果我选择一个日期,该值往旧的DateField - 不是新克隆的DateField。
下面是我的ajax code(成功后submition):
UI日期选择器code:
$(输入[名称='日期'])日期选择器({日期格式:YY-MM-DD',changeMonth:真的,changeYear:真的,NUMBEROFMONTHS:3 ,showButtonPanel:真});
阿贾克斯:
... AJAX code ...
功能(数据)
{
变量$味精=的eval(数据);
如果($味精[0] == 1)
{
//#var.new
的$ id ='#'+ $味精[1];
$数据= $(#新);
$新= $ data.clone(真);
$ new.find('input.datefield')日期选择器()。
$ new.attr(ID,$ id)的;
$ new.children('[NAME =ID])VAL($ ID)。
$ new.children('[NAME =ID]')ATTR(价值,$ id)的。
。$ new.children(:输入),每个(函数(){VAR $值= $(本).VAL(); $(本).attr(价值,$值);});
。$新的prePEND(< BR />中); $命令= $(#空白),儿童(#指令)的克隆(真)。;
$ commands.children(#增)文本(更新)。
$ commands.children(#增)ATTR(PK,$ id)的。
$ commands.children(#增)ATTR(名,更新)。
$ commands.children(#增)ATTR(ID,更新)。 $ commands.children(#重设)文本(删除)。
$ commands.children(#复位),ATTR(PK,$ id)的。
$ commands.children(#复位),ATTR(名,删除)。
$ commands.children(#复位),ATTR(ID,删除)。 $ new.append($命令); //#动画
//blank.slideUp
$(#空白)。效果基本show(2500,函数(){
$(#ADDNEW)HTML。(与►新:);
。// $(#空白)的clone()prependTo($(#激活));
// $(#空白)prependTo(#active); //active.slideUp
$(#活动)。效果基本show(慢,函数(){
$(#ON)HTML(与►活动:);
$(#激活)prePEND($新);
$('#复位')的触发器(点击)。 //active.slideDown
$(#活动)。了slideDown(8500,函数(){
$(#ON)HTML(与▼活动:); //blank.slideDown
$(#空白)。了slideDown(3500,函数(){
$(#ADDNEW)HTML。(与▼新:);
load_bar(0); }); //结束:anumation#blank.slideDown
}); //结束:anumation#active.slideDown
}); //结束:anumation#blank.slideUp
}); //结束:anumation#active.slideUp //$(\"#new\").fadeOut(2000,函数(){
//开始:空白
//警报($(#空白)HTML());
// $爸爸= $(#新);
//$dad.children('input[name!=\"id\"][name!=\"country],文本区域)。VAL('');
//$dad.children('[name=\"country\"]').val(\"United国家);
// $ dad.children('[NAME =日期])专注();
// END:空白
//$(\"#new\").fadeIn(2000,函数(){
//警报($味精);
//}); //结束:anumation.fadeIn
//}); //结束:anumation.fadeOut
} //万一
其他
{
// VAR varMSG =数据;
//警报(你好);
警报($味精); //$(\"#add\").attr(\"disabled,FALSE);
//$(\"#reset\").attr(\"disabled,FALSE);
load_bar(0);
} //结束:if.else
} //结束:$ .post.function
); //END:$.post
});
// END:阿贾克斯
.clone(真)
的伎俩。
文档: http://api.jquery.com/clone/
Whenever I use ajax to dynamically create new content, .clone(), append() etc, the new element looses any triggers and events I programmed =(
After making copy, simple things that WORK on other elements like adding a class to , on the copied elements no longer work. Any new ajax content does not work. Command buttons no longer work. What can I do?
I am cloning this HTML, and the command buttons no longer work. Styling the span elements no longer work on the CLONED elements:
<div name="shows" id="x"><br/> <!-- The ID depends on the database-->
<div name="shows" id="x">
ID: <input disabled="disabled" size="7" value="x" name="id" />
Status:
<select name="status" >
<option selected="selected" >Display</option>
<option >Hide</option>
</select>
<br/><br/>
<span class="required" id="date_txt">*Date: </span><input type="text" value="" name="date" />
<span class="required" id="title_txt">*Title: </span><input type="text" size="65" value="" name="title" />
<br/>
<span class="required" id="venue_txt">*Venue: </span><input type="text" size="45" value="" name="venue" />
Telephone: <input type="text" value="" name="tel" />
<br/>
URL: <input type="text" size="100" value="" name="url" />
<br/><br/>
Address: <input type="text" size="45" value="" name="address" />
<span class="required" id="city_txt">*City: </span><input type="text" value="" name="city" />
<br/>
State: <input type="text" value="" name="state" />
ZIP: <input type="text" value="" name="zip" />
<span id="country_txt">*Country: </span><input type="text" value="United States" name="country" />
<br/>
<br/>Comments: <br/>
<textarea cols="80" rows="8" name="comments" ></textarea>
</div>
<!-- START OF:commands -->
<div id="commands" >
<button name="edit" id="edit" >Edit</button>
<button name="delete" id="delete" >Delete</button>
<br />
<hr />
<br />
</div>
<!-- END OF:commands -->
</div>
<!-- END OF:new -->
New comments added, 11/03/2011:
OK, I figured out the problem and I had an error on my jQuery. Now, when I add .clone( true ) ALMOST everything works.
My new problem is the UI datepicker.
After cloning the HTML, when I click on the newly cloned date field, the focus goes to the (old) datefield the data was cloned from. More over, if I select a date, the value goes to the old datefield -Not the newly cloned datefield.
Here is my ajax code (After a successful submition):
UI datepicker code:
$("input[name='date']").datepicker({ dateFormat: 'yy-mm-dd', changeMonth: true, changeYear: true, numberOfMonths: 3, showButtonPanel: true});
Ajax:
...ajax code...
function(data)
{
var $msg = eval(data);
if( $msg[0] == 1 )
{
//#var.new
$id = '#'+$msg[1];
$data = $("#new");
$new = $data.clone(true);
$new.find('input.datefield').datepicker();
$new.attr("id", $id);
$new.children('[name="id"]').val($id);
$new.children('[name="id"]').attr("value", $id);
$new.children(":input").each(function() { var $value = $(this).val(); $(this).attr("value", $value); });
$new.prepend( "<br/>" );
$commands = $("#blank").children("#commands").clone(true);
$commands.children("#add").text("Update");
$commands.children("#add").attr("pk", $id);
$commands.children("#add").attr("name", "update");
$commands.children("#add").attr("id", "update");
$commands.children("#reset").text("Delete");
$commands.children("#reset").attr("pk", $id);
$commands.children("#reset").attr("name", "delete");
$commands.children("#reset").attr("id", "delete");
$new.append( $commands );
//#animation
//blank.slideUp
$("#blank").slideUp(2500, function(){
$("#ADDNEW").html("► New:");
//$("#blank").clone().prependTo( $("#active") );
//$("#blank").prependTo( "#active" );
//active.slideUp
$("#active").slideUp("slow", function(){
$("#ON").html("► Active:");
$("#active").prepend( $new );
$('#reset').trigger('click');
//active.slideDown
$("#active").slideDown(8500, function(){
$("#ON").html("▼ Active:");
//blank.slideDown
$("#blank").slideDown(3500, function(){
$("#ADDNEW").html("▼ New:");
load_bar(0);
}); //end: anumation.#blank.slideDown
}); //end: anumation.#active.slideDown
}); //end: anumation.#blank.slideUp
}); //end: anumation.#active.slideUp
//$("#new").fadeOut(2000, function(){
//START: blank
//alert( $("#blank").html() );
//$dad = $("#new");
//$dad.children('input[name!="id"][name!="country"], textarea').val('');
//$dad.children('[name="country"]').val("United States");
//$dad.children('[name="date"]').focus();
//END: blank
//$("#new").fadeIn(2000, function(){
//alert( $msg );
//}); //end: anumation.fadeIn
//}); //end: anumation.fadeOut
} //end: if
else
{
//var varMSG = data;
//alert( "Hello" );
alert( $msg );
//$("#add").attr("disabled", false);
//$("#reset").attr("disabled", false);
load_bar(0);
} //end: if.else
}//end: $.post.function
); //END:$.post
});
//END:ajax
.clone( true )
does the trick.
Documentation: http://api.jquery.com/clone/
这篇关于jQuery的:克隆元素和事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!