html table insert/delete rows

本文介绍如何使用JavaScript进行HTML表格的增删改操作,包括插入、删除行元素及表头、表尾和表格标题等内容。

Deleting table rows
<html>
<head>
<script type="text/javascript">
function deleteRow(i){
    document.getElementById('myTable').deleteRow(i)
}
</script>
</head>

<body>
<table id="myTable" border="1">
<tr>
  <td>Row 1</td>
  <td><input type="button" value="Delete" onclick="deleteRow(this.parentNode.parentNode.rowIndex)"></td>
</tr>
<tr>
  <td>Row 2</td>
  <td><input type="button" value="Delete" onclick="deleteRow(this.parentNode.parentNode.rowIndex)"></td>
</tr>
<tr>
  <td>Row 3</td>
  <td><input type="button" value="Delete" onclick="deleteRow(this.parentNode.parentNode.rowIndex)"></td>
</tr>
</table>
</body>

</html>



Adding table rows

<html>
<head>
<script type="text/javascript">
function insRow(){
    var x=document.getElementById('myTable').insertRow(2)
    var y=x.insertCell(0)
    var z=x.insertCell(1)
    y.innerHTML="NEW CELL1"
    z.innerHTML="NEW CELL2"
}
</script>
</head>

<body>
<table id="myTable" border="1">
    <tr>
        <td>d</td>
        <td>d</td>
    </tr>
    <tr>
        <td>d</td>
        <td>d</td>
    </tr>
    <tr>
        <td>Row3 cell1</td>
        <td>Row3 cell2</td>
    </tr>
    <tr>
        <td>Row4 cell1</td>
        <td>Row4 cell2</td>
    </tr>
    <tr>
        <td>Row5 cell1</td>
        <td>Row5 cell2</td>
    </tr>
</table>
<form>
<input type="button" onclick="insRow()" value="Insert row">
</form>
</body>

</html>


Inserting/Removing Row Elements
<HTML>
<HEAD>
<TITLE>Modifying Table Cell Content</TITLE>
<STYLE TYPE="text/css">
THEAD {background-color:lightyellow; font-weight:bold}
TFOOT {background-color:lightgreen; font-weight:bold}
#myTABLE {background-color:bisque}
</STYLE>
<SCRIPT LANGUAGE="JavaScript">
var theTable, theTableBody
function init() {
    theTable = (document.all? document.all.myTABLE : 
        document.getElementById("myTABLE")
    theTableBody = theTable.tBodies[0]
}
function appendRow(form) {
    insertTableRow(form, -1)
}
function addRow(form) {
    insertTableRow(form, form.insertIndex.value)
}
function insertTableRow(form, where) {
    var now = new Date()
    var nowData = [now.getHours(), now.getMinutes(), now.getSeconds()
        now.getMilliseconds()]
    clearBGColors()
    var newCell
    var newRow = theTableBody.insertRow(where)
    for (var i = 0; i < nowData.length; i++) {
        newCell = newRow.insertCell(i)
        newCell.innerHTML = nowData[i]
        newCell.style.backgroundColor = "salmon"
    }
    updateRowCounters(form)
}
function removeRow(form) {
    theTableBody.deleteRow(form.deleteIndex.value)
    updateRowCounters(form)
}
function insertTHEAD(form) {
    var THEADData = ["Hours","Minutes","Seconds","Milliseconds"]
    var newCell
    var newTHEAD = theTable.createTHead()
    newTHEAD.id = "myTHEAD"
    var newRow = newTHEAD.insertRow(-1)
    for (var i = 0; i < THEADData.length; i++) {
        newCell = newRow.insertCell(i)
        newCell.innerHTML = THEADData[i]
    }
    updateRowCounters(form)
    form.addTHEAD.disabled = true
    form.deleteTHEAD.disabled = false
}
function removeTHEAD(form) {
    theTable.deleteTHead()    
    updateRowCounters(form)
    form.addTHEAD.disabled = false
    form.deleteTHEAD.disabled = true
}
function insertTFOOT(form) {
    var TFOOTData = ["Hours","Minutes","Seconds","Milliseconds"]
    var newCell
    var newTFOOT = theTable.createTFoot()
    newTFOOT.id = "myTFOOT"
    var newRow = newTFOOT.insertRow(-1)
    for (var i = 0; i < TFOOTData.length; i++) {
        newCell = newRow.insertCell(i)
        newCell.innerHTML = TFOOTData[i]
    }
    updateRowCounters(form)
    form.addTFOOT.disabled = true
    form.deleteTFOOT.disabled = false
}

function removeTFOOT(form) {
    theTable.deleteTFoot()    
    updateRowCounters(form)
    form.addTFOOT.disabled = false
    form.deleteTFOOT.disabled = true
}
function insertCaption(form) {
    var captionData = form.captionText.value
    var newCaption = theTable.createCaption()
    newCaption.innerHTML = captionData
    form.addCaption.disabled = true
    form.deleteCaption.disabled = false
}
function removeCaption(form) {
    theTable.deleteCaption()    
    form.addCaption.disabled = false
    form.deleteCaption.disabled = true
}
// housekeeping functions
function updateRowCounters(form) {
    var sel1 = form.insertIndex
    var sel2 = form.deleteIndex
    sel1.options.length = 0
    sel2.options.length = 0
    for (var i = 0; i < theTableBody.rows.length; i++) {
        sel1.options[inew Option(i, i)
        sel2.options[inew Option(i, i)
    }
    form.removeRowBtn.disabled = (i==0)
}
function clearBGColors() {
    for (var i = 0; i < theTableBody.rows.length; i++) {
        for (var j = 0; j < theTableBody.rows[i].cells.length; j++) {
            theTableBody.rows[i].cells[j].style.backgroundColor = ""        
        }
    }
}
</SCRIPT>
</HEAD>
<BODY onLoad="init()">
<H1>Modifying Tables</H1>
<HR>
<FORM NAME="controls">
<FIELDSET>
<LEGEND>Add/Remove Rows</LEGEND>
<TABLE WIDTH="100%" CELLSPACING=20><TR>
<TD><INPUT TYPE="button" VALUE="Append 1 Row" 
    onClick="appendRow(this.form)"></TD>
<TD><INPUT TYPE="button" VALUE="Insert 1 Row" onClick="addRow(this.form)"> at index: 
    <SELECT NAME="insertIndex">
        <OPTION VALUE="0">0
    </SELECT></TD>
<TD><INPUT TYPE="button" NAME="removeRowBtn" VALUE="Delete 1 Row" DISABLED 
    onClick="removeRow(this.form)"> at index: 
    <SELECT NAME="deleteIndex">
        <OPTION VALUE="0">0
    </SELECT></TD>
</TR>
</TABLE>
</FIELDSET>
<FIELDSET>
<LEGEND>Add/Remove THEAD and TFOOT</LEGEND>
<TABLE WIDTH="100%" CELLSPACING=20><TR>
<TD><INPUT TYPE="button" NAME="addTHEAD" VALUE="Insert THEAD" 
    onClick="insertTHEAD(this.form)"><BR>
    <INPUT TYPE="button" NAME="deleteTHEAD" VALUE="Remove THEAD" DISABLED 
        onClick="removeTHEAD(this.form)">
</TD>
<TD><INPUT TYPE="button" NAME="addTFOOT" VALUE="Insert TFOOT" 
    onClick="insertTFOOT(this.form)"><BR>
    <INPUT TYPE="button" NAME="deleteTFOOT" VALUE="Remove TFOOT" DISABLED 
        onClick="removeTFOOT(this.form)">
</TD>
</TR>
</TABLE>
</FIELDSET>
<FIELDSET>
<LEGEND>Add/Remove Caption</LEGEND>
<TABLE WIDTH="100%" CELLSPACING=20><TR>
<TD><INPUT TYPE="button" NAME="addCaption" VALUE="Add Caption" 
    onClick="insertCaption(this.form)"></TD>
<TD>Text: <INPUT TYPE="text" NAME="captionText" SIZE=40 VALUE="Sample Caption">
<TD><INPUT TYPE="button" NAME="deleteCaption" VALUE="Delete Caption" DISABLED 
    onClick="removeCaption(this.form)"></TD>
</TR>
</TABLE>
</FIELDSET>
</FORM>
<HR>
<TABLE ID="myTABLE" CELLPADDING=10 BORDER=1>
<TBODY>
</TABLE>
</BODY>
</HTML>

要让 SQLite 虚拟表支持写入操作(INSERT、UPDATE 和 DELETE),你需要在虚拟表模块中实现以下回调函数: - `xUpdate`:用于处理插入、更新和删除操作。 - `xRowid`:返回当前行的 rowid,对于更新和删除操作是必须的。 - `xSync`(可选):用于同步数据,比如提交事务时调用。 --- ### 核心步骤 1. **定义 xUpdate 回调函数**: - 它会接收一组参数,表示插入、更新或删除的数据。 - 返回值为 `SQLITE_OK` 表示成功,其他错误码表示失败。 2. **确保 xRowid 有效**: - 删除和更新操作需要知道受影响的行号(rowid)。 3. **设置声明为可变表(使用 `SQLITE_VTAB_DIRECTONLY` 或者不加)**: - 确保你的虚拟表允许写入操作。 --- ### 示例代码:支持 INSERT、UPDATE 和 DELETE 的虚拟表 ```c #include <sqlite3ext.h> SQLITE_EXTENSION_INIT1 #include <stdio.h> #include <stdlib.h> #include <string.h> // 模拟一个简单的内存存储 typedef struct Row { int id; char *name; } Row; static Row rows[10]; // 假设最多10行 static int rowCount = 0; // 游标结构体 typedef struct DemoVtabCursor { sqlite3_vtab_cursor base; int rowid; } DemoVtabCursor; // 虚拟表结构体 typedef struct DemoVtab { sqlite3_vtab base; } DemoVtab; // xCreate / xConnect static int demoCreate( sqlite3 *db, void *pAux, int argc, const char *const*argv, sqlite3_vtab **ppVtab, char **pzErr ){ DemoVtab *pVtab = sqlite3_malloc(sizeof(DemoVtab)); memset(pVtab, 0, sizeof(DemoVtab)); int rc = sqlite3_declare_vtab(db, "CREATE TABLE demo_table(id INTEGER PRIMARY KEY, name TEXT)"); if( rc == SQLITE_OK ){ *ppVtab = &pVtab->base; }else{ sqlite3_free(pVtab); } return rc; } // xBestIndex static int demoBestIndex(sqlite3_vtab *tab, sqlite3_index_info *info){ (void)tab; (void)info; return SQLITE_OK; } // xDisconnect / xDestroy static int demoDisconnect(sqlite3_vtab *vtab){ sqlite3_free(vtab); return SQLITE_OK; } // xOpen static int demoOpen(sqlite3_vtab *vtab, sqlite3_vtab_cursor **ppCursor){ DemoVtabCursor *cur = sqlite3_malloc(sizeof(DemoVtabCursor)); memset(cur, 0, sizeof(DemoVtabCursor)); cur->rowid = 0; *ppCursor = &cur->base; return SQLITE_OK; } // xClose static int demoClose(sqlite3_vtab_cursor *cur){ sqlite3_free(cur); return SQLITE_OK; } // xFilter static int demoFilter(sqlite3_vtab_cursor *cur, int a, const char *b, int c, sqlite3_value **d){ DemoVtabCursor *pCur = (DemoVtabCursor *)cur; pCur->rowid = 0; return SQLITE_OK; } // xNext static int demoNext(sqlite3_vtab_cursor *cur){ DemoVtabCursor *pCur = (DemoVtabCursor *)cur; pCur->rowid++; return SQLITE_OK; } // xEof static int demoEof(sqlite3_vtab_cursor *cur){ DemoVtabCursor *pCur = (DemoVtabCursor *)cur; return pCur->rowid >= rowCount; } // xColumn static int demoColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){ DemoVtabCursor *pCur = (DemoVtabCursor *)cur; Row *row = &rows[pCur->rowid]; switch(i){ case 0: sqlite3_result_int(ctx, row->id); break; case 1: sqlite3_result_text(ctx, row->name, -1, SQLITE_STATIC); break; } return SQLITE_OK; } // xRowid static int demoRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *rowid){ DemoVtabCursor *pCur = (DemoVtabCursor *)cur; *rowid = pCur->rowid + 1; return SQLITE_OK; } // xUpdate:处理插入、更新、删除 static int demoUpdate( sqlite3_vtab *vtab, int argc, sqlite3_value **argv, sqlite_int64 *rowid ){ (void)vtab; // 插入操作 if( sqlite3_value_type(argv[0]) == SQLITE_NULL ){ if(rowCount >= 10) return SQLITE_FULL; Row *newRow = &rows[rowCount]; newRow->id = sqlite3_value_int(argv[1]); newRow->name = strdup((const char*)sqlite3_value_text(argv[2])); *rowid = newRow->id; rowCount++; } // 更新操作 else if( argc > 1 ){ int rid = sqlite3_value_int(argv[0]) - 1; if(rid < 0 || rid >= rowCount) return SQLITE_ERROR; if(argv[1]){ // name free(rows[rid].name); rows[rid].name = strdup((const char*)sqlite3_value_text(argv[1])); } } // 删除操作 else { int rid = sqlite3_value_int(argv[0]) - 1; if(rid < 0 || rid >= rowCount) return SQLITE_ERROR; free(rows[rid].name); for(int i = rid; i < rowCount - 1; i++){ rows[i] = rows[i+1]; } rowCount--; } return SQLITE_OK; } // 模块定义 static sqlite3_module demoModule = { .iVersion = 0, .xCreate = demoCreate, .xConnect = demoCreate, .xBestIndex = demoBestIndex, .xDisconnect = demoDisconnect, .xDestroy = demoDisconnect, .xOpen = demoOpen, .xClose = demoClose, .xFilter = demoFilter, .xNext = demoNext, .xEof = demoEof, .xColumn = demoColumn, .xRowid = demoRowid, .xUpdate = demoUpdate, }; // 扩展加载入口 int sqlite3_demo_init(sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi){ SQLITE_EXTENSION_INIT2(pApi) int rc = sqlite3_create_module(db, "demo_table", &demoModule, NULL); if( rc != SQLITE_OK ){ *pzErrMsg = sqlite3_mprintf("Failed to create module"); } return rc; } ``` --- ### 编译与测试 #### 编译共享库 ```bash gcc -fPIC -shared demo_writable.c -o demo_writable.so -lsqlite3 ``` #### 在 SQLite 中测试写入操作 ```sql -- 加载扩展 .load ./demo_writable.so -- 创建虚拟表 CREATE VIRTUAL TABLE t1 USING demo_table; -- 插入数据 INSERT INTO t1(id, name) VALUES (1, 'Alice'); INSERT INTO t1(id, name) VALUES (2, 'Bob'); -- 查询 SELECT * FROM t1; -- 更新 UPDATE t1 SET name = 'Charlie' WHERE id = 1; -- 删除 DELETE FROM t1 WHERE id = 2; -- 查询验证 SELECT * FROM t1; ``` --- ### 解释 - `xUpdate` 是关键函数,它处理了三种类型的修改: - 插入:`argv[0]` 为 `NULL` - 更新:`argc > 1` 并且 `argv[0]` 是 rowid - 删除:只有 `argv[0]` 参数存在 - `xRowid` 必须返回有效的主键 ID,以便 SQLite 可以定位到被更新或删除的行。 - `xSync` 可以用于持久化数据(例如将内存中的数据写入磁盘)。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值