Javascript Singleton设计模式和闭包

时间:2012-02-24 20:58:18

标签: javascript

我试图创建一个处理事件监听器服务的Singleton对象:

var ChildParent = (function () {
   var html_element = document.getElementById("quoteNum");
   var row_number = 0;

   return {
       init: function(){
           html_element["parenttype"+row_number].addEventListener("click", ChildParent.fire, false);
       },
       add: function(total) { //Adding a row

       },
       fire: function() {
           alert("it fired!");
       }
   } 
})();

但是,当我调用ChildParent.init()时,文档元素将不会被分配给html_element,因此我无法附加监听器。奇怪的是,row_number变量初始化为零。是否存在某种我不明白的范围冲突?当我使用opera蜻蜓的步入功能时,我无法在init()函数中创建var赋值。

2 个答案:

答案 0 :(得分:0)

在执行脚本时,确保页面上有id为“quoteNum”的元素 您可能正在执行脚本而不等待呈现所有页面元素。

您可以考虑处理window.onload

<强>更新

以下更改可以帮助您解决在呈现页面之前初始化html_element的问题。

var ChildParent = (function () {
   function getElement(){
       return html_element ? html_element : html_element = document.getElementById("quoteNum");
   }

   var html_element;
   var row_number = 0;

   return {
       init: function(){
           getElement()["parenttype"+row_number].addEventListener("click", ChildParent.fire, false);
       },
       add: function(total) { //Adding a row

       },
       fire: function() {
           alert("it fired!");
       }
   } 
})();

答案 1 :(得分:0)

上面的代码是否在之后执行在DOM中存在标识为quoteNum的元素?

如果不是html_element将是null

因此,请确保所有上述代码都在脚本标记中,该脚本标记位于元素下方文档中的某个位置(或者位于window.onload jQuery的文档就绪类型事件中)。