我有一个文件调用text.js,它有
var Text = function(canvas){
var textField = $('#textField'),
addTextButton = $('#addText');
var init = function(){
addTextButton.click(function(){
alert('won"t work?')
});
},
resetTextField = function(){
// it work if I put the selector here like var textField = $('#textField'),
textField.val(''); // won't work
};
return{
init:init
}
}();
它包含在我的index.html中。我在那里做初始化
$(function(){
Text.init();
}());
问题是甚至不能被解雇。我想我搞砸了。
最佳答案
Text
中的代码将立即运行,并返回带有init
的对象。如果您在查找元素之前运行该代码,例如:
<!doctype html>
<html>
<head>
<!-- ... --->
<script src="text.js"></script><!-- Problem here -->
<script>
$(function(){
Text.init();
}());
</script>
</head>
<body>
<!-- ... --->
<input id="textField"><input id="addText" type="button" value="Add">
<!-- ... -->
</body>
</html>
...您最终将在
textField
和addTextButton
中使用空的jQuery对象。另外,您还要运行试图立即传递
ready
的函数(然后将undefined
传递给ready
),问题出在这里: $(function(){
Text.init();
}());
// ^^---------- problem
您不想要那些
()
。您要将函数传递到ready
中:$(function(){
Text.init();
}); // <== Note no ()
如果要使用
init
方法,最好将所有初始化都放在其中,而不要放在两个地方:var Text = function(canvas){
var textField, addTextButton;
var init = function(){
textField = $('#textField');
addTextButton = $('#addText');
addTextButton.click(function(){
alert('won"t work?')
});
},
resetTextField = function(){
// it work if I put the selector here like var textField = $('#textField'),
textField.val(''); // won't work
};
return{
init:init
}
}();
但是请注意,如果遵循usual best practice将脚本放在文档末尾的位置,就在结束
</body>
标记之前,上面定义的元素将存在并且可用,这将使使用(和ready
)是不必要的。因此,如果您控制init
标记的位置,则可以选择。因此,例如:
<!doctype html>
<html>
<head>
<!-- ... --->
</head>
<body>
<!-- ... -->
<input id="textField"><input id="addText" type="button" value="Add">
<!-- ... -->
<script src="text.js"></script>
<script>
$(function(){
Text.init();
});
</script>
</body>
</html>
关于javascript - 显示模块模式和jQuery失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41459938/