ドキュメントのロードが完了したときに初期化するjQueryイベントリスナーがたくさんあります。その部分は正常に動作しています。私はajax呼び出しを行い、HTMLの文字列としてレスポンスを取得する関数を持っています.HTMLの一部にjqueryを追加します。追加機能は動作しますが、新しいHTMLスニペットコードはjQueryイベントリスナーでは動作しません。ロードされたDOMの一部ではないからです。 jQueryイベントリスナーを再初期化する方法はありますか?jQuery - DOMリスナの再初期化
私はイベントリスナーを関数(関数a)に格納しようとしましたが、リスナーを再初期化したいときはいつでもその関数を呼び出しようとしました。リスナーが新しいHTMLスニペットに応答したにもかかわらず、リスナーの結果は2倍になり、関数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スニペットを追加しアヤックスです:
$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);
});
}
ありがとうございました!私は間違いなく試みます! – ryanwaite28
それはうまくいかなかったが、試してくれてありがとう? jQueryリスナーは、スクリプトの読み込み/読み込み時に存在していた要素だけを聴くことになります。しかし、私はこれを回避する方法を見つけました! – ryanwaite28
私は、新しいHTMLがjQueryセレクタにバインドされていないという問題は、リスナーが初期化された時点で存在しなかったためです。要素を選択するためのコードは間違いなく正しいです(python jinjaテンプレートエンジンによってレンダリングされました)。私は、特定のDOM要素をjQueryリスナーにバインドする関数を作成することで、この問題を修正/解決しました。だから私はAJAXからの文字列としてHTMLを取得するたびに、私は新しいDOM要素を作成し、その関数に渡します。それは完全に動作します。 – ryanwaite28