`
lixw
  • 浏览: 200809 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JS事件处理的一点细节

阅读更多

 在Javascript中我们可以利用下面的方式来给一个HTML元素添加事件:

var btn = document.getElementById("btn");
btn.onclick=function(){alert('hello!');}

 当然第二行代码我们还可以修改成这样的方式:

btn.onclick=new Function("alert('hello!');"}

 这种方式都会创建一个匿名的函数,如果我们把它应用于循环中,就像下面这样:

<HTML>
 <HEAD>
  <TITLE></TITLE>
  <SCRIPT LANGUAGE="JavaScript">
  <!--
	function test(){
		var btns = document.getElementsByTagName("input");
		var data = document.getElementById("data");
		for(var i = 0; i < btns.length; i++){
			btns[i].onclick = function(){data.innerText = "onclick: " + i;};
			btns[i].attachEvent("onmouseover", function(){data.innerText = "onmouseover: " + i;});
			btns[i].onmouseout = new Function("data.innerText = 'onmouseout: " + i + "';");
		}
	}
  //-->
  </SCRIPT>
 </HEAD>

 <BODY onload="test()">
  <input type="button" name="btn1" value="Test1"/>
  <input type="button" name="btn2" value="Test2"/>

  <span id="data"></span>
 </BODY>
</HTML>

 我们从输出结果中发现前两种方式的结果中都是2,深层原因很是疑惑,我觉得有两种解释:

1、所有创建的这种匿名函数都拥有一个引用,如果多次赋值可能会覆盖之前的事件处理属性的值;(但是button的引用是变化的啊?);

2、前面的复制只是简单的字符串赋值,对于函数也如此,当真正触发事件调用时它才解析这段代码;(不过i的作用域是什么呢?)

问题依旧,继续学习,有懂得朋友帮忙指点一下!

 

 

参考资料:

http://www.happyshow.org/content.asp?id=92

http://shiningray.cn/functional_javascript_programming.html

 

 

下面的例子让我们理解JS中的对象机制和prototype的使用。来源于http://q.sohu.com/forum/5/topic/298749

function test(){
		var class1 = new Object();
		class1.hello = function(name){alert("hello, " + name);};
		class1.name = "lixw";

		class1.hello(class1.name);

		//prototype提供了扩展、改造原有对象的方法。
		//例如我们可以为已知对象,包括JavaScript的核心对象Array,Number,Math,Object,Boolean
               //等和自定义类添加方法或者属性。
		String.prototype.trim = function() {return this.replace(/(^\s*)|(\s*$)/g,""); }
		alert("[" + " hello world  ".trim() + "]");

		Student.prototype.age = 22;
		var stu = new Student("lixw");
		alert(stu.age);
	}

	function Student(name){
		/**
		var o=new Obj();这样的语法,看起来似乎和Java/C++相当类似,但是他背后的执行过程是不同的。
		首先,解释器会new一个空的Object对象。然后将这个空的Object,作为隐藏的参数传递给function Obj()。
		在Obj函数中访问到的this,其实就是这个传入的空的Object 对象。
		这就是所谓:“this关键字关联于执行时的作用域”的含义。
		如果你想把一个函数作为“构造函数”,那么就不要在函数的最后加上return语句。
		因为如果没有return语句,new算符返回的就是那个被操作过以后的this。
		一旦你通过return返回了别的东西,这个this就被废弃掉了。对于函数的调用者来说,就会相当的困惑。
		*/

		this.name = name;
	}

  看看下面的例子:

<HTML>
 <HEAD>
  <TITLE></TITLE>
  <SCRIPT LANGUAGE="JavaScript">
  <!--
	function Button() {
     
        this.button = document.createElement("button");
        this.button.appendChild(document.createTextNode("Press me!"));
		
        this.button.onclick = (
			function(v) { 
				return function() {
					var val = document.getElementById("val").value; alert(val);
				}
            }
		) (this.value);

		document.getElementById("d").appendChild(this.button);
	}
	function init(){
		var bt = new Button();
	}

  //-->
  </SCRIPT>
 </HEAD>

 <BODY onload="init()">
  <input type="text" name="val"></input>
  <div id="d"></div>
 </BODY>
</HTML>

 在这个例子中,下面的代码是关键:

this.button.onclick = (
	function(v) { 
		return function() {
			var val = document.getElementById("val").value; alert(val);
		}
        }
) (this.value);

我们需要注意变量的作用域。

 

JS中利用代码触发事件:

<HTML>
 <HEAD>
  <TITLE></TITLE>
  <SCRIPT LANGUAGE="JavaScript">
  function rdl_doClick(e){  
	event.cancelBubble=false;  
	event.srcElement.value="我被单击了。"  
  }  
  </SCRIPT>   
 </HEAD>
 <BODY>

     <input id=oInput type=text tabindex=4 size=30 onclick="rdl_doClick();">  
     <br><br>  
     <input type=button value="模拟单击" onclick="document.all('oInput').click();">
     <br>

 </BODY>
</HTML>
 
分享到:
评论

相关推荐

    一些主流JS框架中DOMReady事件的实现小结

    标题所指的知识点是主流JavaScript框架对DOMReady事件的处理方式。DOMReady事件指的是在DOM树构建完成之后立即触发,而不需要等待图片、脚本、样式表等其他资源加载完毕。这一点对于提高用户体验尤为重要,因为在...

    JavaScript初学者应注意的七个细节详细介绍

    JavaScript提供了丰富的事件类型和事件处理方法。初学者需要掌握如何为元素添加事件监听器,以及如何使用事件对象处理不同事件。理解事件冒泡和事件捕获的概念,对于处理复杂的事件逻辑也是至关重要的。 7. 函数是...

    javascript canvas line(在页面用鼠标拉一条线,一个字,酷)

    例如,`CanvasPainter.js`可能包含了一组用于绘画的工具和方法,`CPAnimator.js`可能实现了帧动画功能,使线条绘制更流畅,而`CPDrawing.js`可能处理了用户与Canvas的交互,比如监听鼠标事件来追踪用户的画线动作。...

    Javascript在IE和FireFox中的兼容处理

    在处理时需要考虑这一点,例如使用`parseInt(style.width)`。 13. **对于table标签的操作问题** - IE和Firefox在处理表格元素时可能有不同的行为,例如`innerHTML`赋值。需要针对特定情况处理。 14. **padding...

    自定义JS类框架

    3. jQuery集成:jQuery是一个广泛使用的JavaScript库,它简化了DOM操作、事件处理、动画和Ajax交互。在自定义JS类框架中,可能会将jQuery的一些功能封装成类方法,以提供更加统一的API。 4. 继承:JavaScript的继承...

    js圆形放大镜网页特效

    在实际开发中,我们可以使用jQuery或者其他JavaScript库来简化代码,提供更便捷的事件处理和DOM操作。例如,可以使用`$(document).ready()`来确保在页面加载完成后执行JavaScript代码,`$(element).hover()`来监听...

    .很炫的JS点击可以放大

    标题中的“很炫的JS点击...以上就是与标题和描述相关的JavaScript知识点,涵盖了事件处理、CSS样式变换、响应式设计等多个方面。这些技术和概念在实际的网页开发中非常常见,也是提升网页交互性和用户体验的重要工具。

    高性能JavaScript.pdf

    - 事件委托(Event Delegation)是一种提高事件处理效率的技术,通过监听父元素上的事件来处理子元素的事件,从而避免为每个子元素单独绑定事件监听器。 #### 四、算法与流程控制(Algorithms and Flow Control) ...

    javaScript分页

    JavaScript分页是网页开发中一...总之,JavaScript分页是一个涉及数据处理、DOM操作、事件处理和样式设计等多个方面的问题。通过这个项目,你可以深入理解JavaScript在实际网页开发中的应用,并提升你的前端开发技能。

    浅谈firefox 的event事件处理

    本文将着重介绍Firefox浏览器中事件处理的一些细节,并讨论与其他浏览器的兼容性问题以及如何在现代前端框架中有效处理这些问题。 ### Firefox的事件处理细节 Firefox浏览器在早期版本中对事件处理的方式与后来的W3...

    Connect Four Game using JavaScript with Source Code.zip

    总的来说,使用JavaScript实现Connect Four游戏是一个很好的实践项目,它涵盖了事件处理、DOM操作、数组处理、逻辑判断等多个JavaScript核心概念。通过这个项目,开发者可以深入理解JavaScript在实际应用中的工作...

    javascript可拖动的日历

    通过阅读和理解这两个文件,我们可以学习到实际的实现细节,例如如何创建可拖动的元素,如何处理鼠标事件,以及如何使用CSS实现日历的外观。这是一个很好的实践案例,有助于深化对JavaScript和CSS交互的理解,对于...

    vue.js事件处理器是什么

    Vue.js事件处理器是Vue框架中用于处理用户交互的核心机制,它们使得Vue实例能够响应用户的DOM事件并执行相应的JavaScript代码。Vue提供了多种方式来定义和管理这些事件处理器,以实现高效且可维护的事件处理逻辑。 ...

    JavaScript异步编程

    本书《JavaScript异步编程》由Trevor Burnham所著,翻译版本由许青松翻译,由人民邮电出版社出版,详细讲解了JavaScript中的异步处理技巧。作者通过本书,探讨了如何在JavaScript中处理并发性问题,使得开发者能够更...

    prototype.js

    4. **事件处理**:Prototype.js改进了JavaScript的事件处理机制,允许使用更简洁的语法绑定和解绑事件监听器。例如,`Event.observe()`和`Event.stopObserving()`用于添加和移除事件处理函数。 5. **Selectors API*...

    深入理解Node.js:核心思想与源码分析

    当Node.js启动时,会创建一个事件循环,每个I/O事件发生时,该事件会被放入相应的队列中,然后事件循环会依次处理这些事件,直到队列清空。 Node.js的设计哲学十分注重性能和效率,这背后也离不开C++和JavaScript的...

    Learning Three.js: The Javascript 3D Library for WebGL

    此外,Three.js还提供了多种后期处理效果,比如抗锯齿、高动态范围渲染(HDR)和色彩校正等,这可以帮助开发者进一步提升3D渲染的视觉质量。值得一提的是,Three.js还允许开发者通过编写自定义的着色器程序(vertex ...

Global site tag (gtag.js) - Google Analytics