我正在学习javascript设计模式。所以我将粗糙的jQuery代码转换为更清晰的模块模式。问题是,如何在ajax加载模块模式(Object literal)之后调用click事件。我曾经使用$(document).ajaxcomplete(callback)来解决它。Javascript模块parttern ajax
这里是工作supergetti代码
$('.meidaBtn, #media_load_btn').on('click', function(event) {
event.preventDefault();
$('.media').show(500);
$('#mediaBox').html('Loading...');
var link = location.origin + '/dashboard/media';
$.ajax({
url: link
}).done(function(data) { // data what is sent back by the php page
$('#mediaBox').html(data); // display data
// Click through
$('.imageBox img').bind('click', function() {
var src = $(this).attr('src');
var alt = $(this).attr('alt');
src = src.replace('tumbnail_', '');
tinyMCE.execCommand('mceInsertContent', false, '<img src="' + src + '" alt="' + alt + '">');
$('.media').hide();
});
});
});
这里是JavaScript模块模式/对象常量
var mediaPlugin = {
init: function() {
this.cacheDom();
this.bindEvents();
},
// Cache Dom
cacheDom: function() {
this.baseUrl = location.origin + '/dashboard/media';
this.$button = $('.meidaBtn, #media_load_btn');
this.$media = $('.media');
this.$mediaBox = $('#mediaBox');
this.$imageBox = $('.imageBox img');
},
// Bind Events
bindEvents: function() {
this.$button.on('click', this.render.bind(this));
this.$imageBox.on('click', this.addImage.bind(this));
},
// Show Data
render: function(e) {
e.preventDefault();
this.$media.show(500);
this.loadData();
},
// Load the data
loadData: function() {
var that = this;
$.ajax({
url: this.baseUrl,
type: 'GET',
success: function(data) {
// console.log(that.$mediaBox);
that.$mediaBox.html(data);
},
error: function() {
console.log("An error occored!");
},
complete: function() {
// console.log("I am now complete");
// that.loadMore();
}
});
},
// Add Image
addImage: function() {
var src = $(this).attr('src');
var alt = $(this).attr('alt');
src = src.replace('tumbnail_', '');
tinyMCE.execCommand('mceInsertContent', false, '<img src="' + src + '" alt="' + alt + '">');
this.$media.hide();
}
};
mediaPlugin.init();
很高兴您找到了解决方案,但请注意'delegate()'已弃用。使用'on()'代替(除非由于某种原因你必须使用旧版本的jQuery。) –
我一直在尝试使用.on(),但直到我尝试.delegate()才开始工作。我仍然会尝试使.on()工作。感谢您的时间@MattBrowne – rocky
@MattBrowne终于使用.on(),它工作。我想,当它不工作时,我正在以一种扭曲的方式实施它。我终于咨询了jquery手册。再次感谢 – rocky