Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
进一步了解javascript初始化函数设置_Javascript - Fatal编程技术网

进一步了解javascript初始化函数设置

进一步了解javascript初始化函数设置,javascript,Javascript,因此,我有一个从以前的开发人员那里继承来的大JS文件,我正试图了解一些主要部分。以下是完整的代码: $(function () { var homepage = (function () { var startNewsTicker = function () { var news = $('#newsSlider div'), idx = 0, isHovered = false

因此,我有一个从以前的开发人员那里继承来的大JS文件,我正试图了解一些主要部分。以下是完整的代码:

$(function () {

    var homepage = (function () {

        var startNewsTicker = function () {

            var news = $('#newsSlider div'),
                idx = 0,
                isHovered = false,
                TIMEOUT = 6000;

            news.mouseenter(function () {
                isHovered = true;
            });

            news.mouseleave(function () {
                isHovered = false;
            });

            setInterval(function () {
                if (!isHovered) {
                    news.eq(idx).fadeOut(500);
                    idx = (idx + 1 <= news.length - 1) ? idx + 1 : 0;
                    news.eq(idx).fadeIn(500);
                }
            }, TIMEOUT);
            news.eq(idx).fadeIn(500);
        };

        var slides = {
                wrapper: $('#slideWrapper'),
                slide: $('#slideWrapper li'),
                imageWrapper: {},
                image: {},
                paginatorWrapper: {},
                paginator: {},
                prev: -1,
                next: -1,
                arrows: {
                    left: $('#arwLeft'),
                    right: $('#arwRight')
                }
            },
            centerSlideWrapper = function () {
                slides.wrapper.css({
                    marginTop: ((window.innerHeight - slides.wrapper.height()) / 2) + 'px',
                    opacity: 1
                });
            },
            buildSlider = function () {
                slides.prev = slides.length - 1;
                slides.next = 1;
                slides.wrapper.before('<div id="homepageBackgroundImages" />').after('<div id="homepagePagination" />');
                slides.imageWrapper = $('#homepageBackgroundImages');
                slides.paginatorWrapper = $('#homepagePagination');
                slides.paginatorWrapper.css('width', 36 * slides.slide.length + 'px')
                slides.slide.each(function () {
                    var $t = $(this);
                    slides.imageWrapper.append('<div><img src="' + $t.attr('data-img') + '" /></div>');
                    slides.paginatorWrapper.append('<a href="#"><span>' + $t.attr('data-tagline') + '</span></a>');
                });
                slides.image = slides.imageWrapper.find('div');
                slides.image.find('img').fullscreenBackground();
                slides.paginator = slides.paginatorWrapper.find('a');
                slides.imageWrapper.prepend('<div class="mask"></div>');

                //create offset margin left to auto center spans
                slides.paginator.find('span').each(function () {
                    var $t = $(this);
                    $t.css({
                        top: "-9999px",
                        display: "block"
                    });
                    $t.css({
                        marginLeft: -(($t.width() + parseFloat($t.css('paddingLeft')) + parseFloat($t.css('paddingRight'))) / 2) + 2 + 'px',
                        display: "none",
                        top: "-56px"
                    })
                });

            },
            startSlider = function () {
                var slideIdx = -1,
                    currentSlide,
                    isHovered = false,
                    interval = {
                        delay: 8000,
                        timer: {},
                        start: function () {
                            interval.timer = setInterval(function () {
                                if(!isHovered)
                                    switchSlide(slideIdx + 1);
                            }, interval.delay);
                        },
                        stop: function () {
                            clearInterval(interval.timer);
                        }
                    },
                    switchSlide = function (idx) {
                        if (slideIdx > -1) {
                            slides.image.eq(slideIdx).stop(true, true).fadeOut(500);
                            slides.slide.eq(slideIdx).stop(true, true).fadeOut(500);

                        }
                        idx = (idx <= slides.slide.length - 1) ? idx : 0;
                        slides.image.eq(idx).stop(true, true).fadeIn(500);
                        slides.slide.eq(idx).stop(true, true).fadeIn(500);
                        slideIdx = idx;
                        slides.paginator.removeClass('current').eq(idx).addClass('current');
                        slides.prev = (slideIdx - 1 >= 0) ? slideIdx - 1 : slides.slide.length-1;
                        slides.next = (slideIdx + 1 <= slides.slide.length - 1) ? slideIdx + 1 : 0;
                        slides.arrows.left.find('span').text(slides.slide.eq(slides.prev).attr('data-tagline'));
                        slides.arrows.right.find('span').text(slides.slide.eq(slides.next).attr('data-tagline'));
                    }

                slides.paginator.click(function (e) {
                    e.preventDefault();
                    interval.stop();
                    switchSlide($(this).index());
                    interval.start();
                });

                slides.arrows.left.click(function (e) {
                    e.preventDefault();
                    interval.stop();
                    switchSlide(slides.prev);
                    interval.start();
                });

                slides.arrows.right.click(function (e) {
                    e.preventDefault();
                    interval.stop();
                    switchSlide(slides.next);
                    interval.start();
                });

                slides.arrows.left.mouseenter(function (e) {
                    e.preventDefault();
                    isHovered = true;
                });
                slides.arrows.right.mouseenter(function (e) {
                    e.preventDefault();
                    isHovered = true;
                });

                slides.arrows.left.mouseleave(function (e) {
                    e.preventDefault();
                    isHovered = false;
                });

                slides.arrows.right.mouseleave(function (e) {
                    e.preventDefault();
                    isHovered = false;
                });

                slides.slide.find('strong').mouseenter(function () {
                    isHovered = true;
                });

                slides.slide.find('strong').mouseleave(function () {
                    isHovered = false;
                });

                switchSlide(0);
                interval.start();
            }

        return {
            init: function () {
                centerSlideWrapper();
                $(window).resize(function () {
                    centerSlideWrapper();
                });
                buildSlider();
                startSlider();
                startNewsTicker();
            }
        }

    })();
    homepage.init();
});
我感到困惑的是:

1) 为什么以这种方式创建
主页
功能会有好处

2) 另外,我不明白函数是如何返回一个包含另一个JS函数的对象的
init
,然后使用
homepage.init()运行的。这是不是
homepage.init()
call调用
homepage
init
函数来运行吗

谢谢你的帮助

1) 为什么以这种方式创建这个主页功能会有好处呢

它通常被称为“显示模块模式”,通常用于创建只能使用“公共”属性/方法(封装)访问的私有静态成员

有关此模式的更多信息,请参阅:

或者:Google/Bing/Yahoo“显示模块模式”

2) 另外,我不明白函数是如何返回一个包含另一个JS函数init的对象,然后使用homepage.init()运行该对象的;。不支持这个homepage.init();调用调用homepage和init函数来运行

是的,它调用
homepage
对象引用的
init
方法

1) 为什么以这种方式创建这个主页功能会有好处呢

它通常被称为“显示模块模式”,通常用于创建只能使用“公共”属性/方法(封装)访问的私有静态成员

有关此模式的更多信息,请参阅:

或者:Google/Bing/Yahoo“显示模块模式”

2) 另外,我不明白函数是如何返回一个包含另一个JS函数init的对象,然后使用homepage.init()运行该对象的;。不支持这个homepage.init();调用调用homepage和init函数来运行


是的,它调用
homepage
对象引用的
init
方法。

在javascript中,类是通过函数创建的。所以这段代码创建了一个匿名函数并调用它,立即将其值返回到主页。返回到主页的是一个带有一个属性的函数/对象——在本例中是
init
函数

然后使用对象
主页
访问
init
功能


为什么要这样做?它从全局范围中隐藏了示例中的所有内容。但是当调用
homepage.init()
时,
init
函数仍然可以访问它们。为什么?因为它们与
init
函数在同一个范围内(在本例中是一个更高的范围)。所以你可以调用
homepage.int()但不能调用
homepage.startSlider()

在javascript中,类是通过函数创建的。所以这段代码创建了一个匿名函数并调用它,立即将其值返回到主页。返回到主页的是一个带有一个属性的函数/对象——在本例中是
init
函数

然后使用对象
主页
访问
init
功能


为什么要这样做?它从全局范围中隐藏了示例中的所有内容。但是当调用
homepage.init()
时,
init
函数仍然可以访问它们。为什么?因为它们与
init
函数在同一个范围内(在本例中是一个更高的范围)。所以你可以调用
homepage.int()但是你不能调用
homepage.startSlider()
例如。

信息量很大!谢谢你的信息!我一定会研究这个模块模式。非常有用!谢谢你的信息!我一定会研究这个模块模式。非常感谢你提供的信息!您描述此信息的叙述方式非常有用!非常感谢你提供的信息!您描述此信息的叙述方式非常有用!
var homepage = (function () {

...

    return {
        init: function () {
            centerSlideWrapper();
            $(window).resize(function () {
                centerSlideWrapper();
            });
            buildSlider();
            startSlider();
            startNewsTicker();
        }
    }
})();
homepage.init();