我知道在阅读分配后我感到很困惑......
As of jQuery 1.7, the .live() method is deprecated. Use .on() to attach event handlers. Users of older versions of jQuery should use .delegate() in preference to .live().
有人可以描述我如何解决下面的代码。
当页面是静态时,它按预期工作。 <!-- ajax fills this in -->
时,它不起作用
一般来说,改进我的代码的评论也很受欢迎,因为我对jquery很新。
谢谢,圣诞快乐!
<!DOCTYPE html>
<head>
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
<script type='text/javascript'>
$(document).ready(function() {
$('form .edit').on( {
mouseenter: function() {
$(this).css({cursor:'pointer', color: 'red'});
},
mouseleave: function() {
$(this).css({cursor:'default', color: 'rgb(204, 204, 204)'});
},
click: function() {
var $t = $(this).parents('table').attr('id');
var $tr = '#'+ this.id;
var tData = $($tr +' > td');
$(tData).each(function () {
var td = '#'+ this.id;
var $th = $(td).closest('table').find('th').eq($(td).index()).text();
var html = $(this).html();
var input = $("<input id='"+$t+$tr+this.id+"' name='"+$t+"="+$th+"' />");
input.val(html);
$(this).html(input);
});
$('.edit').off();
}
});
});
</script>
</head>
<body>
<div>
<form id="userForm" method='get'>
<!-- ajax fills this in -->
<table class='table' id='user'>
<thead>
<tr class='head'>
<th>head 1</th>
<th>head 2</th>
</tr>
</thead>
<tfoot><tr></tr></tfoot>
<tbody>
<tr class='edit' id='1' title='click to edit'>
<td id='1a'>content 1a</td>
<td id='1b'>content 1b</td>
</tr>
<tr class='edit' id='0' title='click to edit'>
<td id='0a'>content 0a</td>
<td id='0b'>content 0b</td>
</tr>
</tbody>
</table>
<input class='ajaxSubmitAndReturn' type='submit' value='Submit' />
<input class='ajaxCancel' type='submit' value='Cancel' />
<!-- end of ajax -->
</form>
</div>
</body>
</html>
答案 0 :(得分:1)
在加载ajax内容后,您需要调用jquery代码块。
您可以将jQuery代码包装在一个函数中:
function updateStuff() {
$('form .edit').on( {
mouseenter: function() {
$(this).css({cursor:'pointer', color: 'red'});
},
mouseleave: function() {
$(this).css({cursor:'default', color: 'rgb(204, 204, 204)'});
},
click: function() {
var $t = $(this).parents('table').attr('id');
var $tr = '#'+ this.id;
var tData = $($tr +' > td');
$(tData).each(function () {
var td = '#'+ this.id;
var $th = $(td).closest('table').find('th').eq($(td).index()).text();
var html = $(this).html();
var input = $("<input id='"+$t+$tr+this.id+"' name='"+$t+"="+$th+"' />");
input.val(html);
$(this).html(input);
});
$('.edit').off();
}
});
}
然后,在ajax调用填充内容之后,您可以简单地调用:
updateStuff();
答案 1 :(得分:1)
使用on()
有两种主要方式。
一个是$(selector).on(handler)
,如果在触发代码时存在选择器表示的元素,它将起作用,但不考虑将来添加到DOM的元素。
另一种方法是将on()
委托给页面中的永久资产。这可以是选择器的任何祖先,甚至是document
事件绑定到祖先,并为事件添加选择器参数 target 。
如果在您的情况下,如果表格是永久资产,您可以写:
/* if "form" is added by ajax, can use "document" or an ancestor of "form" that is permament in page*/
$('form').on( {
mouseenter: function() {
$(this).css({cursor:'pointer', color: 'red'});
},
mouseleave: function() {
$(this).css({cursor:'default', color: 'rgb(204, 204, 204)'});
},
click: function() {/*...*/}
}, '.edit');
将来会添加添加到DOM的任何类edit
元素。
在您的情况下,您使用的是events map
。当使用以下语法将hanlder与多个事件相同(或仅在事件上注册)时,事件也可以注册为空格分隔的字符串:
$('form').on('myCustomEvent submit', '.edit', function(){
doSomething()
});
现在查看文档,并注意[]
表示的可选选择器,事件映射等,并与文档中的这些示例和示例进行比较。