2010-04-30 165 views
2

这里是我一起工作的代码:如何访问变量的函数以外的Javascript

$(document).ready(function() { 

    var TemplateEditor = function() { 

     var GroupClassName = 'group'; 
     var SelectedGroup = 0; 

     var BindClicks = function() { 
      $('.CriteriaSelections').unbind('click').click(function (event) { 
       event.preventDefault(); 
       if (fnIsTheClickedBoxaGroup($(this))) { 
        TemplateEditor.GroupClicked(); 
       } 
       else { 
        TemplateEditor.CriteriaClicked($(this), SelectedGroup); 
       } 
      }); 

      $('.groupselected').unbind('click').click(function (event) { 
       event.preventDefault(); 
       SelectedGroup = $(this).attr('group-'.length); 
       TemplateEditor.SelectGroup(SelectedGroup); 
      }); 
     } 


     var fnGetGroupID = function (Obj) { 
      if (fnIsTheClickedBoxaGroup(Obj) == true) { 
       return null; 
      } 
      else { 
       //Get parent which is the group 
       var ObjParent = Obj.parent(); 
       var GID = ObjParent.attr('id').substr('group-'.length); 
       return GID; 
      } 
     } 

     var fnIsTheClickedBoxaGroup = function (Obj) { 
      var GetClass = Obj.attr('class'); 
      if (GetClass == GroupClassName) { 
       return true; 
      } 
      else { 
       return false; 
      } 
     } 

     return { 
      Init: function() { 
       BindClicks(); 
      }, 
      CriteriaClicked: function (Obj, GroupID) { 
       $('<div>').attr({ id: '' }).addClass('selection').text(Obj).appendTo('#group-' + GroupID); 
      }, 
      GroupClicked: function() { 

      }, 
      SelectGroupClicked: function() { 

      }, 
      UpdateTargetPanel: function() { 

      } 
     }; 
    }(); 
    TemplateEditor.Init(); 
}); 

我试图访问这个变量: GroupClassName

这个变量是这个函数

var fnIsTheClickedBoxaGroup = function (Obj) { 
       var GetClass = Obj.attr('class'); 
       if (GetClass == GroupClassName) { 
        return true; 
       } 
       else { 
        return false; 
       } 
      } 

当我运行该程序时,它说GroupClassName是未定义的。我在这里错过了什么吗?

+0

尝试fnIsTheClickedBoxaGroup函数中的'alert(GroupClassName)'。我没有看到为什么GroupClassName不应该设置,当你到达它。另外,你是否无意中多次声明var GroupClassName?你使用不正确的大写? – 2010-04-30 19:24:25

+0

行..当我把它取消它的作品。但我不明白为什么它的工作 – Luke101 2010-05-01 02:33:20

+0

你也可以尝试看看它是否适用于其他浏览器。因为你没有用分号结束你的函数赋值语句('var x = function(){...}'),所以你的代码在技术上会有语法错误,并且可能不适用于所有的浏览器。一般来说,看看JSLint(http://www.jslint.com/)对你的代码的评论。 – 2010-05-01 03:38:01

回答

2
$(document).ready(function() { 

    var TemplateEditor = (function() { 

     var __self = this; 

     __self.groupClassName = 'group', 
     __self.selectedGroup = 0; 

     __self.BindClicks = function() { 

      $('.CriteriaSelections').unbind('click').click(function (event) { 
       event.preventDefault(); 
       if (__self.fnIsTheClickedBoxaGroup($(this))) { 
        TemplateEditor.GroupClicked(); 
       } 
       else { 
        TemplateEditor.CriteriaClicked($(this), __self.selectedGroup); 
       } 
      }); 

      $('.groupselected').unbind('click').click(function (event) { 
       event.preventDefault(); 
       __self.selectedGroup = $(this).attr('group-'.length); 
       TemplateEditor.SelectGroup(__self.selectedGroup); 
      }); 
     } 


     __self.fnGetGroupID = function (Obj) { 
      if (__self.fnIsTheClickedBoxaGroup(Obj) == true) { 
       return null; 
      } 
      else { 
       //Get parent which is the group 
       var ObjParent = Obj.parent(); 
       var GID = ObjParent.attr('id').substr('group-'.length); 
       return GID; 
      } 
     } 

     __self.fnIsTheClickedBoxaGroup = function (Obj) { 
      var GetClass = Obj.attr('class'); 
      if (GetClass == __self.groupClassName) { 
       return true; 
      } 
      else { 
       return false; 
      } 
     } 

     return { 
      Init: function() { 
       __self.BindClicks(); 
      }, 
      CriteriaClicked: function (Obj, GroupID) { 
       $('<div>').attr({ id: '' }).addClass('selection').text(Obj); 
       // text return text, don't jQuery object 
       $('<div>').appendTo('#group-' + GroupID); 
      }, 
      GroupClicked: function() { 

      }, 
      SelectGroupClicked: function() { 

      }, 
      UpdateTargetPanel: function() { 

      } 
     }; 

    }).call({}); 

    TemplateEditor.Init(); 
}); 
+0

很抱歉,但可能有效,但它看起来像一团糟,我不认为我们也确定了问题。 – 2010-05-02 18:04:31

2

或者,由于该变量是'常量',只需在TemplateEditor范围之外创建它,并在ready事件中进行创建即可。

-1

如果将其更改为this.GroupClassName,它会起作用吗?

+0

感谢您的建设性批评。它帮助我没有尽头。 – 2010-04-30 19:17:09

3

试试这个

function fnIsTheClickedBoxaGroup(Obj) { 
    var GetClass = Obj.attr('class'); 
    return (GetClass == GroupClassName); 
} 
+0

这应该与他所得到的错误无关(请参阅@ interjay的答案),但在任何情况下都是一个很好的改变。更好的可能是(GetClass === GroupClassName)(根据JLint)。 – 2010-04-30 19:40:20

+0

好吧,他不会在变量 - 函数赋值之后放置冒号,我认为重构代码将会清除这个问题,因为这是我能看到的唯一语法问题。 – 2010-04-30 22:54:40

+0

试过这个 - 看起来像你不需要一个分号后的函数声明。 – 2010-05-02 18:04:02

3

你正确发布作品的代码。试试吧here并参见。

我的测试做出的唯一改变是调用fnIsTheClickedBoxaGroup后:

if (fnIsTheClickedBoxaGroup($(this))) { 
    alert('fnIsTheClickedBoxaGroup returned true'); 
    //TemplateEditor.GroupClicked(); 
} 
else { 
    alert('fnIsTheClickedBoxaGroup returned false'); 
    //TemplateEditor.CriteriaClicked($(this), SelectedGroup); 
} 

你得到的错误,由于你没有在这里显示的东西。也许你在其他地方使用GroupClassName

相关问题