javascript学习(1)用户的Javascript 放在哪里和函数的绑定方式

一、实验 1:js脚本放在那里最合适?
1、代码
1.1、test.html
<!DOCTYPE html>
<html>
<head>
<title>我的第一个 JavaScript 程序</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<h1>测试Javascript的位置和函数绑定方式</h1>
<div id="myDiv1">
<p>Look,I am here 1000 years!</p>
<div id="myDiv11">MyDiv11::</div>
<div id="myDiv12">MyDiv12::</div>
</div>
<button id="myBtn1">添加按钮1</button>
<button id="myBtn2" onclick="var espan=document.createElement('span');espan.innerHTML='添加方式2->';document.getElementById('myDiv12').appendChild(espan);">添加按钮2</button>
</body>
</html>
1.2、test.js
<!-- 这段js代码如果放在head部,自顶向下执行时还没有myBtn1按钮,会绑定失败!-->
<script>
var myFun1 = function(){
debugger;
var mySpan = document.createElement("span");
mySpan.innerHTML="添加方式1->";
document.getElementById("myDiv11").appendChild(mySpan);
}
var myBtn1 = document.getElementById("myBtn1");
//alert(myBtn1);
//myBtn1.onclick="myFun1()"; // 错误方式1:标签里才可以这么写一句或多句脚本,用分号隔开,一句分号可以省略
//myBtn1.onclick="myFun1();"; // 错误方式2:标签里才可以这么写一句或多句脚本,用分号隔开,一句分号可以省略
//myBtn1.onclick=myFun1(); // 错误方式3:函数会立刻执行,并将返回值赋给onclick
myBtn1.onclick=myFun1;
</script>
2、这段代码放到head里面就不能运行。为什么?
这就要说一下HTML的运行顺序了,应该确切点说不是HTML的运行顺序,是js的运行顺序。
浏览器执行HTML页面代码是自顶向下执行的,运行到<script></script>时开始执行脚本。
- 首先,浏览器将函数定义赋值给了myFun1,这时函数本身并不会运行
- 接着,浏览器试图从页面获取元素Id为myBtn1的元素,但是这时候HTML页面并没有加载完,肯定取不到id为btn的元素。
- 所以,绑定行数也会失败myBtn1.onclick=myFun1;(但是浏览器并木有报绑定失败!!!)
二、实验 2:函数的绑定时机
事件绑定方式常用有两种
- 方式一:在事件中加入js代码。如:onclick="test();"。这种绑定方式有缺点,就是你要修改美工已经写好的代码。
- 方式二:通过id绑定,参见实验一,只需要将每个元素都加上id,不需要修改HTML代码。
1、方式一:在事件中加入js代码,如:onclick="myFun1()"
我们可以在事件中写函数或脚本,脚本之间要用分号隔开。
- <button id="btn" onclick="myFun1()">按钮</button>
- <button id="btn" onclick="myFun1();">按钮</button>
- <button id="btn" onclick="var espan = document.createElement('span');espan.innerHTML='添加';document.getElementById('target').appendChild(espan);">按钮</button>
js代码每一行都有分号,分号的作用就是为了语句被混淆,也就是说onclick里面可以写js代码。
2.2、方式二:document.getElementById("btn").onclick=test;
以下是正确的方式:
document.getElementById("btn").onclick=test;
以下是错误的方式:
- myBtn1.onclick="myFun1()"; // 错误方式1:标签里才可以这么写一句或多句脚本,用分号隔开,一句分号可以省略
- myBtn1.onclick="myFun1();"; // 错误方式2:标签里才可以这么写一句或多句脚本,用分号隔开,一句分号可以省略
- myBtn1.onclick=myFun1(); // 错误方式3:函数会立刻执行,并将返回值赋给onclick
错误分析:
如果修改为document.getElementById("btn").onclick=test(); ,会导致如下问题发生:
- 赋值时就调用了函数,赋的值是函数的返回值
- 后来调用onclick触发事件时,执行的是函数返回值。
- 所以只有不加括号时,触发事件才会执行函数本身。
javascript学习(1)用户的Javascript 放在哪里和函数的绑定方式的更多相关文章
- JavaScript学习总结(十二)——JavaScript编写类
在工作中经常用到JavaScript,今天总结一下JavaScript编写类的几种写法以及这几种写法的优缺点,关于JavaScript编写类的方式,在网上看到很多,而且每个人的写法都不太一样,经常看到 ...
- 1.1(JavaScript学习笔记)、JavaScript基础
一.JavaScript简介 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型. 它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端 ...
- JavaScript 学习之第一篇JavaScript的数据类型(2016/8/29 晚 23:12)
1. JavaScript的数据类型 JavaScript 里面有6中数据类型 Boolean String Number Undefined Null Object object(对象)类型包含了数 ...
- JavaScript学习系列2一JavaScript中的变量作用域
在写这篇文章之前,再次提醒一下 JavaScript 是大小写敏感的语言 // 'test', 'Test', 'TeSt' , 'TEST' 是4个不同的变量名 JavaScript中的变量,最重要 ...
- JavaScript学习总结(二十三)——JavaScript 内存泄漏教程
参考教程:http://www.ruanyifeng.com/blog/2017/04/memory-leak.html 一.什么是内存泄漏? 程序的运行需要内存.只要程序提出要求,操作系统或者运行时 ...
- JavaScript学习笔记——1.了解JavaScript
百度百科: JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果.通常JavaScript脚本是通过嵌入在HT ...
- Javascript学习笔记2.2 Javascript与DOM选项卡(滑动门)案例详解
学习了DOM的知识,今天开始做些练习,想到了一个网页滑动门的特效,见下图: 1.通过建立索引实现 <!doctype html> <html> <head> < ...
- JavaScript学习总结(十六)——Javascript闭包(Closure)
原文地址: http://www.cnblogs.com/xdp-gacl/p/3703876.html 闭包(closure)是Javascript语言的一个难点,也是它的特色, 很多高级应用都要依 ...
- JavaScript学习总结(十四)——JavaScript编写类的扩展方法
在JavaScript中可以使用类的prototype属性来扩展类的属性和方法,在实际开发当中,当JavaScript内置的那些类所提供的动态 ...
随机推荐
- 在foxmail和outlook中设置QQ邮箱、gmail邮箱、新浪邮箱、微软邮箱、网易邮箱等的方法
怎么用邮件客户端如outlook和foxmail来设置各种邮箱 很多人平时都是在网页上面收发邮件,这个很简单,不用其他的设置,不过在客户端上设置收发邮件还是很不错的,今天就来讲讲各种邮箱在outloo ...
- 关于现在IT行业从业者一些建议
本人从事IT行业,确切的说应该是软件开发行业已经9个年头了,从刚开始小白也慢慢的已经有了自己独有的开发习惯. 近些年进入行业的人越来越多,有可能确实看到了这行业就业及薪资待遇,更多的也是随着互联网及移 ...
- python select模块详解
要理解select.select模块其实主要就是要理解它的参数, 以及其三个返回值.select()方法接收并监控3个通信列表, 第一个是所有的输入的data,就是指外部发过来的数据,第2个是监控和接 ...
- kubernetes实践之运行aspnetcore webapi微服务
1.预备工作 unbuntu 16.04 and above docker kubernetes 集群 2.使用vs2017创建一个web api应用程序,并打包镜像到本地. 3.推送本地镜像到doc ...
- 学习ASP.NET Core Razor 编程系列二——添加一个实体
在Razor页面应用程序中添加一个实体 在本篇文章中,学习添加用于管理数据库中的书籍的实体类.通过实体框架(EF Core)使用这些类来处理数据库.EF Core是一个对象关系映射(ORM)框架,它简 ...
- 使用Quartz 2D擦除图片
Quartz 2D 是一个强大的二位图像绘制引擎,在开发中如果遇到需要高度自定义的控件,我们就可能需要用Core Graphics进行绘制. 这几天一同事开发一个聊天中的一个子模块,A 画一幅图,然后 ...
- java中StringUtils中isEmpty 和isBlank的区别
StringUtils在commons-lang-2.2.jar包中:org.apache.commons.lang.StringUtils ; StringUtils方法的操作对象是java.lan ...
- Android 使用shape定义不同控件的的颜色、背景色、边框色
Android 使用shape定义不同控件的的颜色.背景色.边框色 设置按钮的右边框和底边框颜色为红色,边框大小为3dp: 在drawable新建一个 buttonstyle.xml的文件,内容如下: ...
- YCSB测试HBase远程完全分布式集群
写在前面 本文只讲一个很简单的问题,YCSB对HBase集群的测试.虽然网上有很多介绍YCSB测试HBase的文章,但都是针对本地HBase伪分布式集群的.大家都知道,稍微正式一些的压测都会要求测试客 ...
- 数据库(Mongodb)
1.MongoClient()函数 In [8]: import pymongo In [9]: con = pymongo.MongoClient('localhost') #建立连接 In [10 ...
