每当将事件处理程序指定给元素时,运行中的浏览器代码与支持页面交互的JavaScript代码之间就会建立一个连接。这种链接越多,页面执行起来就越慢。所前所述,可以采用事件委托技术,限制建立的连接数量。另外,在不需要的时代移除事件处理程序,也是解决这个问题的一种方案。内存中留有那些过时不用的“空事件处理程序”,也是造成Web应用程序内存与性能问题的主要原因。
在两种情况下,可能会造成上述问题,第一种情况就是从文档 中移除带有事件处理程序的元素时,这可能是通过纯粹的DOM操作,例如使用removeChild()和replaceChild()方法,但更多地是发生在使用innerHTML替换页面中某一部分的时候。如果带有事件处理程序的元素被innerHTML删除了,那么原来添加到元素中的事件处理程序极有可能被当作垃圾回收。来看下面的例子:
<div id="myDiv">
<input type="button" value="Click Me" id="myBtn">
</div>
<script type="text/javascript">
var btn=document.getElementById("myBtn");
btn.onclick=function(){
document.getElementById("myDiv").innerHTML="Processing…";
}
</script>
这里,有一个按钮被包含在<div>元素中,为避免双击,单击这个按钮时就将按钮移除并替换成一条消息;这是网站设计中非常流行的一种做法。但问题在于,当按钮被从页面中移除时,它还带着一个事件处理程序呢,在<div>元素中设置innerHTML可以把按钮移走,但事件处理各种仍然与按钮保持着引用联系。有的浏览器(尤其是IE)在这种情况下不会作出恰当的处理,它们很有可能会将对元素和事件处理程序的引用都保存在内存中。如果你想知道某个元即将被移除,那么最好手工移除事件处理程序。如下面的例子所示:
<div id="myDiv">
<input type="button" value="Click Me" id="myBtn">
</div>
<script type="text/javascript">
var btn=document.getElementById("myBtn");
btn.onclick=function(){
btn.onclick=null;
document.getElementById("myDiv").innerHTML="Processing…";
}
</script>
在此,我们设置<div>的innerHTML属性之前,先移除了按钮的事件处理程序。这样就确保了内存可以被再次利用,而从DOM中移除按钮也做到了干净利索。
注:采用事件委托也有解决这个问题。如果事先知道将来有可能使用innerHTML替换掉页面中的某一部分,那么就可以不直接把事件处理程序添加到该部分的元素中,而通过把事件处理程序指定给最好层次的元素,同样能够处理该区域中的事件。
导致“空事件处理程序”的另一情况,就是卸载页面中的时候。毫不奇怪,IE在这种情况下依然是问题最多的浏览器,尽管其他浏览器或多或少也有类似的问题。如果在页面被卸载之前没有清理干净事件处理程序。那它们就会滞留在内存中。每次加载完页面再卸载页面时(可能是在两个页面间来加切换,也可以是单击了“刷新”按钮),内存中滞留的对象数目就会增加,因为事件处理程序占用的内存并没有被释放。
一般来说,最好的做法是在页面卸载之前 ,先通过onunload事件处理程序移除所有事件处理程序。在此,事件委托技术再次表现出它的优势——需要跟踪的事件程序越少,移除它们就越容易,对这种类似的操作,我们可把它想象成:只要是通过onload事件处理程序添加的东西,最后都要通过onunload事件处理程序将它们移除。
注:不要忘了,使用onunload事件处理程序意味着页面不会被缓存在bfcachek中,如果你在意这个问题,那么就只能在IE中通过onunload来移除事件处理程序了。
分享到:
相关推荐
JavaScript是Web前端开发的核心技术之一,它赋予网页动态交互的能力,让用户体验更加丰富。...在头歌教学实践平台上,你可以找到更多关于JavaScript事件处理的实例和练习,以提升你的Web前端开发技能。
3. **减少DOM操作**:DOM操作是JavaScript性能的瓶颈,尽量避免频繁修改DOM,可以使用文档碎片(DocumentFragment)或批量操作来提升性能。 4. **事件委托(Event Delegation)**:通过在父元素上绑定事件,利用...
JavaScript事件冒泡是Web开发中的一个关键概念,它在网页交互和动态效果中扮演着重要角色。事件冒泡源于浏览器处理事件的...熟练掌握事件冒泡、事件捕获以及如何阻止冒泡,对于提升JavaScript的事件处理能力至关重要。
3. DOM2级事件处理程序:使用`addEventListener`和`removeEventListener`方法添加和移除事件监听器,支持事件冒泡和捕获,如`element.addEventListener('click', myFunction)`。 三、事件传播 1. 事件冒泡:事件从...
3. **事件处理**:JavaScript通过事件监听和事件处理函数实现用户交互。常见的事件有点击(click)、鼠标移动(mousemove)、键盘输入(keydown)等,通过addEventListener和removeEventListener方法添加和移除事件...
通过分析事件处理流程,优化事件绑定,减少不必要的计算和DOM操作,从而提升网页的响应速度和用户体验。 不过,由于提供的压缩包文件名称列表只有一个数字(132689964203577242),无法直接获取更多关于工具的具体...
【Vuemit:最小的Vue.js事件处理程序】 在Vue.js框架中,事件处理是构建用户交互界面的关键组成部分。Vue.js提供了便利的事件绑定机制,使得组件间的通信变得简单易行。Vuemit,正如其名,是针对Vue.js设计的一个轻...
这份文档通常包含了JavaScript的语法、函数、对象、事件处理以及错误处理等核心内容。 首先,JavaScript的基础语法包括变量声明(var、let、const)、数据类型(字符串、数字、布尔值、null、undefined、对象、数组...
- 移除所有事件处理程序:如果要移除一个元素上所有同类型的事件处理程序,没有直接的方法。但可以通过添加临时处理程序,然后阻止事件冒泡来实现: ```javascript button.addEventListener('click', function...
- **使用箭头函数**:箭头函数没有自己的`this`,可以减少上下文查找,提升性能。 4. **数组操作优化** - **使用数组方法**:`push()`、`pop()`、`shift()`和`unshift()`直接操作数组底层,比使用索引更高效。...
JavaScript通过`addEventListener`和`removeEventListener`方法来添加和移除事件监听器,事件处理函数可以响应这些事件并执行相应的逻辑。 4. AJAX与异步通信 - AJAX(Asynchronous JavaScript and XML)允许网页...
JavaScript事件处理是网页互动性的关键。通过绑定事件监听器,当用户执行特定操作(如点击按钮、提交表单)时,可以触发相应的JavaScript函数。这使得网页可以根据用户的交互行为做出响应。 四、AJAX 异步...
事件是用户与网页交互时产生的触发点,JavaScript通过事件处理程序响应这些事件,实现交互性。常见的事件有点击(click)、鼠标移动(mousemove)、键盘输入(keydown)等。事件监听器可以使用addEventListener和...
事件处理是JavaScript特效的关键,当用户执行特定操作(如点击按钮、滚动页面)时,JavaScript可以通过绑定事件监听器来响应这些行为。例如,`addEventListener`函数可以用来添加事件监听器,`removeEventListener`...
四、事件处理 JavaScript通过事件监听来响应用户的交互行为,如点击按钮、滚动页面等。事件处理器可以绑定在元素上,通过addEventListener和removeEventListener来添加和移除。 五、AJAX与Fetch 异步JavaScript和...
`jquery-1.3.js`表明项目中使用了jQuery,这是一个流行的JavaScript库,简化了DOM操作、事件处理和Ajax交互。jQuery使得在页面上选取、操作和动画化元素变得更加容易,对于创建流程图的交互性至关重要。 3. **Drag...
5. DOM事件处理:JavaScript通过事件驱动进行交互。事件会在特定的动作(如点击、按键、加载等)发生时被触发,DOM提供了添加和移除事件监听器的接口。学习如何在DOM元素上绑定事件和编写事件处理函数是提高网页交互...
JavaScript事件处理是实现用户交互的关键。了解如何添加和移除事件监听器,以及如何处理不同类型的事件(如点击、鼠标移动、键盘输入等)是必要的。现代JavaScript通常推荐使用`addEventListener`和`...