0

ここに私のコードがあります

    var s;
var AddEvent =  {
    settings : {
        saveButton : $('#uploadfiles1'),
        cancelSpeech :  $('.cancelSpeech'),
        datePicker : $(".datepicker"),
        eventName : $('input[name=eventname]'),
        eventDate : $('input[name=eventdate]')
    },
    init:function(s){
        s = this.settings;
        this.BindEvents();
        $('.Wallpapers').addClass('active');
        $('input, textarea').placeholder();
    },
    BindEvents:function(){
        this.CancelButton();
        this.DatePicker();
       // this.SaveButton();
        $('input[type=text],textarea').on('keyup change',function(){
            AddEvent.FieldsCheck(); 
        });
    },
    CancelButton: function()
    {
        s.cancelSpeech.on('click',function(){
            var referrer =  document.referrer;
            window.location = referrer;
        });
    },
    DatePicker :function()
    {
        s.datePicker.datepicker({
            //defaultDate: +7,
            showOtherMonths: true,
            autoSize: true,
            //appendText: '(dd-mm-yyyy)',
            dateFormat: 'dd/mm/yy'
        });
    },
    SaveButton: function()
    {
        this.ClearFields();
    },
    FieldsCheck: function()
    {
        alert(s.eventName.attr('name'));
        if(s.eventName.val()!='' && s.eventDate.val() !='' && $('textarea').val()!='')
        {
            s.saveButton.removeAttr('disabled').removeClass('disabled');
        }
        else
            s.saveButton.attr('disabled','disabled').addClass('disabled');
    },
    ClearFields:function()
    {
        $('input,textarea').val('');
        this.FieldsCheck();
    }
};
$(function(){
    AddEvent.init(s);
});

私はこの例を実装していますhttp://css-tricks.com/how-do-you-structure-javascript-the-module-pattern-edition/

しかし、この行で入力フィールドに入力するたびに、アラートで未定義になります

alert(s.eventName.attr('name'));

私が何を間違っているのか教えてください。検索しようとしましたが、有用なものが見つかりませんでした。

編集:ここで、私が得ている小さなjsfiddleを作成しました

TypeError: this.settings is undefined
[Break On This Error]   

console.log(this.settings.eventName.attr('id'));

ありがとう

4

1 に答える 1

2

あなたの問題はここにあります:

var s;
AddEvent.init(s);

この後s定義する方法はありません。

解決策は、単に渡さないことですs(関数の引数で宣言しないでください):

init:function(s){
    s = this.settings;
...
AddEvent.init();

しかし、それは変数がグローバル名前空間を汚染することを可能にします.

settingsすべての関数からアクセスできるようにする場合は、クロージャーに埋め込むことができます。

var AddEvent =  (function(){
    var settings;
    return {
        init:function(){
                settings = {
                        saveButton : $('#uploadfiles1'),
                        cancelSpeech :  $('.cancelSpeech'),
                        datePicker : $(".datepicker"),
                        eventName : $('input[name=eventname]'),
                        eventDate : $('input[name=eventdate]')
                };
            this.BindEvents();
            $('.Wallpapers').addClass('active');
            $('input, textarea').placeholder();
        },
        BindEvents:function(){
            this.CancelButton();
            this.DatePicker();
           // this.SaveButton();
            $('input[type=text],textarea').on('keyup change',function(){
                AddEvent.FieldsCheck(); 
            });
        },
        CancelButton: function()
        {
            settings.cancelSpeech.on('click',function(){
                var referrer =  document.referrer;
                window.location = referrer;
            });
        },
        DatePicker :function()
        {
            settings.datePicker.datepicker({
                //defaultDate: +7,
                showOtherMonths: true,
                autoSize: true,
                //appendText: '(dd-mm-yyyy)',
                dateFormat: 'dd/mm/yy'
            });
        },
        SaveButton: function()
        {
            this.ClearFields();
        },
        FieldsCheck: function()
        {
            alert(settings.eventName.attr('name'));
            if(settings.eventName.val()!='' && settings.eventDate.val() !='' && $('textarea').val()!='')
            {
                settings.saveButton.removeAttr('disabled').removeClass('disabled');
            }
            else
                settings.saveButton.attr('disabled','disabled').addClass('disabled');
        },
        ClearFields:function()
        {
            $('input,textarea').val('');
            this.FieldsCheck();
        }
    }
})();

$(function(){
    AddEvent.init();
});
于 2013-04-15T08:41:31.290 に答える