javascript - 试图重构这个 Javascript 并且失败了

标签 javascript html css

我正在开发一个网站,部分内容将是一个实时的“出发板”自动收报机,如下所示:

departures board

我在 C# 方面非常有经验,但对 Javascript 完全没有经验。

我发现以下 Javascript on SO 几乎可以满足我的要求:

<script type="text/javascript">

    $.fn.ticker = function (options) {

        options = $.extend({
            speed: 30
        }, options);

        var alph = 'ABCDEFGHIJKLMNOPQRSTUVXYZ01234567890,.:+=/();!- ';

        return this.each(function () {
            var k = 1,
            elems = $(this).children(),
            arr = alph.split(''),
            len = 0,
            fill = function (a) {
                while (a.length < len) {
                    a.push(' ');
                }
                return a;
            },
            texts = $.map(elems, function (elem) {
                var text = $(elem).text();
                len = Math.max(len, text.length);
                return text.toUpperCase();
            }),
            target = $('<div>'),
            render = function (print) {
                target.data('prev', print.join(''));
                fill(print);
                print = $.map(print, function (p) {
                    return p == ' ' ? '&#160;' : p;
                });
                return target.html('<span>' + print.join('</span><span>') + '</span>');
            },
            attr = {}

            $.each(this.attributes, function (i, item) {
                target.attr(item.name, item.value);
            });

            $(this).replaceWith(render(texts[0].split('')));

            target.click(function (e) {

                var next = fill(texts[k].split('')),
                prev = fill(target.data('prev').split('')),
                print = prev;

                $.each(next, function (i) {
                    if (next[i] == prev[i]) {
                        return;
                    }
                    var index = alph.indexOf(prev[i]),
                    j = 0,
                    tid = window.setInterval(function () {
                        if (next[i] != arr[index]) {
                            index = index == alph.length - 1 ? 0 : index + 1;
                        } else {
                            window.clearInterval(tid);
                        }
                        print[i] = alph[index];
                        render(print);
                    }, options.speed)
                });
                k = k == texts.length - 1 ? 0 : k + 1;
            });
        });
    };


    // Assign functions
    $('#mainfeatureslist').ticker();

    // Click it now
    $('#mainfeatureslist').click();


</script>

...结合必要的 JQuery 包含和适当的 HTML:

<div id="mainfeatureslistcontainer">
<ul id="mainfeatureslist">
<li>Live bus arrivals</li>
<li>Another feature here</li>
<li>Name of third feature</li>
</ul>
</div>

此代码生成一个列表,当单击该列表时,它会转换到下一个列表项。

但是,我希望列表以设定的时间间隔自动转换,无需点击。

我试过一个简单的软糖,即

setInterval($('#mainfeatureslist').click(), 6000);

...但是出于某种原因,这似乎使它感到困惑;它会中断进程并“跳转”到一个元素,然后什么也不会发生。

尽管对代码的作用有一个合理的想法,但我完全不知道如何重构它来做我想做的事!生成它自己的 .click 方法似乎是天生的 - 事实上,它是一段非常出色和紧凑的代码。

我如何将其重构为每 5 秒“翻转”一次列表?

最佳答案

setInterval expects a function - 现在你正在传递一些函数调用的返回值(在本例中是一个 jQuery 对象)。使用包含您要执行的代码的匿名函数:

setInterval(function() {
    $('#mainfeatureslist').click();
}, 6000);

关于javascript - 试图重构这个 Javascript 并且失败了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11164401/

相关文章:

javascript - 在 HTMLElement.dataset 更新时更新伪元素内容属性

javascript - CSS 在 Firefox 中不工作(或 HTML 显示为简单文本)

javascript - 为什么 javascript this.style[property] 返回一个空字符串?

javascript - Angular Js 中的过滤器

html - 通过属性 mixin jade 的内联样式

javascript - 使用 javascript 更改页面上的 CSS?

css - 我怎样才能停止 prepos 来创建除 main.scss 之外的某些已编译的 scss

javascript - 尝试在 ReactJs 中捕获 API 数据时未捕获( promise 中)TypeError : Cannot read property of undefined,

javascript - 在与原始 channel 相同的位置制作克隆 channel

html - PhpStorm 新行增加空间