[英]jQuery - Reinitialize DOM listeners
我有很多 jQuery 事件偵聽器,它們在文檔完成加載時進行初始化。 那部分工作正常。 我有一個函數可以進行 ajax 調用並以 HTML 字符串的形式獲取響應,我用 jQuery 將其附加到 DOM 的一部分。 盡管 append 有效,但新的 HTML 代碼片段不適用於 jQuery 事件偵聽器,因為它在加載時不是 DOM 的一部分。 有沒有辦法重新初始化 jQuery 事件偵聽器?
這是另一件事:我嘗試將事件偵聽器存儲在一個函數(函數a
)中,並在我想要重新初始化偵聽器時調用該函數。 這部分奏效了...雖然偵聽器響應了新的 HTML 片段,但偵聽器的結果加倍,並且在調用函數a()
時保持加倍,從而導致一個重大錯誤。
我正在混合 jQuery 和 Angular。 這是一個片段:
$(document).ready(function(){
$('.like-btn').click(function(){
var likeStatus = $(this).data('like-status-json');
var contentType = $(this).data('content-type');
var contentID = $(this).data('content-id');
var likeMeter_id = '#' + contentType.toLowerCase() + '-' + 'likemeter' + '-' + contentID;
var likeMeter_elm = $(likeMeter_id);
// console.log( likeStatus, contentType, $(likeMeter_elm) );
var obj = {
likeStatus: likeStatus,
contentType: contentType,
contentID: contentID,
likeMeter_elm: likeMeter_elm,
likes: parseInt( $(likeMeter_elm).text() ),
og_elm: $(this)
}
$scope.likeAction(obj);
});
});
$scope.likeAction = function(dataObj) {
// console.log(dataObj);
var req = {
method: 'POST',
url: '/action/ajax/',
headers: {
'Content-Type': 'application/json',
'responseType': 'json',
"Accept" : "application/json",
'X-CSRFToken': Cookies.get('csrftoken')
},
data: {
action: dataObj.likeStatus.action,
info: dataObj,
csrfmiddlewaretoken: Cookies.get('csrftoken'),
}
}
$http(req).then(function(resp){
// Success Callback
// console.log(resp);
$(dataObj.og_elm).data('like-status-json', resp.data.likeStatus);
$(dataObj.og_elm).removeClass(dataObj.likeStatus.class).addClass(resp.data.likeStatus.class);
$(dataObj.og_elm).children('span.like-text').text(resp.data.likeStatus.text);
$(dataObj.likeMeter_elm).text(resp.data.likeMeter);
},
function(resp){
// Error Callback
// console.log(resp);
});
}
這是附加新 HTML 片段的 ajax:
$scope.addPostCommentUser = function(inputELM, dataObj) {
if( inputELM == undefined || dataObj == undefined ) {
console.log('Missing Inputs...');
return;
}
console.log(dataObj);
// return;
var req = {
method: 'POST',
url: '/action/ajax/',
headers: {
'Content-Type': 'application/json',
'responseType': 'json',
"Accept" : "application/json",
'X-CSRFToken': Cookies.get('csrftoken')
},
data: {
action: 'addPostCommentUser',
info: dataObj,
csrfmiddlewaretoken: Cookies.get('csrftoken'),
}
}
$http(req).then(function(resp){
// Success Callback
console.log(resp);
var id = '#cmlst-' + dataObj.post_id;
$(id).append(resp.data.comment_html)
$(inputELM).val('');
},
function(resp){
// Error Callback
console.log(resp);
});
}
您需要使用on
call,而不是click
和其他 - 這應該可以解決它。
所以代替$('.like-btn').click(function()
你會做$('.like-btn').on('click',function()
我不是 100% 確定它可以與您擁有的功能和 Angular 的組合一起使用,但請嘗試並查看。
使用事件委托將事件附加到動態創建的元素的父元素。 見.on()
$("[id|=cmlst]")
.on("click"
, "css selector of element within `resp.data.comment_html` at `.then()`"
, clickHandlerFunctionReference);
我實際上找到了自己解決這個問題的方法。
我創建了一個函數,該函數將 jQuery 事件偵聽器應用於給定參數/輸入參數中的元素。 因此,每當我從服務器端 AJAX 獲取 HTML 字符串時,我都會使用 jQuery 創建一個新的 DOM 元素並將其傳遞給該函數! 它實際上完美運行!!!
這是示例:
$scope.applyNewLikeListeners = function(elm) {
$(elm).find('.like-btn').on('click', function(){
var likeStatus = $(this).data('like-status-json');
var contentType = $(this).data('content-type');
var contentID = $(this).data('content-id');
var likeMeter_id = '#' + contentType.toLowerCase() + '-' + 'likemeter' + '-' + contentID;
var likeMeter_elm = $(likeMeter_id);
var obj = {
likeStatus: likeStatus,
contentType: contentType,
contentID: contentID,
likeMeter_elm: likeMeter_elm,
likes: parseInt( $(likeMeter_elm).text() ),
og_elm: $(this)
}
$scope.likeAction(obj);
});
}
有用!
$scope.addCommentReplyUser = function(inputELM, dataObj) {
if( inputELM == undefined || dataObj == undefined ) {
console.log('Missing Inputs...');
return;
}
console.log(dataObj);
// return;
var req = {
method: 'POST',
url: '/action/ajax/',
headers: {
'Content-Type': 'application/json',
'responseType': 'json',
"Accept" : "application/json",
'X-CSRFToken': Cookies.get('csrftoken')
},
data: {
action: 'addCommentReplyUser',
info: dataObj,
csrfmiddlewaretoken: Cookies.get('csrftoken'),
}
}
$http(req).then(function(resp){
// Success Callback
console.log(resp);
var id = '#rplst-' + dataObj.comment_id;
var elm = $(resp.data.reply_html)
$(id).append(elm)
$(inputELM).val('');
$(dataObj.replyMeter_elm).text(resp.data.replyMeter);
$scope.applyNewLikeListeners(elm);
},
function(resp){
// Error Callback
console.log(resp);
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.