首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当我使用jQuery向html中的对象添加事件处理程序时,是否必须调用$.ready(function(){ . })?

当我使用jQuery向html中的对象添加事件处理程序时,是否必须调用$.ready(function(){ . })?
EN

Stack Overflow用户
提问于 2011-12-07 15:12:50
回答 4查看 202关注 0票数 3

我正在构建一个使用jQuery分配事件处理程序的页面。现在,我将onclick事件分配给函数,但是页面是运行脚本,然后构造HTML,还是页面构造HTML,然后运行脚本?

代码语言:javascript
运行
复制
<script type="text/javascript">
    function opinionbyid(popinionid){
        $.post("index.php", {"opinionid":popinionid}, function(data){
            var data2 = JSON.parse(data);
            $(".opinion").html(data2.opinion);
            $(".note").html(data2.note);
        }, "json");
    }
    function loginform() { $(".middle").html($(".loginform").html()); }
    function registerform() { $(".middle").html($(".registerform").html()); }
    function opinionpostform() {};
    $("#loginbutton").click(function(){
        //UNSURE, MAYBE I SHOULD DO IT IN $.ready(function(){ HERE }))
    });
</script>

喜欢

代码语言:javascript
运行
复制
$.ready(function(){ 
    $("#loginbutton").click(function(){
        // code...
    });
})

到目前为止,我习惯于在头部分使用脚本标记。这就是我认为应该使用$.ready()的原因,因为在jquery的文档示例中,将处理程序分配给obect是在加载对象之后完成的。

代码语言:javascript
运行
复制
<!DOCTYPE html>
<html>
<head>
  <style>
  p { color:red; margin:5px; cursor:pointer; }
  p.hilite { background:yellow; }
  </style>
  <script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
  <p>First Paragraph</p>
  <p>Second Paragraph</p>
  <p>Yet one more Paragraph</p>
<script>
    $("p").click(function () { 
      $(this).slideUp(); 
    });
    $("p").hover(function () {
      $(this).addClass("hilite");
    }, function () {
      $(this).removeClass("hilite");
    });
</script>

</body>
</html>

解决方案编辑之后:最后,我想“我为什么要用脚本来处理这些事件呢?”现在我用

代码语言:javascript
运行
复制
onClick="dosomething()"

关于按钮属性。没必要让事情复杂化。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-12-07 15:18:30

HTML页面是自上而下解析的。解析JS会阻止HTML的解析,直到JS被执行为止:

代码语言:javascript
运行
复制
<div id="foo">Foo</div>
<script>
  $('#foo').click(..) //will work because #foo exists in the dom already
  $('#bar').click(..) //wont work because #bar doesn't exist in the dom yet
</script>
<div id="bar">Bar</div>

如果您在</body>之前附加脚本,那么您就不需要等待document.ready了,因为实际上您已经在那里了。

如果要在<head>中附加脚本,则需要等待document.ready,因为在执行代码时不会解析任何DOM。

如果您正在编写模块化代码,并且不确定它将被添加到哪里,那么在绑定之前等待document.ready,这样无论脚本在哪里添加,它都是安全的。

如果您正在处理动态内容,或者根本不想添加document.ready处理程序,则可以使用live (在1.7岁时已不再推荐)或使用on

代码语言:javascript
运行
复制
//pre 1.7
$('#foo').live('click', ...);
$('#bar').live('click', ...);

//post 1.7
$(document).on('click', '#foo', ...);
$(document).on('click', '#bar', ...);

此格式将将事件侦听器委托给执行时确实存在的document对象。jQuery将在幕后处理上下文,以执行第二个参数中提供的选择器上下文中的所有内容。

另外,如果您计划将代码与其他库一起重用,请确保在使用之前将jQuery化名为$document.ready混叠快捷方式是最好的方法之一:

代码语言:javascript
运行
复制
jQuery(function ($) {
  //document.ready
});

或者,使用自动执行的闭包:

代码语言:javascript
运行
复制
(function ($) {
  //code here
}(jQuery));
票数 6
EN

Stack Overflow用户

发布于 2011-12-07 15:15:06

$("#loginbutton").click()必须在$.ready(function(){})

代码语言:javascript
运行
复制
$(function() {
     $("#loginbutton").click(/*body*/)
})
票数 0
EN

Stack Overflow用户

发布于 2011-12-07 15:17:30

在解析时,脚本标记一旦被封住,脚本就会运行,因此它取决于脚本标记的位置。

如果您将脚本放在<head>部分,它将在解析和构造主体之前运行,因此您不得不使用$.ready来包装您的DOM访问。

代码语言:javascript
运行
复制
<html>
<head>
   <script> /* div foo is not created yet, must use $ready*/ </script>
</head><body>
   <div id="foo"></div>
</body>
</html>

另一方面,如果您将脚本放置在正文的末尾,则相关的div将已经创建。

代码语言:javascript
运行
复制
<html>
<head>
</head><body>
   <div id="foo"></div>
   <script> /* div foo already exists at this point*/ </script>
</body>
</html>

在任何情况下,为了一致性和额外的安全性,将DOM处理包装在$.ready中通常是一种很好的做法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8417593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档