2012-02-06 8 views
1

私はこれが "クラシック"であることを知っていますが、私はすでにこのテーマについて別の説明記事を読んでいますが、どうにかして間違っています。私は、イベントハンドラと関数をjavascriptループで追加することについて話しています。ループ内のイベントを添付する、JavaScript

は、ここでの問題(それが示唆ボックス/自動補完です)

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ラインと私のコードです。 JavaScriptのこの部分はとても奇妙な/トリッキー:)親切な専門家は、私はそれらの2つの行を修正することができますか?


この

はハーフウェイの修正です(私は思う(:

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); 
    } 
} 

次に、これらの2行の代わりに:

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

こんにちは、私はあなたのポイントとクロスブラウザのアタッチイベント機能を完全に見ていますが、私はどのように/最後の2つのスニペットの1つを入れて使用するかわかりません...私のループの中に?もう少しお手伝いできますか?私は私の質問に編集の中途半端な解決策を入れます – 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

関連する問題