美文网首页
JavaScript 事件(六)

JavaScript 事件(六)

作者: EmileSu_大苏 | 来源:发表于2017-11-27 19:45 被阅读0次

脚本响应事件的方式, 通常是更新 web 页面内容

交互操作创建事件 --> 事件触发代码 --> 代码反馈信息给用户

UI 事件

当与浏览器 UI 本身交互时发生的事件

load - Web 页面加载完成
unload - Web 页面正在卸载
error - 浏览器遇到 JS 错误或不存在的资源
resize - 浏览器窗口的大小发生变化
scroll - 用户使用滚动条移动了页面

键盘事件

当用户操作键盘时发生

keydown - 用户第一次按下一个键(按住这个键时会反复触发)
keyup - 用户松开了一个键
keypress - 输入一个字符

//例:表单键入并直接显示

var el;                                                    // Declare variables

function charCount(e) {                                    // Declare function
 var textEntered, charDisplay, counter, lastkey;          // Declare variables
 textEntered = document.getElementById('message').value;  // User's text
 charDisplay = document.getElementById('charactersLeft'); // Counter element
 counter = (180 - (textEntered.length));                  // Num of chars left
 charDisplay.textContent = counter;                       // Show chars left
 lastkey = document.getElementById('lastKey');            // Get last key elem
 lastkey.textContent = 'Last key in ASCII code: ' + e.keyCode; // Create msg 
}

el = document.getElementById('message');                   // Get msg element
el.addEventListener('keyup', charCount, false); // on keyup - call charCount()
鼠标事件

当用户操作鼠标或触控屏幕

click - 单击一个元素
dblclick - 双击一个元素
mousedown - 在一个元素上按下
mouseup - 在一个元素上松开
mousemove - 移动鼠标(不会发生在触屏上)
mouseover - 鼠标移到一个元素上(不会发生在触屏上)
mouseout - 鼠标在一个元素上移开(不会发生在触屏上)

var msg = '<div class=\"header\"><a id=\"close\" href="#">close X</a></div>';
msg += '<div><h2>System Maintenance</h2>';
msg += 'Our servers are being updated between 3 and 4 a.m. ';
msg += 'During this time, there may be minor disruptions to service.</div>';

var elNote = document.createElement('div');       // Create a new element
elNote.setAttribute('id', 'note');                // Add an id of note
elNote.innerHTML = msg;                           // Add the message
document.body.appendChild(elNote);                // Add it to the page

function dismissNote() {                          // Declare function
 document.body.removeChild(elNote);              // Remove the note
}

var elClose = document.getElementById('close');   // Get the close button
elClose.addEventListener('click', dismissNote, false);// Click close-clear note
焦点事件

当一个元素得到或失去一个焦点时

focus/focusin - 元素得到焦点
blur/focusout - 元素失去焦点

function checkUsername() {                        // Declare function
 var username = el.value;                        // Store username in variable
 if (username.length < 5) {                      // If username < 5 characters
   elMsg.className = 'warning';                  // Change class on message
   elMsg.textContent = 'Not long enough, yet...';// Update message
 } else {                                        // Otherwise
   elMsg.textContent = '';                       // Clear the message
 }
}

function tipUsername() {                          // Declare function
 elMsg.className = 'tip';                        // Change class for message
 elMsg.innerHTML = 'Username must be at least 5 characters'; // Add message
}

var el = document.getElementById('username');     // Username input
var elMsg = document.getElementById('feedback');  // Element to hold message

// When the username input gains / loses focus call functions above:
el.addEventListener('focus', tipUsername, false); // focus call tipUsername()
el.addEventListener('blur', checkUsername, false);// blur call checkUsername()
表单事件

当用户与表单元素发生交互时

input - 输入框元素中发生了变化
change - 选框按钮发生变化
submit - 用户提交表单
reset - 用户点了表单上的重置按钮(少用)
cut - 用户从表单中剪切了内容
copy - 用户从表单中复制了内容
paste - 用户向表单中粘贴了内容
selet - 用户在表单中选中了一些文本

//表单提示和检查代码示例:
//HTML 例:
<!DOCTYPE html>
<html>
 <head>
   <title>JavaScript &amp; jQuery - Chapter 6: Events - Form Events</title>
   <link rel="stylesheet" href="css/c06.css" />
 </head>
 <body>
   <div id="page">
     <h1>List King</h1>
     <form method="post" action="http://www.example.org/register" id="formSignup">
       <h2>Membership</h2>

       <label for="package" class="selectbox"> Select a package: </label>
       <select id="package">
         <option value="annual">1 year ($50)</option>
         <option value="monthly">1 month ($5)</option>
       </select>
       <div id="packageHint" class="tip"></div>

       <input type="checkbox" id="terms" />
       <label for="terms" class="checkbox"> Check to agree to terms &amp; conditions</label>
       <div id="termsHint" class="warning"></div>

       <input type="submit" value="next" />

       </form>
     </div>
     <script src="js/form.js"></script>
   </body>
</html>


//JS 例:
var elForm, elSelectPackage, elPackageHint, elTerms, elTermsHint; // Declare variables
elForm          = document.getElementById('formSignup');          // Store elements
elSelectPackage = document.getElementById('package');
elPackageHint   = document.getElementById('packageHint');
elTerms         = document.getElementById('terms');
elTermsHint     = document.getElementById('termsHint');

function packageHint() {                                 // Declare function
 var pack = this.options[this.selectedIndex].value;     // Get selected option
 if (pack === 'monthly') {                              // If monthly package
   elPackageHint.innerHTML = 'Save $10 if you pay for 1 year!';//Show this msg
 } else {                                               // Otherwise
   elPackageHint.innerHTML = 'Wise choice!';            // Show this message
 }
}

function checkTerms(event) {                             // Declare function
 if (!elTerms.checked) {                                // If checkbox ticked
   elTermsHint.innerHTML = 'You must agree to the terms.'; // Show message
   event.preventDefault();                              // Don't submit form
 }
}

//Create event listeners: submit calls checkTerms(), change calls packageHint()
elForm.addEventListener('submit', checkTerms, false);
elSelectPackage.addEventListener('change', packageHint, false);

事件如何触发 JavaScript 代码

事件处理三步骤:

  • 一. 获取触发事件的 DOM 节点
  • 二. 将事件绑定到 DOM 节点

1.传统的 DOM 事件处理

element.onevent = functionName;      //目标函数节点.事件带"on"前缀 = 调用的函数名(后面不带小括号)

//例:
function checkUsername() {
 //事件的函数代码
}

var el = document.getElementById('username');
el.onblur = checkUsername;

2.DOM 监听器

element.addEventListener('event', functionName [, Boolean]);      
//元素.时间选择器(事件"无on前缀", 函数代码, 事件流"一般为 false")

//例:
function checkUsername() {
 //事件的函数代码
}

var el = document.getElementById('username');
el.addEventListener('blur', checkUsername, false);

3.如何向事件中的函数传参

//需要将事件函数封装在匿名函数中
el.addEventListener(
   'blur',
   function() {
       checkUsername(5);
   },
   false
);
  • 三. 编写事件需要自行的的函数(有名或匿名)

事件对象

可获取事件的信息, 以及发生在哪个元素上

  • 属性
    target -事件的目标元素
    type - 事件的类型
    cancelabel - 是否可撤销事件在这个元素上的默认行为
  • 方法
    preventDefault() - 撤销这个事件的默认行为
    stopPropagation() - 停止事件继续冒泡或向下捕获的过程
//使用事件对象例:

---
//无参数事件
function checkUsername(e) {
   var target = e.target;
}

var el = document.getElementById('username');
el.addEventListener('blur', checkUsername, false);

---
//带参数的事件
function checkUsername(e, minLength) {
   var target = e.target;
}

var el = document.getElementById('username');
el.addEventListener(
   'blur',
   function() {
       checkUsername(e, 5);
   },
   false
);

事件委托

为大量元素创建监听事件会影响页面速度, 所以使用事件流在父元素上监听事件.

//HTML:
<div id="page">
  <h1>List King</h1>
  <h2>Buy groceries</h2>
  <ul id="shoppingList">
    <li class="complete"><a href="itemDone.php?id=1"><em>fresh</em> figs</a></li>
    <li class="complete"><a href="itemDone.php?id=2">pine nuts</a></li>
    <li class="complete"><a href="itemDone.php?id=3">honey</a></li>
    <li class="complete"><a href="itemDone.php?id=4">balsamic vinegar</a></li>
  </ul>
</div>

//JS例:
function itemDone(e) {
  var target, elParent, elGrandparent;
  target = getTarget(e);
  elParent = target.parentNode;
  elGrandparent = target.parentNode.parentNode;
  elGrandparent.removeChild(elParent);
  e.preventDefault;
}

var el = document.getElementById('shoppingList');
el.addEventListener('click', function(e){
  itemDone(e);
}, false)

this 关键字指向函数的所有者

当没有参数传递给函数时, 常常使用 this 作为沟通

function checkUsername(){
  var elMsg = document.getElementById('feedback');
  if (this.value.length < 5) { 
    elMsg.innerHTML = 'Not long enough';
   } else {
    elMsg.innerHTML = ' ';
  }
}

var el = document.getElementById('username');
el.addEventListener('blur', checkUsername, false);

如果需要往函数传递参数,那么this 关键字就会失效

因为这个函数的所有者不再是监听器所绑定的元素, 而是那个匿名函数

function checkUsername(el, minLength) {
  var elMsg = document.getElementById('feedback')
  if (el.value.length < minLength) {
    elMsg.innerHTML = 'Not long enough';
  } else {
    elMsg.innerHTML = ' ';
  }
}

var el = document.getElementById('username');
el.addEventListener('blur', function(){
  checkUsername(el, 5);
}, false);

相关文章

网友评论

      本文标题:JavaScript 事件(六)

      本文链接:https://www.haomeiwen.com/subject/gijavxtx.html