通常在编写jQuery时我只使用函数。这次我想给它一些最佳实践,所以我按照教程。 javascript本身似乎是正确的,但我在调用某些函数时遇到了一些问题。
jQuery.noConflict();
(function($j) {
'use strict';
function Site(settings) {
this.windowLoaded = false;
}
Site.prototype = {
constructor: Site,
start: function() {
var me = this;
$j(window).load(function() {
me.windowLoaded = true;
});
this.attach();
},
attach: function() {
this.getPrimaLink();
this.onCloseDialog();
this.triggerDialog();
this.openLink();
},
getPrimaLink: function(){
if($j('#order-data').is(":visible")){
$j( ".content-header" ).append($j( "#findPrimaLink" ));
$j('#findPrimaLink').show();
}
},
onCloseDialog: function(){
$j('#dialog').bind('dialogclose', function(event) {
$j( ".content-header" ).append($j( "#findPrimaLink" ));
$j('#findPrimaLink').show();
});
},
triggerDialog: function(){
$j("[title='Create New Customer']").click(function(){
$j('#findPrimaLink').show();
>>>>> this.openDialog(); <<<<<<
})
},
openLink: function(){
$j('#findPrimaLink').click(function(){
>>> this.openDialog(); <<<<<
});
},
openDialog: function(){
$j( "#dialog" ).dialog({
height: 'auto',
width: 350,
modal: true,
resizable:false,
});
},
};
$j(document).ready(function($j) {
var site = new Site();
site.start();
});
})(jQuery);
在启动和附加功能中,我可以通过在其前面放置“this”来调用每个函数。但是当我尝试从openLink()和triggerDialog()调用openDialog()时,我得到了 - Uncaught TypeError:undefined不是一个函数。
为什么这样做以及我该怎么做才能解决它?
答案 0 :(得分:2)
对于你遇到问题的两个函数,你试图在jQuery函数中使用this
,所以this
的范围是DOM元素,而不是Site
1}} class 。
triggerDialog: function(){
var site = this;
$j("[title='Create New Customer']").click(function(){
$j('#findPrimaLink').show();
site.openDialog();
console.log(this); //remove this for production, but you can see that `this` points to a DOM element
})
},
openLink: function(){
var site = this;
$j('#findPrimaLink').click(function(){
site.openDialog();
});
},
要了解发生这种情况的原因,您应该阅读有关javascript Closures的信息。 Here和here。
P.S。你的openDialog
功能后还有一个额外的逗号。
P.P.S。值得注意的是,这正是您在start
方法中正在做的事情。
var me = this;
$j(window).load(function() {
me.windowLoaded = true;
});