我有这段HTML代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Backbone.js Demos</title>
</head>
<body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
<script src="http://ajax.cdnjs.com/ajax/libs/json2/20110223/json2.js"></script>
<script src="http://ajax.cdnjs.com/ajax/libs/underscore.js/1.1.6/underscore-min.js"></script>
<script src="http://ajax.cdnjs.com/ajax/libs/backbone.js/0.3.3/backbone-min.js"></script>
<script src="app.js"></script>
<script type="x-tmpl" id="list_tmpl">
<span><%= part1 %><%= part2 %></span>
<a href="#swappy" class='swap'>[SWAP]</a>
<span> </span>
<a href="#del" class='remove'>[DELETE]</a>
</body>
</html>
当脚本标记位于body
标记之间时,我的脚本正常运行。但是,如果我将所有脚本标记移动到head
,它们就会停止工作。我很困惑为什么。这种行为有什么理由吗?谢谢大家的时间和帮助!
编辑:APP
(function($){
Backbone.sync = function (method, model, success, error){
success();
};
var Item = Backbone.Model.extend({
defaults: {
part1: 'Hello',
part2: 'World'
}
});
var ItemList = Backbone.Collection.extend({
model: Item
});
var ItemView = Backbone.View.extend({
tagName: 'li',
events: {
'click .swap': 'swap',
'click .remove': 'remove'
},
initialize: function(){
_.bindAll(this, 'render', 'unrender', 'swap', 'remove');
this.model.bind('change', this.render);
this.model.bind('remove', this.unrender);
},
render: function(){
$(this.el).html(_.template($('#list_tmpl').html(), this.model.toJSON()));
return this;
},
unrender: function(){
$(this.el).remove();
},
swap: function(){
var swapped = {
part1: this.model.get('part2'),
part2: this.model.get('part1')
};
this.model.set(swapped);
},
remove: function(){
this.model.destroy();
}
});
var AppView = Backbone.View.extend({
el: $('body'),
events: {
'click #add': 'addItem'
},
initialize: function (){
this.counter = 0;
_.bindAll(this, 'render', 'addItem', 'appendItem');
this.collection = new ItemList();
this.collection.bind('add', this.appendItem);
this.render();
},
render: function(){
$(this.el).append("<button id='add'>Add Item</button>");
$(this.el).append("<ul id='todoList'/>");
},
addItem: function(){
this.counter++;
var item = new Item();
item.set({
part2: item.get('part2') + this.counter
});
this.collection.add(item);
},
appendItem: function(item){
var itemView = new ItemView({
model: item
});
$('#todoList', this.el).append(itemView.render().el);
}
});
var Tasker = new AppView();
})(jQuery);
答案 0 :(得分:4)
解决此问题的最简单方法是使用
启动app.js$(function() {
而不是
(function($){
比jQuery在DOM可用后执行脚本。你可以把脚本留在头脑中。
答案 1 :(得分:3)
当js文件加载后使用正文时会发生此行为,因此它们必须嵌入正文中。
你可以将jquery,json和underscore文件放在头脑中。
其他文件,您必须检查他们在加载时是否不打电话。
答案 2 :(得分:1)
您必须在Body的末尾添加app.js,因为它正在使用页面中元素的属性。
使用此标记。始终关闭脚本标记。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Backbone.js Demos</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
<script src="http://ajax.cdnjs.com/ajax/libs/json2/20110223/json2.js"></script>
<script src="http://ajax.cdnjs.com/ajax/libs/underscore.js/1.1.6/underscore-min.js"></script>
<script src="http://ajax.cdnjs.com/ajax/libs/backbone.js/0.3.3/backbone-min.js"></script>
</head>
<body>
<script type="x-tmpl" id="list_tmpl">
<span><%= part1 %><%= part2 %></span>
<a href="#swappy" class='swap'>[SWAP]</a>
<span> </span>
<a href="#del" class='remove'>[DELETE]</a>
</script>
<script src="app.js"></script>
</body>
</html>