2015-06-19 6 views
2

Я пытаюсь связать нажатия клавиш и изменения значений формы с функцией обновления, чтобы конечный пользователь мог видеть эффект от их обновлений в реальном времени. По какой-то причине он вообще не стреляет.jQuery bind on keypress not firing

HTML

<fieldset class="IOPS-field"> 
    <legend>IOPS/Bandwidth</legend> 
    <table> 
     <tr> 
      <td> 
       <input type="radio" name="bandwidth" value="IOPS-block" checked>IOPS at Block Size: 
      </td> 
      <td> 
       <input type="text" name="IOPS" id="IOPS" value="500000" size="3"> at 
       <select id="block-size"> 
        <option value="4096" selected>4K</option> 
        <option value="8192">8K</option> 
        <option value="16384">16K</option> 
        <option value="32786">32K</option> 
        <option value="65536">64K</option> 
       </select> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       <input type="radio" name="bandwidth" value="pure-bandwidth">Bandwidth (GBps): 
      </td> 
      <td> 
       <input type="text" name="bandwidth-entry" value="1953.125" id="bw" size="6"> 
      </td> 
     </tr> 
    </table> 
</fieldset> 

JQuery/JavaScript

function iops_bw_update(toUpdate) { 
     var iops = parseInt($("#IOPS").val()); 
     var block = parseInt($("#block-size").val()); 
     var bw = parseFloat($("#bw").val()); 

     if (toUpdate == "BW") { 
      $("#bw").val((iops*block)/1048576); 
     } 
     else { 
      $("#IOPS").val((bw*1048576)/block); 
     } 
} 

$(document).ready(function(){  
    $("#IOPS").bind("keypress", iops_bw_update("BW")); 
    $("#bw").bind("keypress", iops_bw_update("IOPS")); 
    $("#block-size").bind("change", iops_bw_update("BW")); 
}); 
+0

Попробуйте использовать .on вместо bind, так как bind устарел для последних версий jQuery – Balder

+0

@Balder. Он ничего не говорит о том, что он устарел на http://api.jquery.com/bind/ – Barmar

+0

Простите, вы правы - это жизнь, которую не рекомендуется! – Balder

ответ

1

Вам необходимо пройти функцию реф вместо передачи значения функции.

$("#IOPS").bind("keypress", your_function); // note: no() when no params need to be passed! 

Правильный способ связывания обработчика с Params является:

$(document).ready(function(){  
    $("#IOPS").bind("keypress", function() { 
     iops_bw_update("BW"); 
    }); 
    $("#bw").bind("keypress", function() { 
     iops_bw_update("IOPS"); 
    }); 
    $("#block-size").bind("change", function() { 
     iops_bw_update("BW"); 
    }); 
}); 
+0

Это сработало отлично! Спасибо огромное! Я соглашусь через 5 минут, когда смогу. – 99ProblemsAndTheyreAllCode

0

Вы не перевязывали функцию. Вы это назвали.

попробовать так:

$(document).ready(function(){  
    $("#IOPS").bind("keypress", iops_bw_update); 
    $("#bw").bind("keypress", iops_bw_update); 
    $("#block-size").bind("change", iops_bw_update); 
}); 
+0

Я обновил код, чтобы предлагать функции напрямую, привязка не давала мне поведения, которое я искал. Еще не стрелял. – 99ProblemsAndTheyreAllCode

+0

Снова вы делаете ту же ошибку. При связывании вы вызываете функцию с помощью скобок. Например: '$ (" # IOPS "). Keypress (iops_bw_update);' – Vikash

+0

Внутри iops_bw_update вы можете использовать this.id, чтобы проверить, какое поле ввода запустило эту функцию. – Vikash

0

В JavaScript() означает, что вызов функции. Если вы хотите, чтобы связать функцию, которую вы должны поставить только имя функции, например:

$(document).ready(function(){  
    $("#IOPS").keypress(iops_bw_update); 
    $("#bw").keypress(iops_bw_update); 
    $("#block-size").change(iops_bw_update); 
}); 

вам не нужно ставить полную функцию связывания. Только имя без().