试图在同一输入字段上调用两个函数,但只调用一个

时间:2011-05-10 16:57:30

标签: javascript javascript-events

我有两个工作函数,我想分配给两个输入:

<input type="text" id="start0" value="0" name="start[]" onkeyup="displayTotal();"/>
<input type="text" id="end0" value="0" name="end[]"  onkeyup="displayTotal();"/>

我希望能够使用displayHoras(); onkeyup也是这两个。 (此线程已经有2个2s)。当我使用displayHoras();而不是displayTotal();它有效,但是当我把它们都这样叫它时它不会:

<input type="text" id="start0" value="0" name="start[]" onkeyup="displayTotal();displayHoras();"/>
<input type="text" id="end0" value="0" name="end[]"  onkeyup="displayTotal();displayHoras();"/>

欢迎任何帮助。

我将分享这两个功能的代码,因为......谁知道?可能存在问题,对吗?

function displayTotal()
{
   var tableRows = document.getElementById('budgetTable').getElementsByTagName('tr');
   var totalDays = tableRows.length - 3; //Don't count the header rows and the Total rows

   var totalPrice = 0;

   var price = filterNum(document.getElementById( 'txtPrice' ).value);
   var totalField = document.getElementById( 'txtTotal' );

   var tempHours = 0;
   var tempTotal = 0; 

   for(var i = 0; i < totalDays; i++)
   {
       tempHours = document.getElementById("end" + i).value - document.getElementById("start" + i).value;
       tempTotal = tempHours * price;

       document.getElementById("total" + i).innerHTML = formatCurrency(tempTotal);
       totalPrice += tempTotal;
   }
   totalField.value = formatCurrency(totalPrice*1.21); 
}

function displayHoras()
{
    var tableRows = document.getElementById('budgetTable').getElementsByTagName('tr');
    var totalDays = tableRows.length - 3;

    var tempHours = 0;
    var tempTotal = 0;

    for(var i = 0; i < totalDays; i++)
    {
       tempHours = document.getElementById("end" + i).value - document.getElementById("start" + i).value;
       document.getElementById("totalHoras" + i).innerHTML = tempHours;         
    }    
}

编辑:我添加了创建下表的函数。

function keyUpCall() {displayHoras(); displayTotal();}
function addRowToTable()
{
    var tbl = document.getElementById('budgetTable');
    var lastRow = tbl.rows.length - 4;
    var iteration = lastRow;
    var entry = iteration - 1; //because we started with day0, etc 
    var row = tbl.insertRow(lastRow);

    // day cell
    var cellDay = row.insertCell(0);
    cellDay.appendChild(createInput('text','dia' + entry, '', keyUpCall, 'dia' + entry));

    // start cell
    var cellStart = row.insertCell(1);
    cellStart.appendChild(createInput('text','start' + entry, 0, keyUpCall, 'start' + entry));

    // end cell
    var cellEnd = row.insertCell(2);
    cellEnd.appendChild(createInput('text','end' + entry, 0, keyUpCall, 'end' + entry));

    // precio unitario
    var cellPrecioUnitario = row.insertCell(3);
    cellPrecioUnitario.appendChild(createInput('text', null, '$36', null, null));

    // total HOras
    var cellTotalHoras = row.insertCell(4);
    cellTotalHoras.id = 'totalHoras' + entry;

    // total cell
    var cellTotal = row.insertCell(5);
    cellTotal.id = 'total' + entry;

}

function createInput(type, id, value, action, name)
{   
    var el = document.createElement('input');
    el.type = type;
    el.id = id;
    el.value = value;
    el.onkeyup = action;
    el.name = name;
    return el;
}

此时,由于某种原因,行动甚至没有附加。

Edit2:我解决了问题! IUPI!就是这条线:     var totalDays = tableRows.length - 3;

在此表单的上一个版本中,我使用了3个额外的行,我的客户让我为Tax添加了几个额外的行并且没有Tax结果。我改成了:     var totalDays = tableRows.length - 5; 这就解决了!

4 个答案:

答案 0 :(得分:3)

您可以创建一个调用这两个函数的函数

function function1(){ displayTotal(); displayHoras();}

答案 1 :(得分:2)

我建议创建一个函数,然后调用你的两个函数,例如:

function handleKeyUp() { // Or `updateDisplay` or some such
    displayTotal();
    displayHoras();
}

onXYZ属性中放置太多文本是有问题的(虽然我没有立即看到你的原因不起作用)。


非主题1 :我还建议使用DOM2方法连接事件处理程序(addEventListener在符合标准的浏览器上,attachEvent在IE8及更低版本上)而不是像onXYZ属性那样使用DOM0机制。

非主题2 jQueryPrototypeYUIClosureany of several others等JavaScript库可以帮助平滑浏览器差异(甚至错误),如上面的事件附件,以及提供许多方便的实用程序功能。完全可选,但使用一个可以帮助您专注于您实际尝试的操作,而不必担心各种不同浏览器中的管道略有不同。

答案 2 :(得分:1)

老派javascript ^^

尝试使用此替代属性变体,并使用bugzilla或javascript调试器

var checks_keyup = function() {
    displayTotal();
    displayHoras();
}

var inputs = document.getElementsByTagName('input');
for(var i=0;i<inputs.length;i++) {
    if(/^(start|end)/.test(inputs[i].id))
        inputs[i].onkeyup = checks_keyup;
}

答案 3 :(得分:0)

尝试在第一个函数中调用第二个函数,

function displayTotal()
{
\\.....your code

 displayHoras();

}