JS中的THIS和WINDOW.EVENT.SRCELEMENT详解


Posted in Javascript onMay 25, 2015

我们先看一个简单的例子:

<input type="text" onblur="alert(this.value)"/>完全没有问题。

那么什么情况下不可以用?

fuction method()
{
  alert(this.value);
}
<input type="text" onblur="method()"/>

这个就不可以,因为method()是被响应函数调用的函数。

那么这种情况下怎么办?

方法一:

fuction method(btn)
{
  alert(btn.value);
}
<input type="text" onblur="method(this)"/>

没问题!

方法二:

fuction method()
{
  alert(window.event.srcElement.value);
}
<input type="text" onblur="method()"/>

没问题!window.event.srcElement取得触发事件的控件

我们在看一个稍微绕一点的例子

<head>
  <script type="text/javascript">
    function InitEvent() {
      var inputs = document.getElementsByTagName_r("input");
      for (var i = 0; i < inputs.length; i++) {
        inputs[i].onblur = OnblurEvent;
      }
    }
    function OnblurEvent() {
      // OnblurEvent是onblur的响应函数,而不是被响应函数调用的函数
      // 所以可以用this来获取发生事件的对象
      if (this.value.length > 0) {
        this.style.backgroundColor = "white";
      }
      else {
        this.style.backgroundColor = "red";
      }
    }
  </script>
</head>
<body onload="InitEvent()">
  <input id="Text1" type="text" />
  <input id="Text2" type="text" />
  <input id="Text3" type="text" />
</body>
</html>

我们再来看看2者之间的区别和联系

this:

  下面先看一个例子:

<html>
 <title>this与srcElement的区别</title>
 <head>
 <script type="text/javascipt>"
 function btnClick(){
  alert(this.value);
 }
 </script>
 </head>
 <body>
 <input type="button" value="单击" onclick="btnClick()"/>
 </body>
 </html>

 此时弹出的答案为“undefined”,说明在调用函数时不能使用this.属性来获取。再看下一个例子:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" >
 <head>
   <title>无标题页</title>
   <script type="text/javascript">
   function btnClick(btn){
    alert(btn.value);
   }
   </script>
 </head>
 <body>
 <input type="button" onclick="btnClick(this)" value="单击" />
 
 </body>
 </html>

此时得出的答案为“单击”,此时为什么可以呢?从代码中可以看出,在onclick事件调用函数btnClick()时,将this当作参数传递给了函数。

综合以上:在函数调用时不能直接使用this.属性来获取,而必须将this当作参数传递。

 window.event.srcElement:

下面看一个例子:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" >
 <head>
   <title>无标题页</title>
   <script type="text/javascript">
   function btnClick(){
    alert(window.event.srcElement.value);
   }
   </script>
 </head>
 <body>
 <input type="button" onclick="btnClick()" value="单击" />
 
 </body>
 </html>

此时得出的答案为“单击”,说明在调用函数时可以使用window.event.srcElement.属性来获取。

为什么this不能直接使用而window.event.srcElement可以直接使用呢?从单纯的字面上说this的意思是“当前”。在函数调用时,没有指定具体是哪一个控件,在函数中直接用this是不可以的。在第二段代码中就将this当成了参数传递,所以能得出正确的答案。

其实this和window.event.srcElement的使用区别是:如果要直接使用this.属性,此时的函数不能是被调用的而必须是响应函数,而window.event.srcElement则无此限制。

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
40款非常有用的 jQuery 插件推荐(系列一)
Dec 21 Javascript
Function.prototype.bind用法示例
Sep 16 Javascript
javascript的事件触发器介绍的实现
Jun 05 Javascript
AngularJS基础 ng-disabled 指令详解及简单示例
Aug 01 Javascript
jQuery插件HighCharts绘制的基本折线图效果示例【附demo源码下载】
Mar 07 Javascript
整理一些最近经常遇到的前端面试题
Apr 25 Javascript
原生js实现密码输入框值的显示隐藏
Jul 17 Javascript
对存在JavaScript隐式类型转换的四种情况的总结(必看篇)
Aug 31 Javascript
详解Vue文档中几个易忽视部分的剖析
Mar 24 Javascript
vue+springboot实现项目的CORS跨域请求
Sep 05 Javascript
vue-cli中使用高德地图的方法示例
Mar 28 Javascript
react antd表格中渲染一张或多张图片的实例
Oct 28 Javascript
jQuery实现表格行上移下移和置顶的方法
May 22 #Javascript
jquery控制表单输入框显示默认值的方法
May 22 #Javascript
jQuery实现自动滚动到页面顶端的方法
May 22 #Javascript
JavaScript检测鼠标移动方向的方法
May 22 #Javascript
jQuery实现强制cookie过期方法汇总
May 22 #Javascript
jQuery判断指定id的对象是否存在的方法
May 22 #Javascript
jQuery实现转动随机数抽奖效果的方法
May 21 #Javascript
You might like
php若干单维数组遍历方法的比较
2011/09/20 PHP
php socket通信简单实现
2016/11/18 PHP
JS操作XML中DTD介绍及使用方法分析
2019/07/04 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
2021/03/09 PHP
JavaScript 设计模式学习 Factory
2009/07/29 Javascript
jquery分页插件AmSetPager(自写)
2013/04/15 Javascript
JS动态获取当前时间,并写到特定的区域
2013/05/03 Javascript
jQuery简单实现图片预加载
2015/04/20 Javascript
浅谈$(document)和$(window)的区别
2015/07/15 Javascript
JS操作COOKIE实现备忘记录的方法
2016/04/01 Javascript
浅析Bootstrap组件之面板组件
2016/05/04 Javascript
值得分享的轻量级Bootstrap Table表格插件
2016/05/30 Javascript
浅谈angularJS中的事件
2016/07/12 Javascript
js替换字符串中所有指定的字符(实现代码)
2016/08/17 Javascript
分析javascript中9 个常见错误阻碍你进步
2017/09/18 Javascript
node 解析图片二维码的内容代码实例
2019/09/11 Javascript
js常用方法、检查是否有特殊字符串、倒序截取字符串操作完整示例
2020/01/26 Javascript
vue父子组件间引用之$parent、$children
2020/05/20 Javascript
[06:21]完美世界亚洲区首席发行官竺琦TI3采访
2013/08/26 DOTA
在Python中使用swapCase()方法转换大小写的教程
2015/05/20 Python
Django中URLconf和include()的协同工作方法
2015/07/20 Python
Python中的数学运算操作符使用进阶
2016/06/20 Python
Python初学时购物车程序练习实例(推荐)
2017/08/08 Python
Python序列化基础知识(json/pickle)
2017/10/19 Python
Python使用python-docx读写word文档
2019/08/26 Python
Python SQLAlchemy入门教程(基本用法)
2019/11/11 Python
使用python检查yaml配置文件是否符合要求
2020/04/09 Python
Python如何使用PIL Image制作GIF图片
2020/05/16 Python
基于tf.shape(tensor)和tensor.shape()的区别说明
2020/06/30 Python
英国在线定做百叶窗网站:Make My Blinds
2020/08/17 全球购物
11月升旗仪式讲话稿
2014/02/15 职场文书
《花木兰》教学反思
2014/04/09 职场文书
12.4法制宣传日标语
2014/10/08 职场文书
2014年基建工作总结
2014/12/12 职场文书
总经理助理岗位职责范本
2015/03/31 职场文书
教师节感想
2015/08/11 职场文书