我有很多jQuery事件监听器在文档完成加载时初始化。那部分工作正常。我有一个函数,它调用ajax并将响应作为HTML的字符串,我将jquery附加到DOM的一部分。尽管附加有效,但新的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);
});
}
答案 0 :(得分:0)
您需要使用on
- 调用,而不是click
和其他人 - 应该解决它。
所以$('.like-btn').click(function()
代替$('.like-btn').on('click',function()
而不是{{1}}
我不是100%肯定它可以使用你所拥有的功能和角色,但试试看看。
答案 1 :(得分:0)
使用事件委派将事件附加到动态创建的元素的父元素。见.on()
$("[id|=cmlst]")
.on("click"
, "css selector of element within `resp.data.comment_html` at `.then()`"
, clickHandlerFunctionReference);
答案 2 :(得分:0)
我实际上找到了解决这个问题的方法。
我创建了一个函数,它将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);
});
}