$(document).ready() 中的代码未准备好

code inside $(document).ready() isnt ready

搜索了几个小时后感觉很糟糕 尝试在呈现的 Mustache 模板上重构我的一个旧模块 就像

<section id="slideShow">
    <script id="slideShow-template" type="text/template">
        <ul>
            {{#slideShow}}
            <li class="{{{class}}}">
                <img src="{{{img}}}" alt="{{{title}}}">
                <a href="{{{link}}}">
                    <h1 class="slideShowTitle">{{title}}</h1>
                    <p class="slideShowDate">{{date}}</p>
                    <p class="slideShowDetail">{{detail}}</p>
                </a>
            </li>
            {{/slideShow}}
        </ul>
        <nav>
            {{#slideShow}}
                <a href="javascript:;"></a>
            {{/slideShow}}
        </nav>
        <a href="javscript:void(0)" class="prevSlide"></a>
        <a href="javscript:void(0)" class="nextSlide"></a>

    </script>
</section>

和 js

(function() {

        var slideShow = {
            slideShow: [
                ...some data...
            ],

            init: function() {
                this.cacheDom();
                this.initPosition();
                this.bindEvents();
                this.render();
            },

            bindEvents: function() {
                this.$el.on('click', '.nextSlide', this.nextSlide.bind(this))
            },

            render: function() {
                var data = {
                    slideShow: this.slideShow
                };
                this.$el.html(Mustache.render(this.template, data));
            },

            cacheDom: function() {
                this.$el = $('#slideShow');
                this.$ul = this.$el.find('ul');
                this.$li = this.$ul.find('li');
                this.$nav = this.$el.find('nav');
                this.$a = this.$nav.find('a');
                this.$next = this.$el.find('.nextSlide');
                this.$prev = this.$el.find('.prevSlide');
                this.template = $('#slideShow-template').html();

            },

            initPosition: function() {
                 this.$ul.css('left', '0');
            },

            nextSlide: function() {
                alert('test OK');
            }

        };

        slideShow.init();

    })();

问题是 initPosition() 函数没有为动态元素提供 CSS 样式,我什至将整个代码包装在 $(document).ready() 中,但它仍然没有工作 我试图编写这个模块化和干净的代码,更喜欢控制模块内部而不是外部的行为,有没有办法在一行代码或函数中实现这一点,除 setTimeout 之外的所有内容?

我试过

this.$el.on('ready', 'ul', somefunc(){....})

大部分 我想知道专业人士在这种情况下会做什么,他们如何保持分离并仅在一个功能和范围内保持他们的 DOM 引用,是否有类似的中间功能或...

我不知道 请让我知道我遗漏了什么谢谢

已在聊天中回答:

问题是您的 init 函数将渲染留到最后,但它之前的方法都希望元素在那里。 初始化函数的正确顺序是:

init: function() {
  this.render();
  this.cacheDom();
  this.initPosition();
  this.bindEvents();
},

这样,当 cacheDom 运行所有 this.$el.find 调用时,实际上会找到元素。