AttachEvent를 사용하여 동일한 이벤트를 여러 번 바인딩하는 것은 충돌하는 이벤트 함수 정의를 해결하는 중요한 방법입니다. 그러나 IE에서는 함수의 this 포인터가 바인딩된 요소가 아니라 함수 객체를 가리키며, 애플리케이션에서는 로컬 변수를 사용하여 요소를 전송하려고 하면 클로저 오류가 발생합니다. . 메모리 누수. 그렇다면 이 문제를 어떻게 해결해야 할까요?
Function에 프로토타입 메소드 "bindNode"를 추가했습니다. 이 메소드에서는 전달된 요소를 기반으로 전역 저장소 변환을 수행한 후 캡슐화된 함수를 반환하고 호출 메소드를 사용하여 소유자 변환을 수행합니다.
]
외부 J를 도입해야 하는 경우 실행하려면 새로 고쳐야 합니다.
]
폐쇄되지 않습니다
물론 그럴 겁니다. 드립을 사용해 테스트해 보세요
http://www.script8.com/download/drip.rar<script>
if(!document.all){
HTMLElement.prototype.attachEvent=function(sType,foo){
this.addEventListener(sType.slice(2),foo,false)
}
}
Function.prototype.bindNode=function(oNode){
var foo=this,iNodeItem
//使用了全局数组__bindNodes,通过局部变量iNodeItem进行跨函数传值,如果直接传送oNode,也将造成闭包
if(window.__bindNodes==null)
__bindNodes=[]
__bindNodes.push(oNode)
iNodeItem=__bindNodes.length-1
oNode=null
return function(e){
foo.call(__bindNodes[iNodeItem],e||event)
}
}
abc()
function abc(){
var bt=document.getElementById("btTest")
bt.attachEvent("onclick",function(){
//如果不经过bindNode处理,下面的结果将是undefined
alert(this.tagName)
}.bindNode(bt))
bt=null
}
</script><script>
abc()
function abc(){
var bt=document.getElementById("btTest")
bt.attachEvent("onclick",function(){
//如果不经过bindNode处理,下面的结果将是undefined
alert(bt.tagName)
})
}
</script>