javascript - 编写 jQuery 插件时发生范围冲突

标签 javascript jquery jquery-plugins

我正在尝试编写一个简单的 jQuery 插件,只是为了看看它是如何完成的。但我似乎不能同时运行它两次。它基本上是一个倒计时,它所做的就是获取 div 中的 text() 值并倒计时直到它达到 1。

$('#box1').startCounter();
$('#box2').startCounter();

此调用将函数内的两个 this 变量都更改为指向 #box2。这是我的 jsfiddle

this 在 jQuery 插件中的变化非常令人困惑。感谢您的帮助:)

最佳答案

您在全局范围内定义了 $this,因此当在第二个元素上调用 startCount 时,该值将被覆盖。使用 var 使其成为本地的:

var $this = this;

DEMO


除了再次调用该元素的函数,您还可以这样做:

$.fn.startCount = function(count, div) {
    count = (count) ? count : parseInt($('span.no-display',this).text());
    var $target =  $('div.counter', this);

    var run = function() {
        if (count <= 1) {
            this.fadeOut().mouseout();
        }       
        else {
            count--;
            $target.text(count);
            setTimeout(run, 1000);
        }
    };
    run();
}

DEMO 2


要让您的插件在 $ 不引用 jQuery ( jQuery.noConflict() ) 的环境中工作,您应该这样做:

(function($) {
    $.fn.startCount = ...
}(jQuery)); 

关于javascript - 编写 jQuery 插件时发生范围冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6808301/

相关文章:

javascript - 我需要确保在使用 RequireJS 加载依赖项之前不会加载插件

javascript - IE8绝对位置+不透明度问题

javascript - 使用 POST 打开新选项卡或窗口 [PHP]

javascript - 文本区域自动展开

jquery - 无法使用 Bootstrap 日期选择器

jquery - 客户端验证 jquery 插件不起作用

javascript - Google Analytics - 当我们使用 Universal Analytics 而其他域使用传统时如何跨域跟踪?

javascript - 设置新的下拉值时触发 jquery 事件

javascript - 更改 html 标记或其子级(而不是其属性)文本中的日期格式

Jquery UI 自动完成小部件与 jquery.menu 小部件冲突