我有一个列出订单的表格,我想添加过滤结果的可能性。因此,我在 Jquery 中创建了一个选择字段和一个 onchange 效果,它将包含这些过滤结果的同一表加载到我的 Div 中。因此,我使用 Ajax 将此"新内容"更新到我的div。问题是,此表具有多个JQuery效果(例如,单击行时向下滑动(,当AjaxRequest创建内容时,该效果不起作用。我已经在Stackoverflow和其他板上读过一些东西,但是有很多具体的情况,我无法使用任何情况。我听说过一些关于"init-function"的事情,我需要在某个地方调用它,所以JQuery的东西也可以在我的Ajax生成的内容上工作。
这是我的 Ajax 请求:
$('.category').on('change', function (e) {
var optionSelected = $("option:selected", this);
var valueSelected = this.value;
$.ajax({
type: "POST",
url: "includes/listorders.php",
data: "filter=" + valueSelected,
success: function( data ) {
$( "#latestOrders" ).html(data);
}
});
});
这是我的列表订单.php基本上返回的内容(可能不需要知道来解决我的问题(:
$filter = $_POST['filter'];
//Prepare Queries
$lastOrders = "SELECT * FROM Orders ORDER BY dateAdded DESC LIMIT 0,48";
$ps_orders = $db->query($lastOrders);
$data = $ps_orders->fetchAll();
foreach($data as $row)
{
$orderid =$row['id'];
$username = $row['name'];
$done = $row['refsDone'];
$quantity = $row['quantity'];
$running =$row['refsRunning'];
$untouched = $quantity - ($done+$running);
?>
<tr class="header mySlideToggler" data-id="<? echo $orderid ?>">
<td class="align-center">TEST<? echo $username ?></td>
<td>0 %</td>
<td>22 Aug 2014</td>
<td><? echo $done . " / " . $quantity ?></td>
<td><? echo $running ?></td>
<td><? echo $untouched ?></td>
<td>
<a href="#" class="table-icon edit" title="Edit"></a>
<a href="#" class="table-icon expand mySlideToggler" data-id=$orderid title="Expand"></a>
<a href="#" class="table-icon delete" title="Delete"></a>
</td>
</tr><tr style="padding: 0"><td colspan="7" style="padding: 0">
<div class="accounts" style="display: none">
</div>
</td></tr>
<?
}
?>
我的幻灯片效果,包括另一个 Ajax 请求,请求的内容应该显示在幻灯片的div 中:
// Slide effect for listing account information to an order
$('.mySlideToggler').click(function( event ){
event.preventDefault();
event.stopPropagation();
var id = $(this).data('id');
var div = $(this).closest('tr').next().find('.accounts');
$.ajax({
type: "POST",
url: "includes/listaccounts.php",
data: "orderid=" + id,
success: function( data ) {
div.html(data);
}
});
$(this).closest('tr').next().find('.accounts').slideToggle();
});
您需要确保使用事件侦听器的新实时版本,以处理异步加载的内容
$('body').on('click', '.my-class', function(){
//handle click event for .my-class here
});
上面的代码不是特定于您的情况,因为您尚未发布不适用于异步内容的 js 代码。这只是如何管理实时事件侦听器的示例。
查看代码更新后的具体答案:
$('body').on('click', '.mySlideToggler', function(event){
//do toggle stuff here
});
为什么?
jQuery .click
不支持异步加载的内容上发生的事件。同样的问题也适用于使用以下代码:
$('.mySlideToggler').on('click', function(event){
//THIS WONT WORK WITH ASYNC CONTENT
});
这就是为什么 jQuery 允许我们在未异步加载的父元素上注册事件,并为.on
提供第二个参数,告诉我们将该元素的哪个子元素侦听为目标或所述事件。这适用于所有事件,click|change|focus|blur|etc...
为什么选择 $('body'(
我通常将这些实时处理程序附加到 html 文档的body
,因为正文很少通过异步内容重新加载,因为重新加载整个内容可能需要加载新的页面,但没有必要使用 body。您可以附加到页面上任何静态的父元素,包括document
或window
很高兴知道
jQuery以前使用的方法.live()
该方法已被弃用了一段时间,我认为从1.7开始
我建议您在此处阅读有关 .live 更改的更多信息:http://api.jquery.com/live/
我希望这已经充分回答了你的问题。如果您仍然遇到问题,请告诉我。
性能问题
如果您使用大量此类事件,将 .on
事件的父对象附加到尽可能靠近子元素将提高性能,因为 jQuery 不必沿着 DOM 树向下遍历才能找到子元素。
更多信息在这里: http://api.jquery.com/on/#event-performance