$(this) 在自定义 jQuery 函数中不起作用

斯蒂芬·R

我使用 moment.js 和moment-duration-format plugin制作了一个 jQuery 倒数计时器

请注意,这$('div#countdown')是在函数内部进行硬编码的。该功能按此处所示工作。但是,如果我将硬编码的引用更改为 $(this),则它不起作用。console.log($this)返回一个空对象。

我试过在函数开始时将 $(this) 设置为一个变量,以防间隔造成范围问题,但没有区别。

令人困惑的部分是我$.fn.xxx = function之前在自定义 jQuery 函数中使用过这种确切的语法,而 $(this) 在这些函数中运行良好。关于这个特定功能的某些东西正在绊倒它。

<script>
    $.fn.countdown = function ( seconds, tFormat, stopAtZero ) {
        tFormat = (typeof tFormat !== 'undefined') ? tFormat : 'hh:mm:ss';
        stopAtZero = (typeof stopAtZero !== 'undefined') ? stopAtZero : true;
        var eventTime = Date.now() + ( seconds * 1000 );
        var diffTime = eventTime - Date.now();
        var duration = moment.duration( diffTime, 'milliseconds' );
        var interval = 0;
        var counter = setInterval(function () {
            $('div#countdown').text( moment.duration( duration.asSeconds() - ++interval, 'seconds' ).format( tFormat, { trim: false }) );
            if( stopAtZero && interval >= seconds ) clearInterval( counter );
        }, 1000);
    };

    $('div#countdown').countdown( 30*60, 'mm:ss' );
</script>

<div id="countdown"></div>

编辑:已解决。功能很好。它只需要在 Div 之后(或在文档加载之后)::headdesk::

罗里·麦克罗森

问题是因为内部函数在setTimeout()与外部函数不同的范围运行。因此this不是您期望的那样。您需要缓存this引用。

另请注意,您可以通过向包含选项的函数提供对象来稍微改进逻辑。然后您可以使用$.extend来提供默认值。您还应该循环this以使用户能够提供一组对象来初始化插件。试试这个:

$.fn.countdown = function(options) {
  var defaults = {
    seconds: 0,
    tFormat: 'hh:mm:ss',
    stopAtZero: true,
    complete: function() {}
  };
  var settings = $.extend(defaults, options);

  $(this).each(function() {
    var $el = $(this);
    var eventTime = Date.now() + (settings.seconds * 1000);
    var diffTime = eventTime - Date.now();
    var duration = moment.duration(diffTime, 'milliseconds');
    var interval = 0;
    var counter = setInterval(function() {
      $el.text(moment.duration(duration.asSeconds() - ++interval, 'seconds').format(settings.tFormat, {
        trim: false
      }));
      if (settings.stopAtZero && interval >= settings.seconds) {
        clearInterval(counter);
        settings.complete();
      }
    }, 1000);
  });
}

$('div').countdown({
  seconds: 10,
  complete: function() {
    console.log('finished!');
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-duration-format/1.3.0/moment-duration-format.min.js"></script>
<div></div>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

joomla中的jQuery自定义插件不起作用

自定义jQuery函数在WordPress上不起作用,即使其他已加载的jQuery函数也在起作用

提供自定义文件名在table2excel jQuery中不起作用?

使用jQuery的自定义JavaScript代码在Angular 5(angular-cli)中不起作用

jQuery在Django自定义templatetag的模板中不起作用

$(this)在.each中的自定义函数中不起作用

自定义延迟加载函数将数据加载到容器后,jQuery函数OnClick不起作用

我的自定义函数中的for循环不起作用

setInterval中的自定义函数不起作用

jquery 滑块在 wordpress 中的可视化作曲家自定义短代码中不起作用

jQuery自定义函数-this.each

如何使自定义jQuery验证规则起作用?

jQuery中的自定义事件?

jQuery自定义事件到其他文档不起作用

使用jQuery发送自定义标头不起作用

jQuery图形,按输入的图表自定义不起作用

自定义jQuery在Wordpress Ninja Forms插件上不起作用

自定义验证方法不起作用-jQuery验证插件

使用自定义搜索的ajax jQuery UI自动完成不起作用

Jquery Ui 可调整大小的自定义处理程序不起作用

jQuery event.PreventDefault在用户定义函数中不起作用

Qualtrics API 函数在 EventListener 中调用的自定义函数中不起作用

带有mutate的自定义函数不起作用

c - shell 执行自定义函数不起作用

jQuery Mobile自定义脚本仅在多页面布局中的主法师上起作用

jquery 中的 $.post 函数不起作用

jQuery $(this)在函数参数中不起作用

Onchange函数在Jquery中不起作用

指令中的jQuery函数不起作用