为什么jQuery开/关方法的行为与外部脚本不同

时间:2015-09-26 15:01:38

标签: javascript jquery

嵌入脚本时,单击标题可在hello / goodbye之间切换。当代码在外部脚本中时,为什么它仅适用于两次单击?

嵌入式案例:

<html>    
<head>
<script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>
</head>    
<body>
<h1 id="title" onclick="sayGoodbye();"> Hello </h1>
<script type="text/javascript">
function sayGoodbye() {
console.log("goodbye");
$("#title").html("Goodbye");
$("#title").click(function() {
$("#title").html("Hello");
$("#title").off("click");
});
};
</body> 
</script>    

外部案例:

<html>
<head>
<meta charset="UTF-8">
<title>Jquery click</title>
</head>
<body>

<h1 id="title"> Hello </h1>
<script src="jquery.js"></script>
<script src="click.js"></script>
</body>
</html>

这是click.js:

function sayGoodbye() {
 console.log('goodbye');
 $('#title').html('Goodbye');
 $('#title').click(function () {
  console.log('hello');
  $('#title').html('Hello');
  $('#title').off('click');
 });
}

$(function(){$('#title').on('click', sayGoodbye);});

1 个答案:

答案 0 :(得分:2)

在第二个示例中,SELECT CONCAT("Create Table `db_new`.`", TABLE_NAME, "` LIKE `db_old`.`default` ;") as MySQLCMD FROM TABLES where TABLE_SCHEMA = 'db_old' 将取消注册两个事件处理程序。来自the docs

  

如果提供了一个简单的事件名称,例如“click”,那么该类型的所有事件(直接和委派)都将从jQuery集中的元素中删除。

在你的第一个例子中,这不是问题,因为你自己内联第一个处理程序,而不是通过jQuery的API。

对这种情况更简洁的解决方案是简单地连接单个处理程序并维护/切换其状态:

.off

在事件中(没有双关语)你需要只为一次调用挂钩一个事件处理程序,不要忘记one也存在。