2012-02-06 2 views
1

나는 이것이 "고전적"이며 이미이 주제에 대해 다른 설명적인 기사를 읽으려고 시도 했음에도 불구하고 여전히 어떻게 든 그것을 잘못 관리하고있다. 자바 스크립트 루프에서 이벤트 핸들러와 함수를 추가하는 것에 대해 이야기하고 있습니다.이벤트 루프에 붙이기, 자바 스크립트

여기에 문제 (그것이 제안 박스/자동 완성의)

function autoCompleteCB(results) { 
document.getElementById('autocom').innerHTML = ''; 
if (results.length == 0) { 
    document.getElementById('autocom').style.display = 'none'; 
} else { 
    document.getElementById('autocom').style.display = 'block'; 
    var divholders = []; 
    for (var i = 0; i < results.length; i++) { 
     divholders[i] = document.createElement('div'); 
     divholders[i].style.width = '350px'; 
     var divrestext = document.createElement('div'); 
     divrestext.className = 'autocom0'; 
     divrestext.innerHTML = results[i][0]; 
     divholders[i].appendChild(divrestext); 
     var divrestype = document.createElement('div'); 
     divrestype.className = 'autocom1' + results[i][1]; 
     divrestype.innerHTML = results[i][1]; 
     divholders[i].appendChild(divrestype); 
     divholders[i].attachEvent('onmouseover', (function(i) { return function() { divholders[i].style.backgroundColor='#266699'; }; })(i)); 
     divholders[i].attachEvent('onmouseout', (function (i) { return function() { divholders[i].style.backgroundColor = '#F5F5F5'; }; })(i)); 
     document.getElementById('autocom').appendChild(divholders[i]); 
    } 
} 
} 

그것은 (물론)는 작동하지 않습니다는 attachEvent 라인 내 코드입니다. 자바 스크립트 의이 부분은 너무 이상한/까다로운 :) 친절한 전문가가 그 두 줄을 수정하는 데 도움이 될 수 있습니까?


은 절반 방법의 수정이다 (I 생각 (:

function bindEvent(element, type, listener) { 
if (element.addEventListener) { 
    element.addEventListener(type, listener, false); 
} else if (element.attachEvent) { 
    element.attachEvent('on' + type, listener); 
} 
} 
function autoCompleteCB(results) { 
document.getElementById('autocom').innerHTML = ''; 
if (results.length == 0) { 
    document.getElementById('autocom').style.display = 'none'; 
} else { 
    document.getElementById('autocom').style.display = 'block'; 
    var divholders = []; 
    for (var i = 0; i < results.length; i++) { 
     divholders[i] = document.createElement('div'); 
     divholders[i].style.width = '350px'; 
     var divrestext = document.createElement('div'); 
     divrestext.className = 'autocom0'; 
     divrestext.innerHTML = results[i][0]; 
     divholders[i].appendChild(divrestext); 
     var divrestype = document.createElement('div'); 
     divrestype.className = 'autocom1' + results[i][1]; 
     divrestype.innerHTML = results[i][1]; 
     // BIND THE EVENTS 
     divholders[i].appendChild(divrestype); 
     document.getElementById('autocom').appendChild(divholders[i]); 
    } 
} 
} 

지금과 같다,하지만 여전히 "조치"

function autoComplete() { 
var ss = document.getElementById('txbkeyword').value; 
if (ss.length > 0) { CSearch.SearchAutoComplete(ss, 3, autoCompleteCB); } 
else { document.getElementById('autocom').style.display = 'none'; } 

} 
function bindEvent(element, type, listener) { 
if (element.addEventListener) { 
    element.addEventListener(type, listener, false); 
} else if (element.attachEvent) { 
    element.attachEvent('on' + type, listener); 
} 
} 
function autoCompleteCB(results) { 
document.getElementById('autocom').innerHTML = ''; 
if (results.length == 0) { 
    document.getElementById('autocom').style.display = 'none'; 
} else { 
    document.getElementById('autocom').style.display = 'block'; 
    var divholders = []; 
    for (var i = 0; i < results.length; i++) { 
     divholders[i] = document.createElement('div'); 
     divholders[i].style.width = '350px'; 
     var divrestext = document.createElement('div'); 
     divrestext.className = 'autocom0'; 
     divrestext.innerHTML = results[i][0]; 
     divholders[i].appendChild(divrestext); 
     var divrestype = document.createElement('div'); 
     divrestype.className = 'autocom1' + results[i][1]; 
     divrestype.innerHTML = results[i][1]; 
     (function (i) { 
      bindEvent(divholders[i], 'mouseover', function() { 
       divholders[i].style.backgroundColor = '#266699'; 
      }); 
      bindEvent(divholders[i], 'mouseout', function() { 
       divholders[i].style.backgroundColor = '#F5F5F5'; 
      }); 
     })(i); 
     divholders[i].appendChild(divrestype); 
     document.getElementById('autocom').appendChild(divholders[i]); 
    } 
} 
} 
+1

*이 수행는 attachEvent 라인 (물론)입니다 * 그들은 어떤 의미에서 작동하지 않습니까? –

+0

색깔이 바뀌지 않습니다 – Jesper

+0

왜'this' 대신에'i' 인덱스가 전달됩니까? 함수는 'divholders'에 액세스 할 수 있습니까? –

답변

2

attachEvent은 IE 규격 ific. 다른 많은 브라우저에서는 attachEventListener을 사용해야합니다.

그리고, 현재 브라우저의 "적절한"방법을 사용하여, 당신이해야합니다 (snippet from MDN)을 특징으로 감지 :

if (el.addEventListener){ 
    el.addEventListener('click', modifyText, false); 
} else if (el.attachEvent){ 
    el.attachEvent('onclick', modifyText); 
} 

또한이에 도움이 함수를 만들 수 있습니다

function bindEvent(element, type, listener) { 
    if (element.addEventListener) { 
     element.addEventListener(type, listener, false); 
    } else if (element.attachEvent) { 
     element.attachEvent('on' + type, listener); 
    } 
} 

그런 다음,이 두 라인 대신에 :

divholders[i].attachEvent('onmouseover', (function(i) { return function() { divholders[i].style.backgroundColor='#266699'; }; })(i)); 
divholders[i].attachEvent('onmouseout', (function (i) { return function() { divholders[i].style.backgroundColor = '#F5F5F5'; }; })(i)); 

... 빈의 기능을 사용 D 당신의 핸들러 (이벤트 유형 인수에 on을 건너 뛰는) :

(function (i) { 
    bindEvent(divholders[i], 'mouseover', function() { 
     divholders[i].style.backgroundColor = '#266699'; 
    }); 
    bindEvent(divholders[i], 'mouseout', function() { 
     divholders[i].style.backgroundColor = '#F5F5F5'; 
    }); 
})(i); 

당신은 또한 단지 둘러싸 수있는 <div> :

(function (div, i) { 
    bindEvent(div, 'mouseover', function() { 
     div.style.backgroundColor = '#266699'; 
    }); 
    bindEvent(div, 'mouseout', function() { 
     div.style.backgroundColor = '#F5F5F5'; 
    }); 
})(divholders[i], i); 
+0

안녕하세요, 귀하의 요점과 크로스 브라우저 첨부 이벤트 기능을 완전히 볼 수 있지만 사용 방법/마지막 두 조각 중 하나를 넣을 위치가 확실하지 않습니다 ... 내 루프 안에 있습니까? 좀 더 도와 주실 수 있나요? 제 질문에 편집에 중도 해답을 넣을 게요 – Jesper

+0

@Jesper Apologies. 스 니펫은 2 개의 divholders [i] .attachEvent (...);'호출 (또는 편집 할 때 이벤트가있는 곳)에 있어야합니다. –

+0

고마워, 일종의 알아 냈어 :)하지만 그들은 여전히 ​​색깔을 바꾸지 않는다. 최신 수정본을 붙여 넣습니다. – Jesper

-1

이 시도 :

divholders[i].attachEvent('onmouseover', this.style.backgroundColor='#266699'); 
+0

아니, 그게 쉽지는 않다. 왜냐하면 나는 다른 범위에 있기 때문이다. "거의"내 코드로 봐야하지만 약간의 수정이 필요합니다 ... 예제에서 'this'는 정의되지 않았습니다 – Jesper

+0

'this.style .... '에서'function() {...}'을 잊었을 것입니다. 그러나 그때조차도 효과가 없을 것입니다. IE는 이벤트 핸들러가 첨부 된 요소에'this '를 설정하지 않습니다 ('divholders [i] .onmouseover = function() {...} '). –

+0

사과; 서둘러 답장을 썼다. 왜 설정하지 var obj = divholders [i]; 다음 do obj.attachEvent ('onmouseover', obj.style.backgroundColor = '# 266699'); – user879355