2012-02-03 42 views
1

我是非常新的Java腳本和jQuery,並設法創建一個可編輯的表,將做我需要做的一些計算。問題是,當我使用tab時,我希望它將光標移動到下一個單元格。如何通過使用「選項卡」導航contentEditable表

這是第一次在這裏發佈,所以如果我聽起來很可笑,請耐心等待!

這是我的html代碼部分的外觀。

<div id = "showTable" contentEditable="true" tabindex="0"> 
<table id="tbl" width = "850px" border="1"> 
    <tbody> 
    <th>Date Worked</th> 
    <th>Start</th> 
    <th>Meal break</th> 
    <th>End</th> 
    <th>Hourly Wage</th> 
    <th>Gross Earnings</th> 
    <th>Pay Date</th> 
    </tbody> 

</table> 
</div> 

之後,在javascript中,我有函數(我在網上找到的)會創建動態表。

function createDynamicTable(tbody, rows, cols) 
{ 
    if (tbody == null || tbody.length < 1) return; 
    for (var r = 0; r < rows; r++) 
    { 
     var trow = $("<tr>"); 
     for (var c = 0; c < cols; c++) 
     { 
      if(c == 0) 
      { 
       var dateWorked = "mm/dd/yyyy" ; 
       $("<td>") 
         .addClass("tableCell") 
         .text(dateWorked) 
         .data("col", c) 
         .appendTo(trow); 
       col[counter] = dateWorked; 
       counter++; 
       masterCounter++; 
      } 
      else if (c == 1) 
      { 
       var startTime = "h:mm AM/PM"; 
       $("<td>") 
         .addClass("tableCell") 
         .text(startTime) 
         .data("col", c) 
         .appendTo(trow); 

       col[counter] = startTime; 
       counter++; 
       masterCounter++; 
      } 
      else if (c == 2) 
      { 
       var mealBreakMin = "time in minutes"; 
       $("<td>") 
         .addClass("tableCell") 
         .text(mealBreakMin) 
         .data("col", c) 
         .appendTo(trow); 

       col[counter] = mealBreakMin; 
       counter++; 
       masterCounter++; 
      } 
      else if (c == 3) 
      { 
       var endTime = "h:mm AM/PM"; 
       $("<td>") 
         .addClass("tableCell") 
         .text(endTime) 
         .data("col", c) 
         .appendTo(trow); 

       col[counter] = endTime; 
       counter++; 
       masterCounter++; 
      } 
      else if (c == 4) 
      { 
       var hourlyWage = "$-.--"; 
       $("<td>") 
         .addClass("tableCell") 
         .text(hourlyWage) 
         .data("col", c) 
         .appendTo(trow); 

       col[counter] = hourlyWage; 
       counter++; 
       masterCounter++; 
      } 

      if(r == 6) 
      { 
       if (c == 5) 
       { 
        var grossPay = "$-.--"; 
        $("<td>") 
        .addClass("tableCell") 
        .text(grossPay) 
        .data("col", c) 
        .appendTo(trow); 

        col[counter] = hourlyWage; 
        counter++; 
        masterCounter++; 
       } 

       else if (c == 6) 
       { 
        var payDate = "mm/dd/yyyy"; 
        $("<td>") 
        .addClass("tableCell") 
        .text(payDate) 
        .data("col", c) 
        .appendTo(trow); 

        col[counter] = hourlyWage; 
        counter++; 
        masterCounter++; 
       } 
      } 

     } 
     trow.appendTo(tbody); 
    } 
    counter = 0; 
} 

現在,jQuery的一部分,我想是這樣

$(".tableCell").live('click', function(e) { 
    document.execCommand('selectAll', false, null); 
}); 

雖然我的目標是標籤下一個單元格,我第一次嘗試以下。

我認爲上面的代碼只會突出顯示單元的一部分。但是,它會突出顯示整個單元格。我查看了網頁,但無法找到確切的答案,他們的桌子的製作方式與我的相似。

如果有人能幫助我,這將是非常棒的。

+0

表的結構應該是可編輯的嗎?或者只是其中的字段?如果只是每個單元格的內容,我會建議創建沒有contentEditable的表格,而是選擇使用標籤,然後您可以在默認情況下選中它們。 – 2012-02-03 17:41:13

+0

編輯:我相信我不能只是做input type =「text」,因爲我創建函數的原因是用戶可以單擊一個按鈕,它會創建額外的表來寫入內容。在表中,它也執行基於用戶輸入的計算,所以我不確定如果你可以用我的代碼舉一些例子,那將會很棒! – 2012-02-03 18:09:52

+0

你可以發佈代碼中使用變量的部分:col,counter和masterCounter嗎? – 2012-02-03 18:19:25

回答

1

爲了說明我所建議的,我放在一起的jsfiddle,看看是否匹配你所追求的:

http://jsfiddle.net/u4pAg/2/

短短几年的7的,以配合您的中你的榜樣。每一個都包含一個標籤,其默認值基於createDynamicTable()函數中的內容。

我還添加了一個jQuery針...首先,我循環所有的輸入和存儲他們的ddefault值使用jQuery的.data()方法(http://api.jquery.com/data/)for以後使用。我刪除了焦點的默認值(但僅當它仍然是默認值時)。如果它不是默認值,它會保留那些內容,並選擇內容以便於更換/更新(如果您不喜歡自動選擇,可以將其刪除)。在模糊處,我檢查輸入是否保留空白,如果是這樣,我加回以前存儲的默認值。我通過在那裏的一些CSS以及一些視覺興趣。

EDIT ------

如果您createDynamicTable()函數,你更新你在哪裏你的設置的.text()的點,而是設置的.html()包括輸入標籤,而不僅僅是文字,它變成像這樣(我只是註釋掉沒有定義,它一直在尋找的增值經銷商,按我的評論您的帖子):

http://jsfiddle.net/u4pAg/4/

+0

非常感謝你的支持我已經在下面的鏈接中添加了源代碼前的代碼,再次感謝你,我從來沒有使用過input = text而不是table,因爲我所有的計算都是用表格(並且工作過)開始的,如果我能找到一個方法要使用輸入用戶寫入,並以某種方式放入數組中,我相信我不會必須更改計算代碼,並且仍然可以工作。 http://pastebin.com/jZbuc5Xp – 2012-02-03 18:44:08

+0

在您的指導下編輯完代碼後,我可以在按下「添加更多星期」按鈕後添加「表格」!現在只是爲了讓計算工作!我也會繼續尋找解決方案。感謝您的時間 – 2012-02-03 18:50:52

0

我遇到相同的要求,其中必須允許標籤& shift-tab鍵導航一個Ke中的contentEditable表ndo用戶界面編輯器。

在這種情況下,將輸入元素添加到每個單元格將不可行,因爲在保存編輯器內容時,任何嵌入的表單元素的值都會丟失。

我發現的解決方案利用了Window Selection API,捕獲了keydown事件。請參閱此處的工作概念證明: http://jsfiddle.net/dperish/30nh0wc3/

此方法應該足夠通用,可用於任何第三方編輯器控件以及原始contentEditable區域。在這篇文章發佈時,它似乎在最新版本的Chrome,Firefox,IE & Edge中完美運行。

/** 
 
* Enables tabbing/shift-tabbing between contentEditable table cells 
 
* @param {Window} win - Active window context. 
 
* @param {Event} e - jQuery Event object for the keydown that fired. 
 
*/ 
 
function tabifyEditableTable(win, e) { 
 

 
    if (e.keyCode !== 9) { 
 
    return false; 
 
    } 
 

 
    var sel; 
 

 
    if (win.getSelection) { 
 

 
    sel = win.getSelection(); 
 
    if (sel.rangeCount > 0) { 
 

 
     var textNode = null; 
 

 
     if (!e.shiftKey) { 
 
     textNode = (sel.focusNode.nodeName === "TD") 
 
      ? (sel.focusNode.nextSibling != null) 
 
      ? sel.focusNode.nextSibling 
 
      : (sel.focusNode.parentNode.nextSibling != null) 
 
       ? sel.focusNode.parentNode.nextSibling.childNodes[0] 
 
       : null 
 
      : (sel.focusNode.parentNode.nextSibling != null) 
 
       ? sel.focusNode.parentNode.nextSibling 
 
       : (sel.focusNode.parentNode.parentNode.nextSibling != null) 
 
       ? sel.focusNode.parentNode.parentNode.nextSibling.childNodes[0] 
 
       : null; 
 
     } else { 
 
     textNode = (sel.focusNode.nodeName === "TD") 
 
      ? (sel.focusNode.previousSibling != null) 
 
      ? sel.focusNode.previousSibling 
 
      : (sel.focusNode.parentNode.previousSibling != null) 
 
       ? sel.focusNode.parentNode.previousSibling.childNodes[sel.focusNode.parentNode.previousSibling.childNodes.length - 1] 
 
       : null 
 
       : (sel.focusNode.parentNode.previousSibling != null) 
 
       ? sel.focusNode.parentNode.previousSibling 
 
       : (sel.focusNode.parentNode.parentNode.previousSibling != null) 
 
        ? sel.focusNode.parentNode.parentNode.previousSibling 
 
      .childNodes[sel.focusNode.parentNode.parentNode.previousSibling.childNodes.length - 1] 
 
        : null; 
 
     } 
 

 
     if (textNode != null) { 
 
     sel.collapse(textNode, Math.min(textNode.length, sel.focusOffset + 1)); 
 
     if (textNode.textContent != null) { 
 
      sel.selectAllChildren(textNode); 
 
     } 
 
     e.preventDefault(); 
 
     return true; 
 
     } 
 
     
 
    } 
 
    
 
    } 
 

 
    return false; 
 

 
}

對於老版本的IE或Safari瀏覽器或支持,你可能需要回退的Range對象提供相同的功能。