2014-10-21 4 views
0

많은 데이터가 담긴 큰 테이블이 있습니다. 기본적으로 누군가가 <tr> 위로 마우스를 가져 가면서 편지가 눌러 졌는지 확인하려고합니다. 제가하려고하는 것은 기본적으로 누군가가 f를 누를 때 떠 다니는 줄을 제외하고는 전체 화면에서 사실상 멈추는 것이므로 기본적으로 그 줄에 집중할 수 있습니다. 많은 양의 데이터 가운데에서 쉽게 볼 수 있습니다.<tr>에서 onmouseover를 눌러 키를 눌렀는지 확인하십시오.

여기까지 제가 지금까지 가지고 있습니다. 내가 올바른 방향으로 가고 있는지 모르겠지만 편지를 누르는 것을 감지하지 못합니다. 또한 f를 다시 누르거나 행의 외부를 esc 또는 클릭하면 정상으로 돌아가고 싶습니다.

$(function(){ 

    $('#report tr').on('mouseover',function(){ 
    $('#report tr').removeClass('sel'); 
    $(this).addClass('sel'); 

    $(this).keypress(function(event){ 
     if(event==70){ 
     alert('hello'); 
     } 
    }); 

    }); 

}); 
+0

이것은 실제로 매우 광범위한 질문입니다. 현재의 시도를 너무 광범위하게 생각한다고 말하고 싶습니다. 'f' 대신 CTRL (SHIFT 나 ALT도 가능)을 받아 들일 수 있다면, 그 작업은 훨씬 간단해질 것입니다. 또한 테이블이 얼마나 큰지를 아는 것이 중요합니다. 수백 줄? 수천? 자식 요소가'td' 안에 있거나 내용이 항상 일반 텍스트입니까? 'td' 스타일은 어떤가요? 어때요? "블랙 아웃"은'body'의 배경을 충분히 검은 색으로 설정하거나 커버 요소를 사용하려고 생각한 적이 있습니까? – Teemu

+0

블랙 아웃 부분에 대한 아이디어가 있다면 제안을 위해 열어 둡니다. – Damien

답변

0

나는 같은 것을 할 것입니다 :

$(function() { 
     $('#report tr').hover(
      function() { 
       $(this).addClass('sel'); 
      },function(){ 
       $(this).removeClass('sel') 
      }); 

     $(document).keypress(function (e) { 
      if (e.keyCode == 102) //if they pressed f 
       //do something with the selected item 
     }); 
    }); 

을 기본적으로, 단지 대신 가져가 함수 내에서 특정 요소에 첨부하려고의 문서에 키 누르기 이벤트를 부착.

수정 : 귀하의 의견에 따라 다른 가능성이 있습니다. 당신이뿐만 아니라 셀프 클래스를 제거하는 방법을 추가해야합니다 : 귀하의 예제에서

$(function() { 
     var currentElement; 
     $('#report tr').hover(
      function() { 
       currentElement = $(this); 
      }); 

     $(document).keypress(function (e) { 
      if (e.keyCode == 102) //if they pressed f 
       currentElement.addClass('sel'); 
     }); 
    });  
+0

나는 당신이 그곳에서 한 일을 보았습니다.하지만 실제로 일할 필요가있는 방식으로 작동하지는 않습니다. 나는 기본적으로 f를 눌러야 만하고 하이라이트 나 다른 무언가에 행이있다. 그게 갈 수 없어 : \ – Damien

+0

셀이 정말로 나를 위해 일하지 않는 것 같아요, 내가 지금 내가 무엇을 내가 f를 누르면 현재 떠오르고있어 셀에 추가 할 필요가 있지만 f를 누르면 이후 독립적입니다 hover, f를 누르면 어떤 행을 추가할지 어떻게 알 수 있습니까? – Damien

+0

변수에서 현재 hovered 행을 추적 한 다음 버튼을 클릭 할 때 클래스를 추가 할 수 있습니다. 내 대답을 편집하여 내 뜻을 알려줍니다. – maembe

0

$('#report tr')keypress 이벤트받지 않는 이유에 :

키 누르기 이벤트 핸들러 수 모든 요소에 연결될 수 있지만 이벤트는 포커스가있는 요소에만 전송됩니다.

초점 이벤트는 요소로 전송이 포커스를 얻어 때 : 당신은 단순히 $('#report tr').focus()$('#report tr')에 포커스를 줄 수 그러나

(https://api.jquery.com/keypress/)

. 이 이벤트는 양식 요소 (, 등) 및 링크()와 같은 제한된 요소 집합에 암시 적으로 적용됩니다. 최근 브라우저 버전에서는 이벤트를 명시 적으로 요소의 tabindex 속성을 설정하여 모든 요소 유형을 포함하도록 확장 할 수 있습니다.

(https://api.jquery.com/focus/)

당신이 $('#report tr') 포커스를하고자하는 경우 당신은 당신의 $('#report tr') 요소에 tabindex을 설정해야합니다.

이 구현 될 수있는 방법의 예 : 여기

<html> 
    <head> 
     <title>Pass keypress event to TR</title> 
    </head> 
    <body> 
     <table> 
      <tr tabindex="1"> 
       <td>data 1</td> 
       <td>data 2</td> 
      </tr> 
      <tr tabindex="2"> 
       <td>data 3</td> 
       <td>data 4</td> 
      </tr> 
     </table> 
     <script type="application/javascript" src="http://code.jquery.com/jquery-1.11.1.min.js"></script> 
     <script type="application/javascript"> 
      $(function() { 
       $rows = $('table tr'); 
       $rows.keypress(function(e) { 
        if (e.which == 102) { 
         $(this).css('background-color', '#ff0000'); 
        } 
       }); 
       $rows.on('mouseover', function(e) { 
        $(this).focus(); 
       }); 
      }); 
     </script> 
    </body> 
</html> 
+0

당신은'keypress'로 맞았지 만, OP에는 "많은 양의 큰 테이블"이 있습니다. 어쩌면 수천 개의 행이있을 수 있으며 모든 행에 이벤트 수신기를 추가하는 것은 현명하지 않습니다. 그리고 더 많은 청취자를 추가하고 있습니다. 한 행이 올라갈 때마다, 한 번 더'keypress'가 추가됩니다. 어느 시점에 페이지가 질식 할 것입니다 ... – Teemu

+0

나는 이제'keypress' 핸들러를 추가하여 예제를 업데이트했습니다 한 줄에 한 번만 행이 떠있을 때마다 반대합니다. 그러나이 기술은 대용량 데이터 세트에 사용할 수있는 기술이 아닐 것이라는 데 동의합니다. 나는'keypress' 핸들링이 의도 한대로 작동하지 않는 이유를 설명하고자했습니다. – Antony

0

당신이 원하는 꽤 많은 일을 조각입니다 :

$(document).ready(function() { 
 
    var currentRow = null,   // Stores the currently hovered TR 
 
     fKey = false,    // Indicates, if F has been pressed 
 
     table = $('#table'),   // Holder for the table 
 
     stopBlackout = function() { // Removes "blackout" 
 
      $('body').removeClass('blackout'); 
 
      if (currentRow) { 
 
       currentRow.removeClass('hilite'); 
 
      } 
 
     }, 
 
     // Starts "blackout" 
 
     startBlackout = function (row) { // row = row element 
 
      row.addClass('hilite'); 
 
      $('body').addClass('blackout'); 
 
      if (currentRow[0] !== row[0]) { // Remove hilite if different row only 
 
       currentRow.removeClass('hilite'); 
 
      } 
 
      currentRow = row; 
 
     }, 
 
     // Keydown listener toggles "blackout" 
 
     toggleBlackout = function (e) { // e = event object 
 
      if ('form' in e.target) {return;} // Exit if a form element is active 
 
      if (e.which === 27 || e.which === 70) { // Action when hit Esc or F only 
 
       fKey = !fKey; 
 
       if (e.which === 27) { 
 
        fKey = false; 
 
       } 
 
       if (!fKey) { 
 
        stopBlackout(); 
 
       } else if (currentRow) { // Start "blackout" when having a hovered row 
 
        startBlackout(currentRow); 
 
       } 
 
      } 
 
     }; 
 
    table.mouseenter(function() { // Activate table to receive key presses 
 
     this.focus(); 
 
    }); 
 
    table.mouseleave(function() { // End "blackout" and stop receiving keypresses 
 
     stopBlackout(); 
 
     table.blur(); 
 
    }); 
 
    table.keydown(toggleBlackout); 
 
    table.mouseover(function (e) { // Highlight active row according to mouse hover 
 
     var row = $(e.target); 
 
     if (row[0].tagName !== 'TR') { // Usually TD or other element triggers mouseover 
 
      row = row.closest('tr'); // Set target to TR 
 
      if (!row.length) {return;} // Exit if e.target was TBODY or TABLE 
 
      if (fKey) { 
 
       startBlackout(row); 
 
      } 
 
      currentRow = row; // Update the currently hovered row holder 
 
     } 
 
    }); 
 
});
.blackout { 
 
    background: #000000; 
 
} 
 
.hilite { 
 
    background: #ffffff; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<table id="table" tabindex="-1"> 
 
    <tr><td>R1<b>C</b>1</td><td>R1C2</td></tr> 
 
    <tr><td>R1C2</td><td>R2C2</td></tr> 
 
    <tr><td>R1C3</td><td>R3C2</td></tr> 
 
    <tr><td>R1C4</td><td>R4C2</td></tr> 
 
</table>

일부 설명

모든 이벤트가 자식 요소가 아닌 테이블 요소에 연결되어 있습니다. 이렇게하면 페이지의 이벤트 리스너가 줄어들어 특히 테이블이 매우 큰 경우 더욱 빠르게 수행 할 수 있습니다.이러한 수신기를 추가하기 전에 표가 있어야하지만 나중에 콘텐츠를 추가 할 수 있습니다. Esc를 모든 브라우저에서 keypress을 발생하지 않기 때문에

keydown

가 사용됩니다. fKey 코드의 변수는 "정전"이 켜져 있는지 여부를 나타냅니다.

활성화 키 (F)는 테이블 위에 마우스를 올려 놓을 때만 작동하지만 양식 요소가 활성화되어있는 경우에는 작동하지 않습니다.

mouseovertr 내에있는 요소에서 다른 요소로 마우스를 이동할 때마다 발생하므로 처리기에 몇 가지 추가 검사가 있습니다.

mouseenter 처리기가 테이블 위에 마우스를 올리면 자동으로 키 누름을받으며 테이블을 먼저 활성화 할 필요가 없습니다.

mouseleave 처리기가 키 누름을받는 테이블을 중지하고 "정전"을 제거합니다.

tabindex-1으로 설정되어 테이블에 포커스를받을 수 있지만 탭 순서를 벗어날 수 있습니다.

관련 문제