slideToggle 不适用于 AJAX 呈现的内容
slideToggle won't work on AJAX rendered content
我有一个简单的 slideToggle 函数:
$('.toggle-within').click(function () {
$('.toggle-this', this).slideToggle('fast');
});
而 HTML 就像:
<div class="toggle-within">
CLICK FOR DETAILS
<p class="toggle-this">
DETAILED TEXT
</p>
</div>
但问题是有时这个 HTML 是由 ajax 呈现的,我想因为它没有在页面加载时呈现,所以 jQuery 看不到它。
我尝试使用 ajax完成:
$(document).ajaxComplete(function () {
$('.toggle-within').click(function () {
$('.toggle-this', this).slideToggle('fast');
});
});
但还是什么都没有....
您绝对应该使用 delegated event listeners,永远不要担心 AJAX 调用后会发生什么。您的方法在固定后会在每次 AJAX 调用后堆积听众,因为您不仅针对新元素,而且还针对所有以前的元素。以下是如何使用委托侦听器:
$('body').on('click', '.toggle-within', function () {
$('.toggle-this', this).slideToggle('fast');
});
现场试玩:
$('body').on('click', '.toggle-within', function () {
$('.toggle-this', this).slideToggle('fast');
});
function add(){
var content = "<div class=\"toggle-within\">"+
"CLICK FOR DETAILS"+
"<p class=\"toggle-this\">"+
"DETAILED TEXT FROM AJAX"+
"</p>"+
"</div>"
document.body.innerHTML += content;
}
.toggle-this {display: none}
.toggle-within:hover {cursor: pointer; color: #aaa}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button onclick="add()">Simulate AJAX</button>
<div class="toggle-within">
CLICK FOR DETAILS
<p class="toggle-this">
DETAILED TEXT
</p>
</div>
我有一个简单的 slideToggle 函数:
$('.toggle-within').click(function () {
$('.toggle-this', this).slideToggle('fast');
});
而 HTML 就像:
<div class="toggle-within">
CLICK FOR DETAILS
<p class="toggle-this">
DETAILED TEXT
</p>
</div>
但问题是有时这个 HTML 是由 ajax 呈现的,我想因为它没有在页面加载时呈现,所以 jQuery 看不到它。
我尝试使用 ajax完成:
$(document).ajaxComplete(function () {
$('.toggle-within').click(function () {
$('.toggle-this', this).slideToggle('fast');
});
});
但还是什么都没有....
您绝对应该使用 delegated event listeners,永远不要担心 AJAX 调用后会发生什么。您的方法在固定后会在每次 AJAX 调用后堆积听众,因为您不仅针对新元素,而且还针对所有以前的元素。以下是如何使用委托侦听器:
$('body').on('click', '.toggle-within', function () {
$('.toggle-this', this).slideToggle('fast');
});
现场试玩:
$('body').on('click', '.toggle-within', function () {
$('.toggle-this', this).slideToggle('fast');
});
function add(){
var content = "<div class=\"toggle-within\">"+
"CLICK FOR DETAILS"+
"<p class=\"toggle-this\">"+
"DETAILED TEXT FROM AJAX"+
"</p>"+
"</div>"
document.body.innerHTML += content;
}
.toggle-this {display: none}
.toggle-within:hover {cursor: pointer; color: #aaa}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button onclick="add()">Simulate AJAX</button>
<div class="toggle-within">
CLICK FOR DETAILS
<p class="toggle-this">
DETAILED TEXT
</p>
</div>