$(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
调用时,实际上会找到元素。
搜索了几个小时后感觉很糟糕 尝试在呈现的 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
调用时,实际上会找到元素。