2014-12-21 2 views
0

다음 문제에 대한 해결책을 찾고있었습니다. 데이터 테이블을 정의하는 자바 스크립트 함수에 객체가 있습니다. 이 테이블의 행을 테이블 셀의 onclick 핸들러 (td 요소)를 사용하여 정의 된 함수에 전달하여 해당 요소에 대한 추가 정보가있는 팝업을 열 수 있도록하려고합니다.예를 들어 onclick을 사용하여 지정된 javascript 함수에 javascript 객체를 전달하는 방법

나는 이것에 대한 몇 가지 해결책을 찾았지만 주로 PHP에서 준비된 문자열을 포함하고 자바 스크립트에 전달되었습니다. 내 경우에는 위의 기능이 필요한 수준의 PHP가 포함되어 있지 않습니다.

몇 가지 실험을 한 후 다음을 생각해 냈습니다.

개체를 인라인 HTML 함수에 전달하려면 2x stringify가 필요합니다. 첫 번째는 json 문자열을 만들고 두 번째 문자열은 모든 큰 따옴표를 이스케이프 처리하고 처음과 끝에 큰 따옴표를 추가합니다. 그런 다음 수신 함수는 JSON.parse()에만 JSON 문자열을 전달하면됩니다. 내가 여기를 게시하고

// JSON format for json_txt is: 
// { "column 1" : ["c1 data 1", "c1 data 2", ...], 
// "column 2" : ["c2 data 1", "c2 data 2", ...], 
// ... 
// } 

function createTable(json_txt, el_id) 
{ 
    var el = document.getElementById(el_id); 
    var o = JSON.parse(json_txt); 
    var s = '<table>'; 
    var num = numTableRows(o); // just returns number of rows 
    for (var r=0; r<num; r++) 
    { 
     s += '<tr class="tbl_data">'; 
     for (var col in o) 
     { 
      if (col === 'a special column name here') 
      { 
       var js = {}; 
       for (var c in o) js[c] = o[c][r]; 
       s += "<td onclick='onTrackShowInfo(this," + JSON.stringify(JSON.stringify(js))+")'>"; 
      } 
      else 
       s += '<td>'; 

      s += o[col][r]; 
      s += '</td>'; 
     } 
     s += '</tr>'; 
    } 
    s += '</table>'; 
    el.innerHTML = s; 
} 

.... 

function onTrackShowInfo(el, json_row) 
{ 
    var o = JSON.parse(json_row); 
    // ok, we have the row from element 'el' at this point 
} 

한 가지 이유는, 사람이 어떤 문제를 보는 경우도 물어 유사한, 뭔가를 찾고있을 수 있습니다 다른 사람들을 돕기 위해, 또는 이것에 더 나은 솔루션에 도달했습니다 특정 문제.

EDIT :이 코드가 실행되는 컨텍스트를 조금 더 보여주기 위해 매우 단순화 된 createTable() 함수 버전이 추가되었습니다. 이 편집에서

+2

이벤트 처리기를 할당하는 데 'onclick'을 사용하지 않고 대신 최신 DOM API를 사용하는 것이 훨씬 쉽습니다. 어쨌든 테이블 행에 * index * 만 저장하면됩니다. – Pointy

+2

@ Pointy가 말한 것에 대해 확장했다. 클릭 이벤트를 처리하려면'addEventListener'를 사용해야합니다. 그러면 문제가 해결됩니다. – EvilZebra

+0

@Pointy에 동의합니다. 이제 HTML을 깨지 않기 위해 JSON을 두 번 이스케이프해야합니다. 개인적으로 끔찍한 해결책. JSON 데이터를 사이드 배열에 저장하고 인덱스로 참조하십시오. 또한 이벤트 처리기를 사용하면 더 좋습니다. – Mouser

답변

2

, 당신은 당신의 속성에서 자바 스크립트를 사용하는 습관을 벗어나,이 문제에 대한 이벤트 위임을 사용한다 :

function createTable(json_txt, el_id) { 
    var el = document.getElementById(el_id); 
    var o = JSON.parse(json_txt); 
    var s = '<table>'; 
    var num = numTableRows(o); // just returns number of rows 
    var tableData = []; 

    for (var r=0; r < num; r++) { 
     var rowData = {}; 

     s += '<tr class="tbl_data">'; 
     for (var col in o) { 
      var curVal = o[col][r]; 
      rowData[col] = curVal; 

      s += "<td data-row='" + r + "'>" + curVal + "</td>"; 
     } 
     s += '</tr>'; 

     tableData.push(rowData); 
    } 
    s += '</table>'; 
    el.innerHTML = s; 

    el.addEventListener("click", function(e) { 
     var targ = e.target, 
      rowNum, 
      data; 

     if(targ && targ.nodeName == "TD") { 
      rowNum = targ.getAttribute("data-row"); 
      data = tableData[rowNum]; 
      if (data) { 
       onTrackShowVal(this, data); 
      } 
     } 
    }); 
} 

jQuery를 사용하는 경우, 마지막 부분은 이와 같이 수행 될 수 있으며, 필요한 경우보다 구체적인 선택기를 제공하기 위해 "td" 문자열을 변경할 수 있습니다.

$(el).on("click", "td", function() { 
    var rowNum = $(this).data("row"), 
     data = tableData[rowNum]; 

    if (data) { 
     onTrackShowInfo(this, data); 
    } 
}); 
+0

이 요소는 innerHTML을 작성하는 함수에 매개 변수로 전달되는 div입니다. 또한 'js'는 onclick 핸들러가 지정되기 바로 전에 테이블의 모든 행에 대해 다시 작성됩니다. 전체 테이블 객체도 json 형식의 매개 변수로 전달됩니다. 그러나 당신의 대답은 진보되어 생각을위한 음식을 제공합니다. – DNT

+0

@DNT 위의 편집을 참조하십시오. 나는 테이블 객체를 접근 가능하게 만드는 부분을 포함하지 않았다. (당신이 의미하는 것이 확실하지 않다.)하지만 쉽게 통합 할 수 있어야한다. JSON에서 전체 테이블을 포함하는 코드를 표시하면 여기에 코드를 포함하는 방법을 보여줄 수 있습니다. – JLRishe

+0

이 코드를 사용하는 'createTable'함수의 매우 단순화 된 버전을 추가하여 원래 코드를 편집했습니다. 이 코드는 정기적 인 Ajax 호출에서 얻은 다른 데이터 나 업데이트 된 데이터로 브라우저에서 실행해야하므로 목표 중 하나가 테이블이나 행을 유지하는 데 전역 변수를 사용하는 것이 아닙니다. – DNT

0

봐 : @charlietfl에서 알 수 있듯이

var js = {}; 
for (var c in o) js[c] = o[c][r]; 
s += "<td onclick='onTrackShowInfo(this, "+c+")'>"; 

... 

function onTrackShowInfo(el, json_row_index) 
{ 
    var o = js[json_row_index]; 
    // ok, we have the row from element 'el' at this point 
} 
+0

나는 'js가 전역 변수가 아닌가 걱정됩니다. 그것은 전체 테이블 객체를 반복하고 HTML을 생성하는 함수 내에서 생성되므로 'js'는 핸들러에서 볼 수 없습니다. – DNT

+0

왜 글로벌 var를 만들지 않습니까? – Mouser

+0

테이블을 만드는 함수를 호출하여 페이지의 다른 영역에 다양한 유사 테이블을 만들 수 있으므로이 기능의 캡슐화가 필수적입니다. – DNT

관련 문제