2016-12-01 76 views
3

我有一個像excel一樣工作的表格。用戶可以使用箭頭鍵導航整個表格。但是,當我試圖禁用它的一些文本框時,它仍然捕獲禁用的單元格,當我嘗試輸入文本時,該值正在可編輯單元格上添加。我怎樣才能解決這個問題?謝謝。使用箭頭鍵導航表格單元格並忽略禁用的單元格

這是我到目前爲止。

var active = 0; 
 
//$('#navigate td').each(function(idx){$(this).html(idx);}); 
 
rePosition(); 
 

 
$(document).keydown(function(e) { 
 
    var inp = String.fromCharCode(event.keyCode); 
 
    if (!(/[a-zA-Z0-9-_ ]/.test(inp) || event.keyCode == 96)) { 
 
    reCalculate(e); 
 
    rePosition(); 
 
    // if key is an arrow key, don't type the user input. 
 
    // if it is any other key (a, b, c, etc) 
 
    // edit the text 
 
    if (e.keyCode > 36 && e.keyCode < 41) { 
 
     return false; 
 
    } 
 
    } 
 
}); 
 

 
$('td').click(function() { 
 
    active = $(this).closest('table tbody').find('td').index(this); 
 
    rePosition(); 
 
}); 
 

 

 
function reCalculate(e) { 
 
    var rows = $('#navigate tbody tr').length; 
 
    var columns = $('#navigate tbody tr:eq(0) td').length; 
 
    var temp; 
 

 
    if (e.keyCode == 37) { //move left or wrap 
 
    temp = active; 
 
    while (temp > 0) { 
 
     temp = temp - 1; 
 
     // only advance if there is an input field in the td 
 
     if ($('#navigate tbody tr td').eq(temp).find('input').length != 0) { 
 
     active = temp; 
 
     break; 
 
     } 
 
    } 
 
    } 
 
    if (e.keyCode == 38) { // move up 
 
    temp = active; 
 
    while (temp - columns >= 0) { 
 
     temp = temp - columns; 
 
     // only advance if there is an input field in the td 
 
     if ($('#navigate tbody tr td').eq(temp).find('input').length != 0) { 
 
     active = temp; 
 
     break; 
 
     } 
 
    } 
 
    } 
 
    if (e.keyCode == 39) { // move right or wrap 
 
    temp = active; 
 
    while (temp < (columns * rows) - 1) { 
 
     temp = temp + 1; 
 
     // only advance if there is an input field in the td 
 
     if ($('#navigate tbody tr td').eq(temp).find('input').length != 0) { 
 
     active = temp; 
 
     break; 
 
     } 
 
    } 
 
    } 
 
    if (e.keyCode == 40) { // move down 
 
    temp = active; 
 
    while (temp + columns <= (rows * columns) - 1) { 
 
     temp = temp + columns; 
 
     // only advance if there is an input field in the td 
 
     if ($('#navigate tbody tr td').eq(temp).find('input').length != 0) { 
 
     active = temp; 
 
     break; 
 
     } 
 
    } 
 
    } 
 
} 
 

 
function rePosition() { 
 
    $("#input1, #input3").prop("disabled", true); 
 

 
    console.log(active); 
 
    $('.active').removeClass('active'); 
 
    $('#navigate tbody tr td').eq(active).addClass('active'); 
 
    $('#navigate tbody tr td').find('input').removeClass('textClass'); 
 
    $('#navigate tbody tr td').eq(active).find('input').addClass('textClass'); 
 
    $('#navigate tbody tr td').eq(active).find('input').select(); 
 
    var input = $('#navigate tbody tr td').eq(active).find('input').focus(); 
 
    scrollInView(); 
 
} 
 

 
function scrollInView() { 
 
    var target = $('#navigate tbody tr td:eq(' + active + ')'); 
 
    if (target.length) { 
 
    var top = target.offset().top; 
 

 
    $('html,body').stop().animate({ 
 
     scrollTop: top - 100 
 
    }, 400); 
 
    return false; 
 
    } 
 
}
td.active { 
 
    border: 2px solid #2c3e50; 
 
    font-weight: bold; 
 
    background-color: #ddd; 
 
} 
 
.textClass { 
 
    font-weight: bold; 
 
} 
 
input:focus { 
 
    outline: none; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<table border="1" id="navigate"> 
 
    <thead> 
 
    <th>CELL 1</th> 
 
    <th>CELL 2</th> 
 
    <th>CELL 3</th> 
 
    <th>CELL 4</th> 
 
    <th>CELL 5</th> 
 
    </thead> 
 
    <tbody> 
 
    <tr> 
 
     <td> 
 
     <input id="input1" type="text" value="CELL 1" /> 
 
     </td> 
 
     <td> 
 
     <input id="input2" type="text" value="CELL 2" /> 
 
     </td> 
 
     <td> 
 
     <input id="input3" type="text" value="CELL 3" /> 
 
     </td> 
 
     <td> 
 
     <input id="input4" type="text" value="CELL 4" /> 
 
     </td> 
 
     <td> 
 
     <input id="input5" type="text" value="CELL 5" /> 
 
     </td> 
 
    </tr> 
 
    <tr> 
 
     <td> 
 
     <input id="input1" type="text" value="CELL 1" /> 
 
     </td> 
 
     <td> 
 
     <input id="input2" type="text" value="CELL 2" /> 
 
     </td> 
 
     <td> 
 
     <input id="input3" type="text" value="CELL 3" /> 
 
     </td> 
 
     <td> 
 
     <input id="input4" type="text" value="CELL 4" /> 
 
     </td> 
 
     <td> 
 
     <input id="input5" type="text" value="CELL 5" /> 
 
     </td> 
 
    </tr> 
 
    <tr> 
 
     <td> 
 
     <input id="input1" type="text" value="CELL 1" /> 
 
     </td> 
 
     <td> 
 
     <input id="input2" type="text" value="CELL 2" /> 
 
     </td> 
 
     <td> 
 
     <input id="input3" type="text" value="CELL 3" /> 
 
     </td> 
 
     <td> 
 
     <input id="input4" type="text" value="CELL 4" /> 
 
     </td> 
 
     <td> 
 
     <input id="input5" type="text" value="CELL 5" /> 
 
     </td> 
 
    </tr> 
 
    <tr> 
 
     <td> 
 
     <input id="input1" type="text" value="CELL 1" /> 
 
     </td> 
 
     <td> 
 
     <input id="input2" type="text" value="CELL 2" /> 
 
     </td> 
 
     <td> 
 
     <input id="input3" type="text" value="CELL 3" /> 
 
     </td> 
 
     <td> 
 
     <input id="input4" type="text" value="CELL 4" /> 
 
     </td> 
 
     <td> 
 
     <input id="input5" type="text" value="CELL 5" /> 
 
     </td> 
 
    </tr> 
 

 
    </tbody> 
 

 

 

 
    <table border="1" id="table2"> 
 
    <tr> 
 
     <td> 
 
     <input type="text" id="inputb1" value="CELL 1" /> 
 
     </td> 
 
     <td> 
 
     <input type="text" id="inputb2" value="CELL 2" /> 
 
     </td> 
 
     <td> 
 
     <input type="text" id="inputb3" value="CELL 3" /> 
 
     </td> 
 
     <td> 
 
     <input type="text" id="inputb4" value="CELL 4" /> 
 
     </td> 
 
     <td> 
 
     <input type="text" id="inputb5" value="CELL 5" /> 
 
     </td> 
 
    </tr> 
 
    <tbody> 
 
     <tr> 
 
     <td> 
 
      <input type="text" id="inputb1" value="CELL 1" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb2" value="CELL 2" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb3" value="CELL 3" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb4" value="CELL 4" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb5" value="CELL 5" /> 
 
     </td> 
 
     </tr> 
 
     <tr> 
 
     <td> 
 
      <input type="text" id="inputb1" value="CELL 1" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb2" value="CELL 2" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb3" value="CELL 3" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb4" value="CELL 4" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb5" value="CELL 5" /> 
 
     </td> 
 
     </tr> 
 
     <tr> 
 
     <td> 
 
      <input type="text" id="inputb1" value="CELL 1" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb2" value="CELL 2" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb3" value="CELL 3" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb4" value="CELL 4" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb5" value="CELL 5" /> 
 
     </td> 
 
     </tr> 
 
     <tr> 
 
     <td> 
 
      <input type="text" id="inputb1" value="CELL 1" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb2" value="CELL 2" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb3" value="CELL 3" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb4" value="CELL 4" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb5" value="CELL 5" /> 
 
     </td> 
 
     </tr> 
 

 
    </tbody> 
 
    </table>

+0

在HTML中是否有* Disabled *單元格。我看不到任何東西! – Vikrant

+0

我將禁用屬性使用javascript,因爲我綁定了我的文本框後端。 –

+0

$(「#input1,#input3」)。prop(「disabled」,true);我把它放在復位功能上。我想我把它放錯了:( –

回答

1

按規定,你可以使用

find('input:not(:disabled)') 

有了這個,你可以跳過禁用細胞和明年啓用細胞直接關注。 例子:

if (e.keyCode == 37) { //move left or wrap 
     temp = active; 
     while (temp > 0) { 
      temp = temp - 1; 
      // only advance if there is an input field in the td 
      if ($('.tblnavigate tbody tr td').eq(temp).find('input:not(:disabled)').length != 0) { 
       active = temp; 
       break; 
      } 
     } 
    } 

Complete Solution

而且,如果你想明確地關注殘疾人細胞,你可以使用鼠標單擊它。

0

所有你需要的是重新計算的方法來修改查找選擇。更新了片段。 而不是find('input')使用find('input:not(:disabled)')

希望這有助於。

var active = 0; 
 
//$('#navigate td').each(function(idx){$(this).html(idx);}); 
 
rePosition(); 
 

 
$(document).keydown(function(e) { 
 
    var inp = String.fromCharCode(event.keyCode); 
 
    if (!(/[a-zA-Z0-9-_ ]/.test(inp) || event.keyCode == 96)) { 
 
    reCalculate(e); 
 
    rePosition(); 
 
    // if key is an arrow key, don't type the user input. 
 
    // if it is any other key (a, b, c, etc) 
 
    // edit the text 
 
    if (e.keyCode > 36 && e.keyCode < 41) { 
 
     return false; 
 
    } 
 
    } 
 
}); 
 

 
$('td').click(function() { 
 
    active = $(this).closest('table tbody').find('td').index(this); 
 
    rePosition(); 
 
}); 
 

 

 
function reCalculate(e) { 
 
    var rows = $('#navigate tbody tr').length; 
 
    var columns = $('#navigate tbody tr:eq(0) td').length; 
 
    var temp; 
 

 
    if (e.keyCode == 37) { //move left or wrap 
 
    temp = active; 
 
    while (temp > 0) { 
 
     temp = temp - 1; 
 
     // only advance if there is an input field in the td 
 
     if ($('#navigate tbody tr td').eq(temp).find('input:not(:disabled)').length != 0) { 
 
     active = temp; 
 
     break; 
 
     } 
 
    } 
 
    } 
 
    if (e.keyCode == 38) { // move up 
 
    temp = active; 
 
    while (temp - columns >= 0) { 
 
     temp = temp - columns; 
 
     // only advance if there is an input field in the td 
 
     if ($('#navigate tbody tr td').eq(temp).find('input:not(:disabled)').length != 0) { 
 
     active = temp; 
 
     break; 
 
     } 
 
    } 
 
    } 
 
    if (e.keyCode == 39) { // move right or wrap 
 
    temp = active; 
 
    while (temp < (columns * rows) - 1) { 
 
     temp = temp + 1; 
 

 
     // only advance if there is an input field in the td 
 
     if ($('#navigate tbody tr td').eq(temp).find('input:not(:disabled)').length != 0) { 
 
     active = temp; 
 
     break; 
 
     } 
 
    } 
 
    } 
 
    if (e.keyCode == 40) { // move down 
 
    temp = active; 
 
    while (temp + columns <= (rows * columns) - 1) { 
 
     temp = temp + columns; 
 
     // only advance if there is an input field in the td 
 
     if ($('#navigate tbody tr td').eq(temp).find('input:not(:disabled)').length != 0) { 
 
     active = temp; 
 
     break; 
 
     } 
 
    } 
 
    } 
 
} 
 

 
function rePosition() { 
 
    $("#input1, #input3").prop("disabled", true); 
 

 
    console.log(active); 
 
    $('.active').removeClass('active'); 
 
    $('#navigate tbody tr td').eq(active).addClass('active'); 
 
    $('#navigate tbody tr td').find('input').removeClass('textClass'); 
 
    $('#navigate tbody tr td').eq(active).find('input').addClass('textClass'); 
 
    $('#navigate tbody tr td').eq(active).find('input').select(); 
 
    var input = $('#navigate tbody tr td').eq(active).find('input').focus(); 
 
    scrollInView(); 
 
} 
 

 
function scrollInView() { 
 
    var target = $('#navigate tbody tr td:eq(' + active + ')'); 
 
    if (target.length) { 
 
    var top = target.offset().top; 
 

 
    $('html,body').stop().animate({ 
 
     scrollTop: top - 100 
 
    }, 400); 
 
    return false; 
 
    } 
 
}
td.active { 
 
    border: 2px solid #2c3e50; 
 
    font-weight: bold; 
 
    background-color: #ddd; 
 
} 
 
.textClass { 
 
    font-weight: bold; 
 
} 
 
input:focus { 
 
    outline: none; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<table border="1" id="navigate"> 
 
    <thead> 
 
    <th>CELL 1</th> 
 
    <th>CELL 2</th> 
 
    <th>CELL 3</th> 
 
    <th>CELL 4</th> 
 
    <th>CELL 5</th> 
 
    </thead> 
 
    <tbody> 
 
    <tr> 
 
     <td> 
 
     <input id="input1" type="text" value="CELL 1" /> 
 
     </td> 
 
     <td> 
 
     <input id="input2" type="text" value="CELL 2" /> 
 
     </td> 
 
     <td> 
 
     <input id="input3" type="text" value="CELL 3" /> 
 
     </td> 
 
     <td> 
 
     <input id="input4" type="text" value="CELL 4" /> 
 
     </td> 
 
     <td> 
 
     <input id="input5" type="text" value="CELL 5" /> 
 
     </td> 
 
    </tr> 
 
    <tr> 
 
     <td> 
 
     <input id="input1" type="text" value="CELL 1" /> 
 
     </td> 
 
     <td> 
 
     <input id="input2" type="text" value="CELL 2" /> 
 
     </td> 
 
     <td> 
 
     <input id="input3" type="text" value="CELL 3" /> 
 
     </td> 
 
     <td> 
 
     <input id="input4" type="text" value="CELL 4" /> 
 
     </td> 
 
     <td> 
 
     <input id="input5" type="text" value="CELL 5" /> 
 
     </td> 
 
    </tr> 
 
    <tr> 
 
     <td> 
 
     <input id="input1" type="text" value="CELL 1" /> 
 
     </td> 
 
     <td> 
 
     <input id="input2" type="text" value="CELL 2" /> 
 
     </td> 
 
     <td> 
 
     <input id="input3" type="text" value="CELL 3" /> 
 
     </td> 
 
     <td> 
 
     <input id="input4" type="text" value="CELL 4" /> 
 
     </td> 
 
     <td> 
 
     <input id="input5" type="text" value="CELL 5" /> 
 
     </td> 
 
    </tr> 
 
    <tr> 
 
     <td> 
 
     <input id="input1" type="text" value="CELL 1" /> 
 
     </td> 
 
     <td> 
 
     <input id="input2" type="text" value="CELL 2" /> 
 
     </td> 
 
     <td> 
 
     <input id="input3" type="text" value="CELL 3" /> 
 
     </td> 
 
     <td> 
 
     <input id="input4" type="text" value="CELL 4" /> 
 
     </td> 
 
     <td> 
 
     <input id="input5" type="text" value="CELL 5" /> 
 
     </td> 
 
    </tr> 
 

 
    </tbody> 
 

 

 

 
    <table border="1" id="table2"> 
 
    <tr> 
 
     <td> 
 
     <input type="text" id="inputb1" value="CELL 1" /> 
 
     </td> 
 
     <td> 
 
     <input type="text" id="inputb2" value="CELL 2" /> 
 
     </td> 
 
     <td> 
 
     <input type="text" id="inputb3" value="CELL 3" /> 
 
     </td> 
 
     <td> 
 
     <input type="text" id="inputb4" value="CELL 4" /> 
 
     </td> 
 
     <td> 
 
     <input type="text" id="inputb5" value="CELL 5" /> 
 
     </td> 
 
    </tr> 
 
    <tbody> 
 
     <tr> 
 
     <td> 
 
      <input type="text" id="inputb1" value="CELL 1" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb2" value="CELL 2" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb3" value="CELL 3" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb4" value="CELL 4" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb5" value="CELL 5" /> 
 
     </td> 
 
     </tr> 
 
     <tr> 
 
     <td> 
 
      <input type="text" id="inputb1" value="CELL 1" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb2" value="CELL 2" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb3" value="CELL 3" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb4" value="CELL 4" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb5" value="CELL 5" /> 
 
     </td> 
 
     </tr> 
 
     <tr> 
 
     <td> 
 
      <input type="text" id="inputb1" value="CELL 1" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb2" value="CELL 2" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb3" value="CELL 3" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb4" value="CELL 4" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb5" value="CELL 5" /> 
 
     </td> 
 
     </tr> 
 
     <tr> 
 
     <td> 
 
      <input type="text" id="inputb1" value="CELL 1" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb2" value="CELL 2" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb3" value="CELL 3" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb4" value="CELL 4" /> 
 
     </td> 
 
     <td> 
 
      <input type="text" id="inputb5" value="CELL 5" /> 
 
     </td> 
 
     </tr> 
 

 
    </tbody> 
 
    </table>