这适用于某些功能而非其他功能

时间:2014-08-19 15:55:41

标签: javascript jquery scope undefined

通常在编写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不是一个函数。

为什么这样做以及我该怎么做才能解决它?

1 个答案:

答案 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的信息。 Herehere

P.S。你的openDialog功能后还有一个额外的逗号。

P.P.S。值得注意的是,这正是您在start方法中正在做的事情。

var me = this;

$j(window).load(function() {
    me.windowLoaded = true;
});