我有以下代码 -
$(function(){
$('#testbutton').click(function(){
var checkedValue = $('[name="someRadioGroup"]:radio:checked').val();
$('#result').html('The radio element with value <tt>' + checkedValue + '</tt> is checked');
});
});
我理解$('#testbutton')使用id testbutton获取HTML元素并为其分配一个事件处理程序。
但我不明白为什么我需要将该代码放在函数文字中?
如果我删除$(function(){
(以及相应的});
),则无效。
但是,其他代码可以在不包含在函数文字中的情况下工作。示例 -
alert('Hi there')
有什么区别?为什么警报工作但事件赋值语句没有?
答案 0 :(得分:6)
$(function(){...});
是$(document).ready(function(){...});
的简写。它的目的是在您打算使用的元素存在于DOM中之前不运行代码(通常在文档准备好之后)。
答案 1 :(得分:2)
这不是必需的。
您将代码放在DOM准备就绪时调用的事件处理程序中。
如果您没有将代码放在DOM就绪处理程序中,并且您的代码执行DOM选择,则需要找到其他方法来确保DOM在运行之前就绪。
如果您的代码没有执行DOM选择,则不需要它。这就是你的alert()
有效的原因,因为它不需要获取任何元素。
另一种选择就是这样。
<body>
<button id="testbutton">click</button>
<div id="result"></div>
<script type="text/javascript" src="/your/script.js"></script>
</body>
这会将您的代码置于页面上的所有元素下方,因此在代码运行时它们肯定可用。
另一种方法是使用window.onload
处理程序。
window.onload = function() {
// your code
};
或使用jQuery。
$(window).on("load", function() {
// your code
});
这类似于DOM就绪处理程序,除了它等待加载所有资源(如图像)。
答案 2 :(得分:0)
在最基本的层面上,(function(){...})()
形式的东西是一个立即执行的函数文字。这意味着您已经定义了一个函数,并且您正在立即调用它。
此表单对于信息隐藏和封装非常有用,因为您在该函数中定义的任何内容都保留在该函数的本地,并且无法从外部世界访问(除非您专门公开它 - 通常通过返回的对象文字)。
这个基本形式的变体就是你在jQuery插件中看到的(或者通常在这个模块模式中)。由于您要定义函数文字,除非您明确传入信息,否则它无法访问来自外部世界的任何内容。因此:
(function($) {
...
})(jQuery);
这意味着你传递了对实际jQuery对象的引用,但它在函数文字范围内被称为$。