05-JavaScript基础[Python]

一、javascript组成

JavaScript由三部分组成:
1. 核心(ECMAScript)
2. 浏览器对象模型(BOM)
3. 文档对象模型(DOM)

ECMAScript:是一种由ECMA国际(前身为欧洲计算机制造商协会,英文名称是European Computer Manufacturers Association)通过ECMA-262标准化的脚本程序设计语言。ECMAScript 定义的只是这门语言的基础,他的组成部分有:语法、类型、语句、关键字、保留字、操作符、对象等

BOM: Browse Object Model, 浏览器对象模型,提供与浏览器交互的方法和接口(API ), 开发人员使用BOM可以控制浏览器显示页面以外的部分.

DOM: Document Object Model, 文档对象模型,提供访问和操作网页HTML内容的方法和接口

二、BOM

  • window对象
    BOM的核心是window对象(全局),window对象的方法:
    alert(text): 弹出提示框(警告框)
    confirm(): 创建一个需要用户确认的对话框
    open(url,[options]) : 打开一个新窗口并返回新 window 对象(默认新建,_self当前窗口; 调用window对象close方法即关闭窗口)

  • location对象
    location.href = 'http://www.baidu.com' //跳转到指定的URL
    location.assign('http://www.baidu.com'); //跳转到指定的URL
    location.reload(); //最有效的重新加载,有缓存加载

三、DOM

  • DOM的概念
    DOM就是Document Object Model(文档对象模型)的缩写,DOM 是 W3C(万维网联盟)的标准。
    DOM是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。

HTML(页面结构) CSS(页面样式) JavaScript(页面行为操作)

  • 节点树
    加载HTML页面时,web浏览器生成一个树形结构,用来表示页面内部结构。DOM将这种树形结构理解为由节点组成:


    节点树

上图树形结构,html标签,没有父辈,没有兄弟,所以html标签为根标签。head标签是html的子标签,meta和title标签是兄弟关系。如果把每个标签当作一个节点,那么这些节点组合成的就是节点树。

  • 节点种类
    元素节点、文本节点、属性节点;
  <div id="box">测试Div</div>
  元素节点: div
  属性节点: id="box"
  文本节点: 测试Div
  • 元素节点对象的获取方式
- getElementById(): 获取特定ID元素的节点对象(返回一个对象)
- getElementByClassName():  获取指定类名的元素节点列表(返回一个数组)
- getElementsByTagName():  获取指定标签名的节点列表(返回一个数组)
- getElementsByName():  获取相同name属性值的节点列表(返回一个数组)

错误提醒: 如果id值存在, 但是返回null,则是执行顺序的问题!
  解决方式一: 把<script>标签(JS代码)移到html结构后面;
  解决方式二: 使用onload事件来处理, onload事件会在html加载完毕后再调用。 
   window.onload=function() {      
       document.getElementById('box');  //id具有唯一性
   };
  • 元素节点的属性
    tagName: 元素节点对象所指向的标签名称
    innerHTML: 元素节点中的内容
    className: 元素节点的class属性值
    style: css内联样式对象
    children: 某元素的所有子元素节点
    parentNode: 某元素的父节点
    value: 输入框的内容

练习: 实现一个个人信息页面 姓名 年龄 学历 专业, 可以获取到输入的信息, 点击保存按钮以后, 输出信息(信息显示形式: 姓名:张三,年龄:33,学历:本科,专业:计算机)

  • DOM节点操作
    DOM节点操作指的是: 创建节点、复制节点、插入节点、删除节点和替换节点等。
- createElement(); 创建一个元素节点
  var op1 = document.createElement('p')
- appendChild(); 添加一个新子节点到子节点的末尾
  box.appendChild(op1)
- createTextNode(); 创建一个文本节点
  var txt = document.createTextNode('哈哈')
- insertBefore(); 将新节点插入到某节点前面
  box.insertBefore(div3, div1) // 将div3加入到div1的前面
- replaceChild(); 将新节点替换旧节点
  box.replaceChild(op, div1)  // 将div1替换为op
- cloneNode(true); 复制节点
  div1.appendChild(div1.cloneNode(true))
- removeChild(); 移除节点
  box.removeChild(op1)
  • this对象
    this是javascript的一个关键字。随着函数使用场合不同,this的值会发生变化。但是总有一个原则,谁调用即指向谁(this指的是调用函数的那个对象)。
var box = document.getElementById('box');  
box.onclick = function() { 
      console.log(this);  // this表示box对象 
};

// 通过for循环添加事件, 使用this
var aInput = document.getElementsByTagName('input');
for (var i=0; i<aInput.length; i++) { 
        aInput[i].onclick = function() { 
                console.log(this.value);  //这里的this表示被点击的那个input元素节点对象 
        };
}
  • 练习: 动态表格的创建, 在输入框中输入内容后,点击保存则在表格末尾添加一条记录, 点击删除则会删除对应行的记录


    练习.png

四、事件

  • 鼠标事件
# 鼠标事件,页面所有元素都可触发鼠标事件;

click: 当单击鼠标按钮并在松开时触发
oBox.onclick = function() {
        console.log('单击了鼠标'); 
};

dblclick: 当双击鼠标按钮时触发。
oBox.ondblclick = function() {
        console.log('双击了鼠标'); 
};

mousedown:当按下了鼠标还未松开时触发。 
oBox.onmousedown = function() {
        console.log('按下鼠标'); 
};

mouseup: 释放鼠标按钮时触发。 
oBox.onmouseup = function() {
        console.log('松开了鼠标'); 
};

mousemove:当鼠标指针在某个元素上移动时触发。
oBox.onmousemove = function() {
        console.log('鼠标移动了'); 
};  

mouseenter/mouseover:当鼠标移入某个元素的那一刻触发。
oBox.onmouseenter = function() {
        console.log('鼠标移入了'); 
}; 

mouseleave/mouseout:当鼠标刚移出某个元素的那一刻触发。 
oBox.onmouseleave = function() {
        console.log('鼠标移出了'); 
};
  • 键盘事件
#  键盘事件,在键盘上按下键时触发的事件(一般由window对象或者document对象调用)

keydown:当用户按下键盘上某个键触发,如果按住不放,会重复触发。
window.onkeydown = function() {
        console.log(按下了键盘上的某个键); 
};

keypress:当用户按下键盘上的字符键触发,如果按住不放,会重复触发
window.onkeypress = function() { 
        console.log('按下了键盘上的字符键'); 
};

keyup:当用户释放键盘上的某个键触发。
window.onkeyup = function() {
        console.log('松开键盘上的某个键'); 
};

ev.keyCode 键码

  • HTML事件
# HTML事件,跟HTML页面相关的事件; 

load:当页面完全加载后触发
window.onload = function() { 
        console.log('页面已经加载完毕'); 
};

unload:当页面完全卸载后触发
window.onunload = function() { 
        console.log('页面已经卸载完毕'); 
};

select:当用户选择文本框(input 或 textarea)中的内容触发。 
input.onselect = function() { 
        console.log('选择了文本框中的内容'); 
};

change:当文本框(input 或 textarea)内容改变且失去焦点后触发。 
input.onchange = function() { 
        console.log('文本框中内容改变了'); 
};

focus:当页面或者元素获得焦点时触发。 
input.onfocus = function() { 
        console.log('文本框获得焦点'); 
};

blur:当页面或元素失去焦点时触发。
input.onblur = function() { 
        console.log('文本框失去焦点'); 
};

submit:当用户点击提交按钮在<form>元素节点上触发。
form.onsubmit = function() { 
        console.log('提交form表单');  
};

reset:当用户点击重置按钮在<form>元素节点上触发。 
form.onreset = function() { 
        console.log('重置form表单'); 
};

scroll:当用户滚动带滚动条的元素时触发。
window.onscroll= function() { 
        console.log('滚动了滚动条了'); 
};
  • 案例
    有一块空白区域,
    当鼠标移动到区域内,显示"亲爱的, 我爱你",
    当我鼠标移开的时候,显示"对不起, 开玩笑",
    当我鼠标不停的在区域内移动的时候, 变换随机颜色(随机十六进制的颜色:#FFFFFF)
  • 事件对象event
    通过事件的执行函数传入的event对象(事件对象) 不是在所有浏览器都有值, 在IE浏览器上event对象并没有传过来, 这里我们要用window.event来获取, 而在火狐浏览器上window.event无法获取, 而谷歌浏览器支持event事件传参和window.event两种, 为了兼容所有浏览器, 我们使用以下方式来得到event事件对象:
box.onclick = function(evt){ 
     var e= evt || window.event; //获取到event对象(事件对象)
     console.log(e);
};

其中window.event中的window可以省略, 最终我们可以写成: 
box.onclick = function(evt){ 
     var e= evt || event; //获取到event对象(事件对象)
     console.log(e);
};

注意: evt || event不要倒过来写

  • 事件对象属性
target: 返回触发此事件的元素(事件的目标节点)
clientX: 浏览器可视区域的x坐标
clientY: 浏览器可视区域的y坐标
screenX: 显示器屏幕的x坐标
screenY: 显示器屏幕的y坐标
offsetX: 鼠标点击的元素位置距离元素左边界的x坐标
offsetY: 鼠标点击的元素位置距离元素上边界的y坐标
  • 案例(下拉菜单)
    1, 最开始效果如左图1
    2, 鼠标滑过”请选择游戏名称”区域时,效果如图2
    3, 鼠标滑过下拉选项区域时, 让下拉选项可以继续显示,移开后隐藏
    4, 鼠标在选项中滑过时, 显示效果图3
    5, 选择某一项, 将顶部的名称改成你选择的游戏名称


    下拉菜单效果

五、事件冒泡

  • 事件冒泡
    当一个元素接收到事件以后,会将接收到的事件传递给父级元素,一直传递给顶层window;可以利用事件冒泡,可以减少事件的绑定,有利于性能优化

注意: 事件传递给某个元素,并不一会触发该事件;会不会触发该事件,和你是否添加该事件有关;

事件冒泡
  • 阻止事件冒泡
  非IE: ev.stopPropagation()
  IE: ev.cancelBubble = true;
  // 兼容写法
  ev.stopPropagation ? ev.stopPropagation() : ev.cancelBubble = true;
  • 事件冒泡的使用(扩展)
    点击单元格时,可以编辑单元格的内容,点击表格以外即编辑完成。


    表格的编辑.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容