테이블의 전체 행을 링크로 클릭 가능하게 만드는 방법은 무엇입니까?


436

Bootstrap을 사용하고 있으며 다음이 작동하지 않습니다.

<tbody>
    <a href="#">
        <tr>
            <td>Blah Blah</td>
            <td>1234567</td>
            <td>£158,000</td>
        </tr>
    </a>
</tbody>

2
JavaScript가 더 좋을 것입니다
— John Conde

1
그는 부트 스트랩을 사용하고 있기 때문에 그가 할 수 있어야한다고 생각합니다 :)
— Ahmed Masud

행 앞에 투명한 A 요소를 넣는 것은 어떻습니까? 그렇게하면 실제 링크의 모든 속성 (상태 표시 줄, 가운데 클릭 등 ...)을 가지며 테이블의 모양을 변경하지 않습니다 (원하는 경우).
— David Balažic 2016 년


답변:


568

저자의 노트 I :

아래의 다른 답변, 특히 jquery를 사용하지 않는 답변을 살펴보십시오.

저자의 노트 II :

후손을 위해 보존되었지만 2020 년 에는 틀림없이 잘못된 접근법이었습니다. (2017 년에도 비 관용적이었습니다.)

원래 답변

부트 스트랩을 사용하고 있습니다. 즉 jQuery : ^)를 사용하고 있다는 것을 의미하므로 한 가지 방법은 다음과 같습니다.

<tbody>
    <tr class='clickable-row' data-href='url://'>
        <td>Blah Blah</td> <td>1234567</td> <td>£158,000</td>
    </tr>
</tbody>


jQuery(document).ready(function($) {
    $(".clickable-row").click(function() {
        window.location = $(this).data("href");
    });
});

물론 href 또는 스위치 위치를 사용할 필요가 없으며 클릭 핸들러 기능에서 원하는 모든 작업을 수행 할 수 있습니다. jQuery처리기를 작성하고 작성하는 방법을 읽으십시오 .

사용의 장점 클래스 를 통해 ID가 여러 행에 솔루션을 적용 할 수 있습니다 :

<tbody>
    <tr class='clickable-row' data-href='url://link-for-first-row/'>
        <td>Blah Blah</td> <td>1234567</td> <td>£158,000</td>
    </tr>
    <tr class='clickable-row' data-href='url://some-other-link/'>
        <td>More money</td> <td>1234567</td> <td>£800,000</td>
    </tr>
</tbody>

코드베이스는 변경되지 않습니다. 동일한 핸들러가 모든 행을 처리합니다.

다른 옵션

콜백에서 다음과 같이 Bootstrap jQuery 콜백을 사용할 수 있습니다 document.ready.

$("#container").on('click-row.bs.table', function (e, row, $element) {
    window.location = $element.data('href');
});

이것은 테이블 정렬시 재설정되지 않는 이점이 있습니다 (다른 옵션에서 발생 함).


노트

이것은 게시 window.document.location되었으므로 window.location대신 사용되지 않거나 (최소 더 이상 사용되지 않음) 사용 됩니다.


105
CSS를 사용하여 커서를 변경할 수도 있습니다. tr.clickableRow {cursor : pointer; }
— Winston Kotzan

78
이 요소에 유효한 속성이 아니기 때문에 href에 속성을 사용해서는 안된다는 것을 추가하고 싶었습니다 tr. 대신 data-url="{linkurl}"js 코드에서 데이터 속성을 사용하십시오 .$(this).data('url')
— Maksim Vi.

12
당신은 각 행에 클래스를 사용하지 않도록, 그리고 클래스 이름으로 테이블을 장식 할 수 있습니다 clickable_row(HTML 표준에 반대하는 낙타 표기법와 소문자이어야한다 (I 크로스 브라우저 문제이와 몇 번)했다) 다음 jQuery를이다 $('.clickable_row tr').click(function ...그러나이 실제로 는 사용자 지정 데이터 사양이기 때문에 data-대신 데이터를 보유하는 데 사용해야합니다 href. data-urljquery는 다음과 같이 액세스합니다$(this).data(url);
— Piotr Kula

3
참고 : 가능하면 자바 스크립트를 사용하지 않는 사람들을 위해 tr 어딘가에 링크를 남겨 두어야합니다.
— hitautodestruct

47
사용자가 마우스 커서를 가져갈 때 브라우저 하단에 링크 URL이 표시되지 않고 링크를 휠 클릭하여 새 탭에서 열 수 없기 때문에이 솔루션의 큰 팬은 아닙니다. 각 셀 안에 a태그를 삽입하는 display: block;것은 약간 성가신 일이지만이 문제를 해결하는 가장 유용한 방법 인 것 같습니다.
— 막심 로시니

222

당신은 그렇게 할 수 없습니다. 유효하지 않은 HTML입니다. <a>a <tbody>와 a 사이에를 넣을 수 없습니다 <tr>. 대신 이것을 시도하십시오 :

<tr onclick="window.location='#';">
        ...
     </tr>

포인터보기를위한 스타일 추가

[data-href] { cursor: pointer; }

작업을 수행 할 때 JavaScript를 사용하여 HTML 외부에 클릭 핸들러를 지정하려고합니다.


3
@Aquillo OP는 구체적으로 부트 스트랩을 사용하고 있다고 명시합니다. 그래서 jQuery를 솔루션 프레임 워크 내에서 더 나은 것
— 아메드 마수드

39
@AhmedMasud이 경우에는 그렇습니다. 미래의 독자라면 일반 JS가 더 나은 솔루션 일 수 있습니다. 그것이 Stackoverflow의 목적이므로, 여전히 내 의견이 유효한 의견이라고 생각합니다.
— Menno

3
행동과 마크 업의 분리가 확실히 바람직하다. 뭐든지, href가 tr의 유효한 속성이 아니라고 말할 것입니다. data-href로 바꾸고 $ (this) .attr을 $ (this) .data로 바꾸십시오.
— davidfurber

1
또는 ".clickableRow"클래스 이벤트 바인딩 접근 방식 <a>이 클릭 한 행 의 첫 번째를 찾도록 할 수 있습니다. (그것도 정상적으로 저하 될 것입니다)
— Jason Sperske

3
ES6 구문을 사용하는 경우 다음과 같이 링크 클릭을 실행할 수 있습니다.onClick={() => window.open('https://stackoverflow.com/', '_blank')}
— Louie Bertoncin

186

every 안에 앵커를 포함시킬 수 있습니다 <td>.

<tr>
  <td><a href="#">Blah Blah</a></td>
  <td><a href="#">1234567</a></td>
  <td><a href="#">more text</a></td>
</tr>

그런 다음 display:block;앵커를 사용하여 전체 행을 클릭 가능하게 만들 수 있습니다.

tr:hover { 
   background: red; 
}
td a { 
   display: block; 
   border: 1px solid black;
   padding: 16px; 
}

jsFiddle 예제입니다.

JavaScript에 의존하지 않는 한 이것은 아마도 당신이 얻는 것만 큼 최적입니다.


11
이것은 최선의 해결책입니다. 많은 감사합니다.
— TiyebM

4
@daniel 좋은 대답이지만 셀이 아래로 확장되면 다음과 같이 제대로 작동하지 않습니다. jsfiddle.net/RFFy9/253
— midstack

4
큰! 이 솔루션을 사용하면 사용자가 원하는 경우 새 탭에서 링크를 열 수 있습니다. 그러나 빈 열에는 링크가 없습니다.
— Ignacio Pérez

9
@AnnaRouben 나는 동의하지 않을 것입니다. 여러 개의 유사한 링크를 갖는 것은 단점과 비교할 때 매우 작은 단점입니다 (JS가없는 작품, 스크린 리더는 링크가 연결된 곳을 읽을 수 있으며 Ctrl 키를 클릭하여 새 탭에서 열 수 있음). ..) Pure-HTML 솔루션은 JS 솔루션보다 보조 소프트웨어에서 거의 항상 더 잘 작동합니다.
— JJJ

6
접근성이 뛰어 나기 때문에이 솔루션을 좋아합니다. 사용자는 링크를 탭하고 새 탭에서 링크를 열 수 있습니다. 내 응용 프로그램에서 수행 한 작업 tabindex="-1"은 첫 번째 <td>링크 를 제외한 모든 링크에 배치되므로 사용자 탭은 셀 대 셀이 아닌 행 대 행입니다. 또한 :focus-withinCSS 의사 클래스를 사용하려는 경우 여전히 전체 행을 강조 표시 / 개요 할 수 있습니다 .
— Jonathan

90

연결된 테이블 행이 가능하지만 표준 <table>요소로 는 불가능 합니다. display: table스타일 속성을 사용하여 수행 할 수 있습니다 . 여기 와 여기 에 설명 할 바이올린이 있습니다.

이 코드는 트릭을 수행해야합니다.

.table {
  display: table;
}

.row {
  display: table-row;
}

.cell {
  display: table-cell;
  padding: 10px;
}

.row:hover {
  background-color: #cccccc;
}

.cell:hover {
  background-color: #e5e5e5;
}
<link href="https://stackpath.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet" type="text/css" />

<div role="grid" class="table">
  <div role="row" class="row">
    <div role="gridcell" class="cell">
      1.1
    </div>
    <div role="gridcell" class="cell">
      1.2
    </div>
    <div role="gridcell" class="cell">
      1.3
    </div>
  </div>

  <a role="row" class="row" href="#">
    <div role="gridcell" class="cell">
      2.1
    </div>
    <div role="gridcell" class="cell">
      2.2
    </div>
    <div role="gridcell" class="cell">
      2.3
    </div>
  </a>
</div>

표준 <table>요소가 사용되지 않으므로 적절한 액세스 가능성을 보장하기 위해 ARIA 역할이 필요합니다 . role="columnheader"해당되는 경우 와 같이 추가 역할을 추가해야 할 수도 있습니다 . 자세한 내용은 여기를 참조하십시오.


13
이제 dataTables 플러그인을 이것에 적용하십시오! :)
— Afonso Gomes

7
IMHO는 정답입니다. IMHO는 링크 (예 : /Firefox의 키), 탐색 ( tab키), 링크 위치 복사, 새 탭 / 창에서 열기 등 링크와 관련된 모든 사용자 에이전트 도구 를 액세스 가능 / 특별한 경우에도 유지하기 때문입니다. 브라우저가 필요합니다. 내 유일한 nitpick은 <div>안에 내부를 중첩하지 않으므로 <a>셀이로 표시되는 것이 좋습니다 <span>.
— 토비아

이러한 CSS 테이블에 타사 플러그인 및 라이브러리를 적용하는 데 약간의 작업이 필요할 수 있지만 일반적으로 복사하여 붙여 넣기 및 바꾸기입니다. 예를 들어, 나는 Bootstrap 자신 _tables.scss과 다른 임의의 조각을 복제 하여 모든 테이블 요소를 내가 사용하기로 선택한 CSS 클래스로 대체했습니다 (요소와 동일 함 : th→.th 정말 혜택에 비해별로 일) .
— Tobia

2
좋은 대답이지만 테이블이 적절한 정렬을 위해 방금 사용 된 경우에만 해결책입니다 (많은 상황에서 해당됩니다!). 테이블 형식 데이터의 경우 의미 <table>가 있습니다. 그러나 이것은 여전히 ​​모든 자바 스크립트 솔루션을 능가합니다 :)
— Marten Koetsier

이것은 매우 영리한 해결 방법이지만, 그뿐입니다. 이것은 실제로 테이블이 아니므로 저자가 언급했듯이 접근성에 문제가 있습니다. 테이블을 기대하지만 테이블을 얻는 다른 것들에 문제가 발생할 가능성이 큽니다.
— 타이슨 기비

25

다음과 같이 표준 부트 스트랩 4.3 이상을 사용하여 달성했습니다-jQuery 또는 추가 CSS 클래스가 필요하지 않습니다!

핵심은 stretched-link셀 내의 텍스트 에 사용 <tr>하고 포함 블록으로 정의하는 것입니다.

<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet"/>

<table class="table table-hover">
  <tbody>
    <tr style="transform: rotate(0);">
    <th scope="row"><a href="#" class="stretched-link">1</a></th>
      <td>Mark</td>
      <td>Otto</td>
      <td>@mdo</td>
    </tr>
    <tr>
      <th scope="row">2</th>
      <td>Jacob</td>
      <td>Thornton</td>
      <td>@fat</td>
    </tr>
    <tr>
      <th scope="row">3</th>
      <td>Larry</td>
      <td>the Bird</td>
      <td>@twitter</td>
    </tr>
  </tbody>
</table>

transform값을 포함하지 않는 값으로 설정 하는 것과 같이 다른 방법으로 포함 블록을 정의 할 수 있습니다 (위의 예와 같이).

자세한 내용은 Bootstrap 설명서 를 참조하십시오 stretched-link.


1
이 답변에는 더 많은 투표가 필요합니다. 자바 스크립트가 전혀 없습니다. 그게 뭐야 scope="row"? 범위를 사용하지 않고 행은 여전히 ​​링크로 작동합니다.
— Christhofer Natalius

트윗 담아 가기 내 원래 답변에 포함되어 있지 않습니다 scope="row". 다른 내용을 편집하려면 기록을 확인하십시오. 코드 스 니펫이 작동하는 것처럼 보이지만 (원본처럼) 편집을 되 돌리지 않았으며 새 코드를 철저하게 테스트 할 기회를 얻지 못했습니다 :-)
— Krishna Gupta

이것의 단점은 링크가 열 위에 있고 텍스트를 복사 할 수 없으며 마우스로 마우스를 가져 가면 td의 속성 제목이 표시되지 않기 때문입니다. 불행히도, 나는 옛날 방식으로 돌아가서 한 열에 만 링크를 넣어야합니다.
— Christhofer Natalius

2
나는이 솔루션을 좋아했지만 슬프게도 브라우저 간이 아닙니다 (Chrome / Firefox는 괜찮지 만 Safari는 아닙니다). 문제는 tr브라우저간에 포함 블록에 대한 규칙으로 인식되지 않는 태그 때문입니다 ... stackoverflow.com/questions/61342248/…
— pom421

17

훨씬 유연한 솔루션은 data-href 속성을 사용하여 무엇이든 타겟팅하는 것입니다. 이것은 다른 장소에서 쉽게 코드를 재사용 할 수 있다는 것입니다.

<tbody>
    <tr data-href="https://google.com">
        <td>Col 1</td>
        <td>Col 2</td>
    </tr>
</tbody>

그런 다음 jQuery에서 해당 속성을 가진 모든 요소를 ​​타겟팅하십시오.

jQuery(document).ready(function($) {
    $('*[data-href]').on('click', function() {
        window.location = $(this).data("href");
    });
});

그리고 CSS 스타일을 잊지 마십시오 :

[data-href] {
    cursor: pointer;
}

이제 모든 요소에 data-href 속성을 추가하면 작동합니다. 이와 같은 스 니펫을 작성할 때 유연성이 좋았습니다. 바닐라 js 솔루션이 있으면 자유롭게 추가하십시오.


CSS와 좋은 일
— Amirhossein Tarmast

내가 가장 좋아하는 솔루션. 잘 👍🏽 일
— MFrazier

7

이 부트 스트랩 구성 요소를 사용할 수 있습니다.

http://jasny.github.io/bootstrap/javascript/#rowlink

재 스니 부트 스트랩

선호하는 프론트 엔드 프레임 워크를위한 누락 된 구성 요소.

<table class="table table-striped table-bordered table-hover">
  <thead>
    <tr><th>Name</th><th>Description</th><th>Actions</th></tr>
  </thead>
  <tbody data-link="row" class="rowlink">
    <tr><td><a href="#inputmask">Input mask</a></td><td>Input masks can be used to force the user to enter data conform a specific format.</td><td class="rowlink-skip"><a href="#">Action</a></td></tr>
    <tr><td><a href="http://www.jasny.net/" target="_blank">jasny.net</a></td><td>Shared knowledge of Arnold Daniels aka Jasny.</td><td class="rowlink-skip"><a href="#">Action</a></td></tr>
    <tr><td><a href="#rowlinkModal" data-toggle="modal">Launch modal</a></td><td>Toggle a modal via JavaScript by clicking this row.</td><td class="rowlink-skip"><a href="#">Action</a></td></tr>
  </tbody>
</table>

용법

데이터 속성을 통해

또는 요소에 클래스 .rowlink및 속성 data-link="row"을 추가하십시오 . 다른 옵션 의 경우 셀에 클래스를 추가하여 셀을 제외 할 수있는 것처럼 데이터에 이름을 추가하십시오 .<table><tbody>data-target="a.mainlink".rowlink-skip<td> .

JavaScript를 통해

자바 스크립트를 통해 입력 마스크를 호출합니다.

$('tbody.rowlink').rowlink()

6

<a>내부적 으로 태그 를 사용하여 기술적으로 태그 를 작성하는 좋은 방법 <tr>이 있습니다. 이는 의미 상 올바르지 않을 수도 있지만 (브라우저 경고를 표시 할 수도 있음) JavaScript/jQuery필요 하지 않은 작업으로 작동 합니다.

<!-- HTML -->
<tbody>
  <tr class="bs-table-row">
     <td>Blah Blah</td>
     <td>1234567</td>
     <td>£158,000</td>
     <a class="bs-row-link" href="/your-link-here"></a>
  </tr>
</tbody>

/* CSS */
.bs-table-row {
  position: 'relative';
}

.bs-row-link {
  position: 'absolute';
  left: 0;
  height: '36px'; // or different row height based on your requirements
  width: '100%';
  cursor: 'pointer';
}

추신 : 여기의 요령은 <a>마지막 요소로 태그 를 넣는 것입니다. 그렇지 않으면 첫 번째 공간을 차지하려고 시도합니다.<td> 셀 .

PPS : 이제 전체 행을 클릭 할 수 있으며이 링크를 사용하여 새 탭에서도 열 수 있습니다 (Ctrl / CMD + 클릭)


이것은 기본적으로 내 대답 과 같지 않습니까?
— David Balažic

이 답변은 완벽하게 보이지만 실제로는 작동하지 않습니다 . 요소 <tr>에는 <a>요소를 자식으로 가질 수 없기 때문 입니다. 만 <td>하고 <th>유효 자녀입니다. 다음을 참조하십시오 : stackoverflow.com/questions/12634715/…
— funkybunky

5

tr에서 onclick javascript 메소드를 사용하여 클릭 가능하게 만들 수 있습니다. 또한 세부 사항으로 인해 링크를 작성 해야하는 경우 javascript에서 함수를 선언하고 onclick에서 호출하여 일부 값을 전달할 수 있습니다.


5

다음은 테이블 행 위에 투명한 A 요소를 배치하는 방법입니다. 장점은 다음과 같습니다.

  • 마우스 포인터로 포인터를 변경하면 상태 표시 줄에 대상 링크가 표시되고 키보드를 탐색하거나 새 탭이나 창에서 열 수 있으며 URL을 복사 할 수 있습니다
  • 표는 링크를 추가하지 않은 것과 동일하게 보입니다.
  • 테이블 코드 자체에는 변화가 없습니다

단점 :

  • A 요소의 크기는 작성시 및 행의 크기를 변경 한 후에 스크립트에서 설정해야합니다 (그렇지 않으면 JavaScript없이 수행 할 수 있음). HTML 또는 CSS로)

테이블은 그대로 유지됩니다.

<table id="tab1">
<tbody>
        <tr>
            <td>Blah Blah</td>
            <td>1234567</td>
            <td>£158,000</td>
        </tr>
</tbody>
</table>

첫 번째 열에 A 요소를 삽입하고 필요한 속성을 설정하여 jQuery JavaScript를 통해 각 행에 대한 링크를 추가하십시오.

// v1, fixed for IE and Chrome
// v0, worked on Firefox only
// width needed for adjusting the width of the A element
var mywidth=$('#tab1').width();

$('#tab1 tbody>tr>td:nth-child(1)').each(function(index){
    $(this).css('position',  'relative');// debug: .css('background-color', '#f11');
    // insert the <A> element
    var myA=$('<A>');
    $(this).append(myA);
    var myheight=$(this).height();

    myA.css({//"border":'1px solid #2dd', border for debug only
            'display': 'block',
            'left': '0',
            'top': '0',
            'position':  'absolute'
        })
        .attr('href','the link here')
        .width(mywidth)
        .height(myheight)
        ;
    });

패딩과 여백을 많이 사용하는 경우 너비와 높이 설정이 까다로울 수 있지만 일반적으로 몇 픽셀을 제거해도 문제가되지 않습니다.

라이브 데모 : http://jsfiddle.net/qo0dx0oo/ (Firefox에서는 작동하지만 IE 또는 Chrome에서는 작동하지 않으며 링크 위치가 잘못되었습니다)

Chrome 및 IE 용으로 수정되었습니다 (여전히 FF에서도 작동 함) : http://jsfiddle.net/qo0dx0oo/2/


2
영리한 솔루션. 행을 가리키면 한 번만 요소를 느리게 만드는 것이 큰 테이블의 성능을 크게 향상시킵니다.
— levi

1
@levi 이것을 lazyload하는 방법에 대한 피드백을 줄 수 있습니까?
— Subliminal Hash

@KemalEmin 나는 그가 자바 스크립트를 사용한다고 가정합니다onmouseover
— brad

5

버튼 행을 테이블 행에 추가하면 부트 스트랩이 CSS 변경없이 커서를 변경합니다. 코드를 거의 사용하지 않고 행을 쉽게 클릭 할 수 있도록하는 방법으로이 역할을 사용하기로 결정했습니다.

HTML

<table class="table table-striped table-hover">
     <tbody>
          <tr role="button" data-href="#">
               <td>Cell 1</td>
               <td>Cell 2</td>
               <td>Cell 3</td>
          </tr>
     </tbody>
</table>

jQuery

$(function(){
     $(".table").on("click", "tr[role=\"button\"]", function (e) {
          window.location = $(this).data("href");
     });
});

동일한 원리를 적용하여 모든 버튼에 버튼 역할을 추가 할 수 있습니다.


와우 실제로 jquery 코드없이 data-href 대신 ui-sref로 작업했습니다. 커서를 손가락으로 바꾸면됩니다.
— nurp

이 감사를 완벽하게 톤 일
— 인 Ashish 얀 배너 지

4

이 코드는 전체 테이블을 클릭 가능하게 만듭니다. 이 예제에서 링크를 클릭하면 링크를 따르지 않고 경고 대화 상자에 링크가 표시됩니다.

HTML :

위 예제 뒤에있는 HTML은 다음과 같습니다.

    <table id="example">
    <tr>
     <th>&nbsp;</th>
     <th>Name</th>
     <th>Description</th>
     <th>Price</th>
   </tr>
   <tr>
     <td><a href="apples">Edit</a></td>
     <td>Apples</td>
     <td>Blah blah blah blah</td>
     <td>10.23</td>
   </tr>
    <tr>
     <td><a href="bananas">Edit</a></td>
     <td>Bananas</td>
     <td>Blah blah blah blah</td>
     <td>11.45</td>
   </tr>
   <tr>
     <td><a href="oranges">Edit</a></td>
     <td>Oranges</td>
     <td>Blah blah blah blah</td>
     <td>12.56</td>
   </tr>
    </table>

CSS

그리고 CSS :

    table#example {
    border-collapse: collapse;   
}
#example tr {
    background-color: #eee;
    border-top: 1px solid #fff;
}
#example tr:hover {
    background-color: #ccc;
}
#example th {
    background-color: #fff;
}
#example th, #example td {
    padding: 3px 5px;
}
#example td:hover {
    cursor: pointer;
}

jQuery

그리고 마지막으로 마술을 일으키는 jQuery :

    $(document).ready(function() {

    $('#example tr').click(function() {
        var href = $(this).find("a").attr("href");
        if(href) {
            window.location = href;
        }
    });

});

행을 클릭하면 앵커에 속한 href에 대한 검색이 수행됩니다. 하나를 찾으면 창의 위치가 해당 href로 설정됩니다.


4

뷰와 컨트롤러가 분리되어 URL을 하드 코딩 할 필요가 없으며 클릭으로 달성 해야하는 모든 것을 클릭 할 때 매우 쉬운 옵션은 클릭 한 번으로 사용하는 것입니다. . Angular ng-click 과도 작동합니다.

<table>
  <tr onclick="myFunction(this)">
    <td>Click to show rowIndex</td>
  </tr>
</table>

<script>
function myFunction(x) {
    alert("Row index is: " + x.rowIndex);
}
</script>

여기서 일 하기


1
확실히 이것이 정답입니다. 다른 사람들은 그러한 단순한 일에 미치도록 복잡합니다. 마우스 포인터를 변경하려면 tr : hover {cursor : pointer; } CSS 클래스에
— Tom Close

1
@TomClose 행 클릭으로 수행하려는 작업에 따라 탐색이 정상적으로 작동하지 않는 등 문제가 발생할 수 있습니다. 새 탭 / 창에서 열기를위한 Shift 클릭이없고 대상을 볼 수있는 호버링이 없습니다.
— NetMage

4

여기 간단한 해결책이 있습니다 ..

<tr style='cursor: pointer; cursor: hand;' onclick="window.location='google.com';"></tr>

3

, CSS 위치 및 일부 jQuery 또는 JS를 사용하는<a> 또 다른 옵션 :

HTML :

<table>
<tr>
    <td>
        <span>1</span>
        <a href="#" class="rowLink"></a>
    </td>
    <td><span>2</span></td>
</tr>
</table>

CSS :

table tr td:first-child {
    position: relative;
}
a.rowLink {
    position: absolute;
    top: 0; left: 0;
    height: 30px;
}
a.rowLink:hover {
    background-color: #0679a6;
    opacity: 0.1;
}

그런 다음 jQuery와 같이 너비를 지정해야합니다.

    $(function () {
        var $table = $('table');
            $links = $table.find('a.rowLink');

        $(window).resize(function () {
            $links.width($table.width());
        });

        $(window).trigger('resize');
    });

3

나는 누군가가 이미 거의 똑같이 썼다는 것을 알고 있지만, 내 방법은 올바른 방법이며 (div는 A의 자식이 될 수 없음) 클래스를 사용하는 것이 좋습니다.

CSS를 사용하여 테이블을 모방하고 A 요소를 행으로 만들 수 있습니다

<div class="table" style="width:100%;">
  <a href="#" class="tr">
    <span class="td">
      cell 1
    </span>
    <span class="td">
      cell 2
    </span>
  </a>
</div>

CSS :

.table{display:table;}
.tr{display:table-row;}
.td{display:table-cell;}
.tr:hover{background-color:#ccc;}

3

나는 onclick=""초보자를 위해 사용하고 이해하기 쉽기 때문에 속성 을 사용하는 것을 선호합니다.

 <tr onclick="window.location='any-page.php'">
    <td>UserName</td>
    <td>Email</td>
    <td>Address</td>
</tr>

2

허용되는 답변은 훌륭하지만 모든 tr에서 URL을 반복하지 않으려는 경우 작은 대안을 제안합니다. 따라서 URL이 아닌 href를 테이블 data-url에 넣습니다.

<table data-click data-url="href://blah">    
    <tbody>
        <tr id ="2">
            <td>Blah Blah</td> <td>1234567</td> <td>£158,000</td>
        </tr>
        <tr id ="3">
            <td>Blah Blah</td> <td>1234567</td> <td>£158,000</td>
        </tr>
    </tbody>
    </table

jQuery(document).ready(function($) {
    $('[data-click] tbody tr').click(function() {
        var url = $(this).closest('table').data("url");
        var id = $(this).closest('tr').attr('id');
        window.location = url+"?id="+id);
    });
});

또한 모든 tr에 클릭 데이터 속성을 추가 할 필요가 없기 때문에 좋습니다. 또 다른 좋은 점은 클래스가 실제로 스타일링에만 사용해야하므로 클래스를 사용하여 클릭을 유발하지 않는다는 것입니다.


2

앞에서 언급하지 않은 한 가지 해결책은 셀에서 단일 링크를 사용하고 일부 CSS를 사용하여이 링크를 셀 위로 확장하는 것입니다.

table {
  border: 1px solid;
  width: 400px;
  overflow: hidden;
}

tr:hover {
  background: gray;
}

tr td {
  border: 1px solid;
}

tr td:first-child {
  position:relative;
}

a:before {
  content: '';
  position:absolute;
  left: 0;
  top: 0;
  bottom: 0;
  display: block;
  width: 400px;
}
<table>
  <tr>
    <td><a href="https://google.com">First column</a></td>
    <td>Second column</td>
    <td>Third column</td>
  </tr>
  <tr>
    <td><a href="https://stackoverflow.com">First column</a></td>
    <td>Second column</td>
    <td>Third column</td>
  </tr>
</table>


다소 우아해 보입니다. 그러나 Google 링크 데모는 작동하지 않습니다. 하나의 스택 오버 플로우. 아마도 Google은 종종있는 것처럼 말입니다. 아마 Bing에 링크 :-) 그들을 바로 제공합니다. 어쨌든 대단하고 깔끔한 솔루션.
— BeNice

이것은 나를 작동시킨다!! 좋은 해결책. 주목할 것은 a : before의 너비는 테이블을 덮을 수있을만큼 길어야한다는 것입니다.
— Arst

1
<tbody>
    <tr data-href='www.bbc.co.uk'>
        <td>Blah Blah</td>
        <td>1234567</td>
        <td>£158,000</td>
    </tr>
    <tr data-href='www.google.com'>
        <td>Blah Blah</td>
        <td>1234567</td>
        <td>£158,000</td>
    </tr>
</tbody>

<script>
    jQuery(document).ready(function ($) {
        $('[data-href]').click(function () {
            window.location = $(this).data("href");
        });
    });
</script>

여기에있는 주요 솔루션은 훌륭하지만 내 솔루션은 수업이 필요하지 않습니다. URL과 함께 data-href 속성을 추가하기 만하면됩니다.


1

이 문제를 해결하기 위해 많은 시간을 투자했습니다.

세 가지 접근 방식이 있습니다.

  1. JavaScript를 사용하십시오. 확실한 단점 : 기본적으로 새 탭을 열 수 없으며 행 위에 마우스를 올리면 일반 링크와 같이 상태 표시 줄에 표시가 없습니다. 접근성도 문제입니다.

  2. HTML / CSS 만 사용하십시오. 이것은 <a>각각 아래 에 중첩을 두는 것을 의미 합니다 <td>. 이 바이올린 과 같은 간단한 접근 방식은 작동하지 않습니다. 클릭 가능한 표면 이 각 열에 대해 반드시 같을 필요는 없기 때문입니다. 이것은 심각한 UX 문제입니다. 또한 <button>행에 필요한 경우 아래에 중첩하는 것이 유효한 HTML이 아닙니다.<a> 태그 (브라우저에는 문제가 없지만).

    이 접근법을 구현하는 3 가지 다른 방법을 찾았습니다. 먼저 괜찮습니다, 다른 두 사람은 위대하지 않습니다.

    a) 이 예제를 살펴보십시오 .

    tr {
      height: 0;
    }
    
    td {
      height: 0;
      padding: 0;
    }
    
    /* A hack to overcome differences between Chrome and Firefox */
    @-moz-document url-prefix() {
      td {
        height: 100%;
      }
    }
    
    a {
      display: block;
      height: 100%;
    }

    작동하지만 Chrome과 Firefox의 불일치로 인해 차이점을 극복하려면 브라우저 별 해킹이 필요합니다. 또한 Chrome은 항상 셀 내용을 맨 위에 정렬하므로 특히 줄 높이가 다양한 경우 긴 텍스트에 문제가 발생할 수 있습니다.

    b) 설정 <td>에{ display: contents; } . 다른 두 가지 문제가 발생합니다.

    b1. 다른 사람이 <td>태그 설정과 같이 직접 스타일을 지정하려는 경우 { width: 20px; }해당 스타일을<a> 지정 태그 . Javascript 대안보다 더 많은 마법을 사용해야 할 수도 있습니다.

    b2. { display: contents; }아직 실험 중입니다. 특히 Edge에서는 지원되지 않습니다.

    C) 설정 <td>에 { height: --some-fixed-value; }. 이것은 충분히 유연하지 않습니다.

  3. 내가 진지하게 생각하는 마지막 방법 은 클릭 가능한 행을 전혀 사용하지 않는 것 입니다. 클릭 가능한 행은 훌륭한 UX 환경이 아닙니다. 시각적으로 클릭 가능한 것으로 표시하기가 쉽지 않으며 버튼과 같이 행 내에서 여러 부분을 클릭 할 수있는 경우 문제가 발생합니다. 따라서 가능한 대안은 <a>첫 번째 열에 만 태그를 지정하여 일반 링크로 표시하고 전체 행을 탐색하는 역할을하는 것입니다.


0

다른 방법이 있습니다 ...

HTML :

<table>
<tbody>
       <tr class='clickableRow'>
       <td>Blah Blah</td>
       <td>1234567</td>
       <td>£158,000</td>
        </tr>
</tbody>
</table>

jQuery :

$(function() {
      $(".clickableRow").on("click", function() {
          location.href="http://google.com";

      });

});

새 탭에서 어떻게 열 수 있습니까? @ klewis
— Khushbu Vaghela

0
<table>
  <tr tabindex="0" onmousedown="window.location='#';">
    <td>1</td>
    <td>2</td>
    <td>3</td>
  </tr>
</table>

#을 url로 tabindex="0"바꾸고 모든 요소를 ​​포커스 가능하게 만듭니다.


-1

행에 ID를 줄 수 있습니다. 예 :

<tr id="special"> ... </tr>

그런 다음 jquery를 사용하여 다음과 같이 말합니다.

$('#special').onclick(function(){ window="http://urltolinkto.com/x/y/z";})


1
여러 행을 가질 가능성이 높고 하나의 항목에만 id를 사용해야하기 때문에 id 대신 class를 사용하고 싶습니다.
— Programmingjoe

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.