Soru Javascript döngüsündeki etkinlik işleyicileri - bir kapatmaya mı gereksinim duyar?


Bir başkasından devraldığım bir html ve Javascript koduyla çalışıyorum. Sayfa, her on saniyede bir veri tablosunu (zamanuyumsuz bir istek yoluyla) yeniden yükler ve ardından bazı DOM kodlarını kullanarak tabloyu yeniden oluşturur. Söz konusu kod böyle bir şeye benziyor:

var blah = xmlres.getElementsByTagName('blah');
for(var i = 0; i < blah.length; i++) {
    var td = document.createElement('td');
    var select = document.createElement('select');
    select.setAttribute("...", "...");
    select.onchange = function() {
        onStatusChanged(select, callid, anotherid);
    };
    td.appendChild(select);
}

Ne zaman onchange olay bir için kovuldu <select> Ancak öğe, aynı değerlerin onStatusChanged() her biri için yöntem <select> Tabloda (Döngünün her yinelemesinde callid ve anotherid yeni, ayrı değerler verilmektedir).

Olay işleyicisini nasıl ayarlayacağımın yapısı nedeniyle ortaya çıktığından şüpheleniyorum. select.onchange = function() sözdizimi. Bunun nasıl düzgün çalıştığını anlarsam, bu sözdizimi, onchange olayı için, bu iki başvuruyu ifade eden bir işlev olarak bir kapanış kurar ve bu da, döngünün son yinelemesinde ayarlanmış her ne olursa olsun, son bir değere sahip olur. Etkinlik tetiklendiğinde, başvurulan değer callid ve anotherid son yinelemede ayarlanan değerdir, tek tek yineleme olarak ayarlanan değer değil.

Geçirdiğim parametrelerin değerini kopyalayabilmemin bir yolu var mı onStatusChanged()?

Soruyu ve kabul edilen cevabı daha iyi yansıtmak için başlığı değiştirdim.


35
2017-12-04 19:15


Menşei




Cevaplar:


Gerçekten de burada bir kapatma gerçekleştirmelisiniz. Bu meli iş (bana haber ver - test etmedim)

var blah = xmlres.getElementsByTagName('blah');
for(var i = 0; i < blah.length; i++) {
    var td = document.createElement('td');
    var select = document.createElement('select');
    select.setAttribute("...", "...");
    select.onchange = function(s,c,a)
    {
        return function()
        {
            onStatusChanged(s,c,a);
        }
    }(select, callid, anotherid);
    td.appendChild(select);
}

50
2017-12-04 19:30



Bu gerçekten çalışıyor - teşekkürler! - matt b
Ayrıca keşfettiğim başka bir çözüm - gerçekten bir çözüm - callid ve anotherid öğelerini DOM öğesindeki öznitelikler olarak depolamak olacaktır ve eventhandler içindekiler sadece this.getAttribute () yoluyla başvurulanlardır. - matt b
Buna geçici bir çözüm demezdim. Beklediğim şey, işleyicinin bir kez ayarlanmasını (döngü boyunca her zaman değil) ve değişkenlerin kendisini keşfetmesini sağlamaktır. - dkretz
OP'nin de bir kapanış olduğunu unutmayın. Ve gerçekten de OP, kapamanızın çevreyi diğer kapanışlarla paylaştığı daha temsili bir biçime sahiptir (döngü başına bir kapanma oluşturulur). Ama bu beklenmedik etkiyi veren tam olarak budur. - Jo So