Похоже, что событие Javascript не добавляется в динамически генерируемое текстовое поле. - PullRequest
2 голосов
/ 25 февраля 2010

Я добавил onkeyup javascript для динамически добавляемого текстового поля в javascript ... Но, похоже, он не работает ....

var cell4 = row.insertCell(3);
cell4.setAttribute('align','center')
var e3 = document.createElement('input');
e3.type = 'text';
e3.name = 'txtqt' + iteration;
e3.id = 'txtqt' + iteration;
e3.onkeyup = totalAmount(event,this,'tblsample');//Adding this lines doesnt work
e3.size = 10;
cell4.appendChild(e3); 

Но когда я использовал

e3.onkeyup = totalAmount;

Это сработало ... Вот моя функция JavaScript,

функция totalAmount (e, obj, tblid) {

var tbl = document.getElementById(tblid);
//alert(tbl);
var tblRows = tbl.rows.length;
//alert(tblRows);
var result =0;

var str1;
if (obj != null) {
  str1 = obj.id;
} else {
  str1 = this.id;
}
var lastChar = str1.substring(5,str1.length);
//alert(lastChar);

if(str1=='txtqt'+lastChar)
{
    var str2 = 'txtup'+lastChar;
    var str3 = 'txtAmount'+lastChar;
    var txtDeduct = document.getElementById(str1).value;
    var txtAmt = document.getElementById(str2).value;
    var txtTotal = document.getElementById(str3);
    var totRes = txtAmt*txtDeduct;
    //var res = formatNumber(totRes,2)
    txtTotal.value = totRes.toFixed(2)
    document.getElementById('txttotAmount').value = totRes.toFixed(2);


    for(i=1;i<=tblRows;i++)
    {
    //alert(tblRows);
        txtTotID = 'txtAmount'+i;
        if(document.getElementById(txtTotID).value!='')
        {

            result =parseFloat(result) + parseFloat(document.getElementById(txtTotID).value);

            //var res= formatNumber(result,2)
            document.getElementById('txtTotalAmount').value = result.toFixed(2);
            document.getElementById('txttotAmount').value = result.toFixed(2);
            //document.getElementById('txtTotalAmount').value = result;
        }

    }

}

}

Ответы [ 2 ]

1 голос
/ 25 февраля 2010

Вам нужно обернуть свой вызов функции в анонимную функцию:

e3.onkeyup = function(event){ totalAmount(event,this,'tblsample'); }

Но еще лучший способ сделать это для обеспечения кросс-браузерной совместимости - использовать функцию addEvent:

function addEvent(obj,type,fn){
    if (obj.addEventListener){
        obj.addEventListener(type,fn,false);
    } else if(obj.attachEvent){
        obj["e"+type+fn]=fn;
        obj[type+fn]=function(){
            obj["e"+type+fn](window.event);
        };
        obj.attachEvent("on"+type,obj[type+fn]);
    };
};

А затем добавьте событие, используя эту функцию:

addEvent(e3,'keyup',function(event){ totalAmount(event,this,'tblsample'); });

Просто гораздо лучший способ обработки событий. Я бы порекомендовал вам перейти на этот метод.

1 голос
/ 25 февраля 2010

onkeyup - это функция. Если вы передадите ему возвращаемое значение totalAmount(event,this,'tblsample');, оно не будет работать (если не вернет функцию).

e3.onkeyup = totalAmount;, вероятно, достаточно.

тогда внутри totalAmount ..

function totalAmount(event) {
    alert(this); // this is the e3 object
}

Поэтому, если вам нужны аргументы this и 'tblsample', я предлагаю вам добавить их к объекту e3, чтобы вы могли получить к ним доступ через ключевое слово this внутри функции totalAmount:

e3.otherScope = this;
e3.tblid = 'tblsample;
e3.onkeyup = totalAmount;

и ..

function totalAmount(event) {
    alert(this); // this is the e3 object
    alert(this.otherScope); // the `this` object in the other scope
    alert(this.tblid); // 'tblsample'
}

Или вы можете просто сделать

var otherScope = this;
e3.onkeyup = function(event) { 
    totalAmount(event, otherSope, 'tblsample'); 
};
...