js函数与事件

javascript中的函数:

1,解析器在向执行环境中加载数据时,会率先读取函数声明,并使其在执行任何代码之前可用;当执行器执行到函数表达式的代码的时候才会真正的解释执行
2,arguments:函数内部用来接收函数参数的类数组对象
3,js中没有重载的概念
4 形式

  //匿名函数
  function(){
    //....
  }

5 调用
在<script>标签中调用定义的函数
例如:可以先调用后定义
<script type="text/javascript">
  test();
  function test(){
    alert("hello world");
  }
  test();
</script>


在html元素的事件属性中调用定义过的函数
例如:可以先调用后定义
<script type="text/javascript">
  function test(){
    alert("hello world");
  }
</script>

<input type="button" value="点击" onclick="test()" />

6,函数内部属性
arguments:是类数组对象,传入函数中参数数组
this: 指向的是函数赖以执行的环境对象

7,函数的属性:
length: 表示函数希望接受的命名参数的个数

 

8,自调用函数
函数表达式可以 "自调用"。
自调用表达式会自动调用。
如果表达式后面紧跟 () ,则会自动调用。
不能自调用声明的函数。
通过添加括号,来说明它是一个函数表达式:

实例
无参的自调用函数:
  (function () {
    var x = "Hello!!"; // 我将调用自己
  })();
  有参的自调用函数:
  (function(a){
    console.log("自调用 参数 "+ a);
  })(10);


9,闭包:
闭包是指有权访问另一个函数作用域变量的函数,创建闭包的通常方式,是在一个函数内部创建另一个函数;通常用于保存变量于内存中

闭包的产生是A函数里定义了B函数,B函数里调用了A函数的变量.
  var add = (function(){
    var sum = 0;
    return function(){
      return sum+=1;
    }
  })();

闭包的作用:

  1.能在函数外部访问到函数内部的变量

  2.能使函数内部的局部变量一直存在于内存中(因为调用此变量的函数会变成全局变量,一直在内存中)

  3.使得js函数的私有变量变为可能。

 

28.2. js事件
javascript与HTML之间的交互是通过事件实现的。事件就是文档或浏览器窗口中发生的一些特定的交互瞬间。
事件三要素:
  事件目标(event target)
    发生的事件与之相关联或与之相关的对象
  事件处理程序(event handler)
    处理或相应事件的函数
  事件对象(event object)
    与特定事件相关且包含有关该事件详细信息的对象。

2) 事件处理程序
事件就是用户或浏览器自身执行的某种动作,响应某个事件的函数为事件处理程序,事件处理程序以"on"开头(onclick,onload)
1. HTML事件处理程序
某个元素支持的每种事件,都可以使用一个与相应事件处理程序同名的HTML特性来指定。这个特性的值应该是能够执行的JavaScript代码。

<input type="button" value="clickMe" onclick = "alert('is clicked')">
  不能在事件中使用未经转义的HTML语法字符

<input type="button" value="clickMe" onclick = "showMsg()">
<script type="text/javascript">
  function showMsg(){
    alert("is clicked");
  }
</script>
点击按钮会调用showMsg()函数,事件处理程序的代码在执行时,有权访问全局作用域的任何代码。
缺点:
1)时差问题,用户可能会在HTML元素以出现在页面上就触发相应的事件,但当时的事件处理程序有可能尚不具备执行的条件。
2)这种扩展事件处理程序的作用域链在不同浏览器中会导致不同结果。
3)HTML与JavaScript代码紧密耦合。

2. DOM0级事件处理程序
通过javascript制定事件处理程序的传统方式,将一个函数赋值给一个事件处理程序属性。特点是简单,跨浏览器。
var btn = document.getElementById("btn");
btn.onclick = function(event){
  alert('cliked');
}
dom0级方法制定的事件处理程序被认为是元素的方法,因此这个时候时间处理程序是在元素的作用域中运行,this指向当前元素。
btn.onclick = null; //删除事件处理程序
3. DOM2级事件处理程序
DOM2级规范以一种符合逻辑的方式来标准化DOM事件,IE9,Firefox,Opera,Safari,Chrome全部已经实现了"DOM2级事件"模块的核心部分。IE8是最后一个仍然使用其专有事件系统的主要浏览器。

  addEventListener()
  事件绑定
  参数:
    要绑定的事件名
    作为事件处理的函数
    布尔值:true在捕获阶段调用事件处理程序;false在冒泡阶段调用
  removeEventListener()
  事件删除
  参数:
    要删除的事件名
    作为事件处理的函数
    布尔值:true在捕获阶段调用事件处理程序;false在冒泡阶段调用

  例如:
    //事件绑定
    var btn = document.getElementById("btn");
    btn.addEventListener("click",function(){
      alert(this.id); //该函数在其依附的元素的作用域中运行。
    },false);
    //事件移除
    var btn = document.getElementById("btn");
    var handler = function(){
      alert(this.id);
    }
    btn.addEventListener("click",handler,false);
    btn.removeEventListener("click",handler,false);//移除

    注:1,可以添加多个事件处理程序,并且按照添加她们的顺序触发。
      2,移除事件传入的参数与添加处理程序时使用的参数相同,
      3,添加事件时如果使用匿名函数将无法删除

3) 事件对象
1. DOM中的事件对象
在触发DOM上的某个事件时,会产生一个事件对象event,这个对象包含着所有与事件相关的信息,包括导致事件的元素,事件的类型以及其他与特定事件相关的信息。兼容DOM的浏览器默认会将event对象传入到事件处理函数中
dom.onclick = function(event){
  console.log(event);
}
dom.addEventListener("click",function(event){
  console.log(event);
},false);

事件对象的属性均为只读属性。
属性 类型 说明
  bubbles Boolean 事件是否冒泡
  cancelable Boolean 是否可以取消事件默认行为
  currentTarget Element 事件处理程序当前正在处理事件的那个元素
  eventPhase Integer 调用事件处理程序的阶段;1,捕获 2,处于目标 3,冒泡
  target Element 事件真正目标
  type String 事件类型,需要一个函数处理多个事件时,可以使用该属性。
  preventDefault() Function 取消事件的默认行为
  stopPropagation() Function 取消事件的进一步捕获或者冒泡

在事件处理程序内部,对象this始终等于currentTarget值,而target则只包含事件的实际目标。如果直接将事件处理程序指定给了目标元素,this,currentTarget,target包含相同的值。

4) 事件类型
1. UI事件
  load
    当页面完全加载后再window上触发,当所有框架加载完毕时在框架集上触发,当图像加载完毕时在img元素上触发,当嵌入的内容加载完时在<object>触发
  select
    当用户选择文本框(<input>,<textarea>)中的一个或多个字符时
  resize
    当浏览器窗口被调整到一个新的高度或者宽度时,会触发
  scroll
    当用户滚动带滚动条的元素中的内容时,在该元素上触发resize,scroll会在变化期间重复被激发,尽量保持代码简单
2. 焦点事件
  blur
    元素失去焦点的时候触发
  focus
    元素获得焦点的时候触发,不支持冒泡

3. 鼠标与滚轮事件
  click
    点击主鼠标按钮或者按下回车按键的时候触发。只有在一个元素上相继发生mousedown,mouseup事件,才会触发click事件
  dblclick
    双击主鼠标按钮时触发.只有在一个元素上相继触发两次click时间才会触发dbclick事件
  mousedown
    任意鼠标按钮按下时触发
  mouseup
    释放鼠标按钮触发
  mousemove
    鼠标在元素内部移动的时候重发触发
  mousewheel
    滚轮事件
  mouseover
    鼠标位于元素外部,将其首次移入另一个元素边界之内时触发【支持子元素】
  mouseenter
    鼠标光标从元素外部首次移动到元素范围内激发,不冒泡。【不支持子元素】
  mouseout
    在位于元素上方的鼠标光标移入到另外一个元素中。【支持子元素】在被选元素上与mouseleave效果相同
  mouseleave
    在位于元素上方的鼠标光标移动到元素范围之外时触发,不冒泡【不支持子元素】


4. 相关元素,event特殊属性
1.客户区坐标位置
  clientX,clientY 事件发生时,鼠标指针在视口中的水平和垂直坐标
2.页面坐标位置
  pageX,pageY 事件发生时,鼠标指针在页面本身而非视口的坐标,页面没有滚动的时候,pageX和pageY的值与clientX和clientY值相等
3.屏幕位置
  screenX,screenY
4.修改键
  值为boolean类型,用来判断对应的按键是否被按下
  shiftKey
  ctrlKey
  altKey
  metaKey
5.鼠标按钮
  mousedown,mouseup,该事件的event对象中包含了button属性,表示按下或释放的按钮。
  0表示主鼠标按钮
  1表示中间的滚动按钮
  2表示次鼠标按钮
  5. 键盘与文本事件
  keyup 释放键盘上键时触发
  当键盘事件发生时,event对象的keyCode属性中会包含一个代码与键盘上的特定键对应,对数字字母键,keyCode属性的值与ASCII码中对应的小写字母和数字编码相同

6.表单事件
onsubmit 在提交表单前执行onsubmit
  如果返回 true 就会提交表单
  如果返回 false 不会提交表单
eg:
<form onsubmit="return true;">
<form onsubmit="return false;">

注意:javascript代码也可以提交表单:
document.forms.myForm.submit();


29.1 正则表达式的基本语法规则
语法:
创建正则表达式对象:
var reg = new RegExp(pattern,modifiers);
或者
var reg = /pattern/modifiers;
注:

pattern 描述了表达式的模式/规则
modifiers 用于指定全局匹配、区分大小写的匹配和多行匹配

对应修饰符modifiers有三个选项:
  i 执行对大小写不敏感的匹配。
  g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
  m 执行多行匹配。
同时在创建正则表达式对象的是也可以不写修饰符

29.2 pattern内容的分析

方括号表达式:匹配一个字符
  [abc] 查找方括号之间的任何字符。
  [^abc] 查找任何不在方括号之间的字符。
  [0-9] 查找任何从 0 至 9 的数字。
  [a-z] 查找任何从小写 a 到小写 z 的字符。
  [A-Z] 查找任何从大写 A 到大写 Z 的字符。
  [A-z] 查找任何从大写 A 到小写 z 的字符。
  (red|blue|green) 查找任何指定的选项。

元字符: 一个字符
  . 查找单个字符,除了换行和行结束符。 想表示字符. 可以转义
  \w 查找单词字符。字母 数字 _
  \W 查找非单词字符。非 字母 数字 _
  \d 查找数字。
  \D 查找非数字字符。
  \s 查找空白字符。
  \S 查找非空白字符。
  \b 匹配单词边界。
  \B 匹配非单词边界。
  \0 查找 NUL 字符。
  \n 查找换行符。
  \f 查找换页符。
  \r 查找回车符。
  \t 查找制表符。
  \v 查找垂直制表符。

量词:
  n+ 匹配任何包含至少一个 n的字符串。
  n* 匹配任何包含任意个 n 的字符串。
  n? 匹配任何包含零个或一个 n 的字符串。
  n{X} 匹配包含 X 个 n 的序列的字符串。
  n{X,Y} 匹配包含 X 到 Y 个 n 的序列的字符串。
  n{X,} 匹配包含至少 X 个 n 的序列的字符串。
  n$ 匹配任何结尾为 n 的字符串。
  ^n 匹配任何开头为 n 的字符串。
  ?=n 匹配任何其后紧接指定字符串 n 的字符串。
  ?!n 匹配任何其后没有紧接指定字符串 n 的字符串。

29.3 支持正则表达式的 String 对象的方法
  使用字符串对象的相关方法按照正则表达式
  所描述的规则去搜索、匹配、替换、分割.

  search 检索与正则表达式相匹配的值。
  match 找到一个或多个正则表达式的匹配。
  replace 替换与正则表达式匹配的子串。
    EG:var str="Visit Microsoft!"
    document.write(str.replace(/Microsoft/, "W3School"))

  split 把字符串分割为字符串数组。

29.4 RegExp 对象方法
使用正则表达式对象(RegExp)的相关方法来对
指定字符串进行格式的验证.

compile 编译正则表达式。
  var str="Every man in the world! Every woman on earth!";

  patt=/man/g;
  str2=str.replace(patt,"person");
  document.write(str2+"<br />");

  patt=/(wo)?man/g;
  patt.compile(patt);
  str2=str.replace(patt,"person");
  document.write(str2);

  exec 检索字符串中指定的值。
    var str = "Visit W3School";
    var patt = new RegExp("W3School","g");
    var result;

    while ((result = patt.exec(str)) != null) {
      console.log(result);

      //["W3School", index: 6, input: "Visit W3School", groups: undefined]
    }

  返回找到的值,并确定其位置。
test 检索字符串中指定的值。
  返回 true 或 false。


29.5 例子
  var v = "aa1a";
  //字符串中包含数字就行
  var reg = /\d/;
  console.log(reg.test(v));

  var v = "aaa1111aa";
  //字符串中连着出现4次(或者更多)数字即可
  var reg = /\d{4}/;
  console.log(reg.test(v));

  var v = "1111";
  //^表示开头 $表示结尾
  //开头和结尾直接必须连续出现4次数字
  var reg = /^\d{4}$/;
  console.log(reg.test(v));


  var v = "1aaa2345";
  //开头一个非0数字,后面跟任意字符
  0-n个,最后4个数字结尾
  var reg = /^[^1-9]{1}.*\d{4}$/;
  console.log(reg.test(v));


  var v = "aaredaa";
  //red go yes 三个单词任意匹配
  var reg = /(red|go|yes)/;
  console.log(reg.test(v));


  var v = "a1";
  //开头是一个字符 结尾是一个
  数字(一共俩个字符)
  var reg = /^\w\d$/;
  console.log(reg.test(v));

  var v = "aasd11111";
  //开头是字符(1-n个)
  var reg = /^\w+\d$/;
  console.log(reg.test(v));

  var v = "aasd )_###11111";
  //开头是字符(1-n个) 中间随意匹配
  var reg = /^\w+(.*)+\d$/;
  console.log(reg.test(v));

  //email验证
  var v = "huzl@briup.com";
  var reg = /^\w+@\w+(\.[A-z]{2,3}){1,2}$/;
  console.log(reg.test(v));

posted @ 2020-03-19 16:50  whhhd  阅读(271)  评论(0编辑  收藏  举报