在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
)是不必要的。所以如果你控制script
標籤去的地方,那是一個選擇。
因此,例如:。這只是正常]
<!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>
(https://jsfiddle.net/8ezcgpe2/)請更新與[MCVE]這個問題的,最好一個問題**可以使用Stack Snippets('[<>]'工具欄按鈕)運行一個**)。 –
也許這個text.js在加載ID = addText的元素之前加載 –
@JaromandaX但在我的index.html中我有$(function(){}())作爲封裝來包裝Text.init() –