javascript - 使用 "Module Pattern"时 jQuery 单击事件不起作用

标签 javascript jquery module

我是一名中级前端 JS 开发人员,我正在尝试 Chris Coyyer 概述的模块模式 here .

但是当我在设置中存储一个 jQuery 选择器时,我无法使用它来触发点击事件。请参阅下面的代码和我的评论...非常感谢任何帮助!

var s,
TestWidget = {
  settings: {
    testButton: $("#testing")
  },
  init: function() {
    s = this.settings;
    this.bindUIActions();
  },
  bindUIActions: function() {
    console.log(s.testButton); // This works: [context: document, selector: "#testing", constructor: function, init: function, selector: ""…]

    //This doesn't work - why?????
    s.testButton.click(function() {
        //Why isn't this triggered?
        alert('testButton clicked');
    });

    /*This works, obviously:
    $('#testing').click(function() {
        alert('testButton clicked');
    });
    */

  }
};
$(document).ready(function() {
    TestWidget.init();
});

最佳答案

问题是您在 DOM 准备好之前初始化了 $("#testing"),所以这个 jQuery 对象是空的。

一个简单的解决方案是将所有代码放入就绪回调中。

另一种是替换

  settings: {
    testButton: $("#testing")
  },
  init: function() {
    s = this.settings;
    this.bindUIActions();
  },

  settings: {
  },
  init: function() {
    s = this.settings;
    s.testButton = $("#testing");
    this.bindUIActions();
  },

但是很难理解为什么要为这么简单的事情使用这么多代码。你可能过度使用了这里的模式,它并不是很干净,因为你有两个全局变量 sTestWidget 而一个已经很多了。

以下是您的代码的一个细微变化,在我看来,它会更清晰,同时仍然使用模块 ( IIFE variant):

TestWidget = (function(){
    var settings = {};
    return {
        init: function() {
            settings.testButton = $("#testing");
            this.bindUIActions();
        },
        bindUIActions: function() {
            console.log(settings.testButton);
            settings.testButton.click(function() {
                alert('testButton clicked');
            });
        }
    }

})();
$(document).ready(function() {
    TestWidget.init();
});

settings 保存在闭包中,不会泄漏到全局命名空间中。请注意,如果您不对该模块做更多操作,即使是这个版本也没有意义。

关于javascript - 使用 "Module Pattern"时 jQuery 单击事件不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17750128/

相关文章:

在 repo 中使用多个模块时,Go get 找不到本地包

python - 通用 Python 模块

javascript - 如何在 birt 报告中包装列数据

javascript - 如何让JavaScript和JQuery显示3位数字的天数

javascript - Google 基于 MySQL 和 PHP 结果以不同颜色绘制条形图

javascript - 如何使用Jquery获取点击的div内输入标签的值?

javascript - 为什么自定义渲染器不能按预期工作并导致奇怪的表格单元格行为?

android - 多模块项目 : Which modules resources are used if not overwritten?

javascript - 使用 Angular 工厂来保存应用程序其余部分访问的值,以最大限度地减少服务器调用

javascript - 如何将另一个div中的下拉选择默认值作为简单文本