在使用javascript動(dòng)態(tài)向dom添加元素時(shí),像select2這樣的jquery插件不會(huì)自動(dòng)應(yīng)用于新元素。本文將詳細(xì)講解,當(dāng)向表格動(dòng)態(tài)添加包含`
在現(xiàn)代Web開(kāi)發(fā)中,通過(guò)JavaScript動(dòng)態(tài)地向頁(yè)面添加內(nèi)容是常見(jiàn)的操作。然而,當(dāng)這些動(dòng)態(tài)添加的元素需要應(yīng)用某些JavaScript庫(kù)或插件(例如Select2、Datepicker等)時(shí),開(kāi)發(fā)者常常會(huì)遇到插件不生效的問(wèn)題。這是因?yàn)榇蠖鄶?shù)JavaScript插件在頁(yè)面加載時(shí)會(huì)對(duì)現(xiàn)有DOM結(jié)構(gòu)進(jìn)行掃描并初始化。對(duì)于之后動(dòng)態(tài)添加的元素,它們并未包含在最初的掃描范圍內(nèi),因此需要手動(dòng)進(jìn)行初始化。
當(dāng)用戶點(diǎn)擊“添加”按鈕,通過(guò)JavaScript生成新的表格行,并在其中包含一個(gè)帶有js-dropdown類的<select>元素時(shí),即使該類名與Select2的初始化選擇器匹配,Select2插件也不會(huì)自動(dòng)對(duì)其生效。這是因?yàn)镾elect2插件在頁(yè)面初始加載時(shí),已經(jīng)對(duì)所有匹配的選擇器元素進(jìn)行了處理。新添加的<select>元素是在Select2初始化之后才出現(xiàn)的,因此它需要被明確告知進(jìn)行初始化。
解決此問(wèn)題的關(guān)鍵在于,在新的<select>元素被添加到DOM樹(shù)中之后,立即對(duì)其調(diào)用Select2的初始化方法。
首先,確保你的HTML頁(yè)面包含了jQuery和Select2的CSS及JavaScript文件。
立即學(xué)習(xí)“Java免費(fèi)學(xué)習(xí)筆記(深入)”;
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <link href="https://cdn.jsdelivr.net/npm/select2@4.0.13/dist/css/select2.min.css" rel="stylesheet" /> <script src="https://cdn.jsdelivr.net/npm/select2@4.0.13/dist/js/select2.min.js"></script> <table class="table table-striped" id="submissionTable"> <thead> <tr> <th>#</th> <th>ITEM</th> <th>QTY</th> <th>MEASURE BY</th> <th>UNIT PRICE</th> <th>LINE TOTAL</th> </tr> </thead> <tbody class="table-border-bottom-0"> <!-- 初始行,或占位行,此處可根據(jù)實(shí)際情況填充或留空 --> <tr id="tablerow0"></tr> </tbody> </table> <button id="add">添加新行</button>
在JavaScript代碼中,你需要完成以下幾個(gè)關(guān)鍵操作:
同時(shí),需要注意在構(gòu)建HTML字符串時(shí)可能出現(xiàn)的語(yǔ)法錯(cuò)誤,特別是關(guān)于屬性引號(hào)的閉合問(wèn)題。
以下是修正后的JavaScript代碼示例:
$(function () { let counter = 1; // 示例下拉選項(xiàng)數(shù)據(jù),實(shí)際應(yīng)用中可能從后端獲取 let dropdownOptions = [{Value:'0', Text: '選項(xiàng)一'}, {Value:'1', Text: '選項(xiàng)二'}]; $("#add").click(function () { // 構(gòu)建新的表格行HTML字符串 var newRow = $( '<tr id="tablerow' + counter + '"> ' + "<td>" + '<label id="CountItems"><strong>' + counter + "</strong></label>" + "</td>" + '<td width="40%">' + // 注意:這里修正了原始代碼中的ID屬性語(yǔ)法錯(cuò)誤 '<select onchange="sendInfo(this)" class="form-select js-dropdown" data-id= ' + counter + ' name="Item_Id[' + counter + ']" id="ItemId' + counter + '" required="required" ' + // 修正:id="ItemId' + counter + '" "</select>" + "</td>" + '<td width="10%">' + '<input type="text" class="form-control" name="Qty[' + counter + ']" value="1" id="Qty[' + counter + ']" onchange="calQtyBase(this)" data-QtyId= ' + counter + ' required="required" />' + "</td>" + '<td width="10%">' + '<input type="text" class="form-control" name="MeasureBy[' + counter + ']" value="" id="MeasureBy[' + counter + ']" readonly />' + "</td>" + '<td width="20%">' + '<input type="text" class="form-control" name="Unit_Price[' + counter + ']" value="0.00" id="UnitPrice[' + counter + ']" onchange="priceBase(this)" data-PriceId= ' + counter + ' required="required" />' + "</td>" + '<td width="20%">' + '<input type="text" class="form-control" name="Line_Total[' + counter + ']" value="0.00" id="LineTotal[' + counter + ']" required="required" />' + "</td>" + "<td>" + '<button type="button" class="btn btn-danger" onclick="removeTr(' + counter + ');">x</button>' + "</td>" + "</tr>" ); // 找到新行中的 <select> 元素 var selectElement = newRow.find("select"); // 填充 <select> 元素選項(xiàng) dropdownOptions.forEach(function (option) { var optionElement = $("<option>").val(option.Value).text(option.Text); selectElement.append(optionElement); }); // 將新行添加到DOM中 // 建議添加到tbody,而不是直接table,以保持HTML語(yǔ)義化 $("#submissionTable tbody").append(newRow); // 在新行被添加到DOM后,對(duì)其中的 <select> 元素初始化 Select2 selectElement.select2(); counter++; return false; // 阻止默認(rèn)的表單提交行為 }); // 假設(shè) sendInfo, calQtyBase, priceBase, removeTr 是在全局或其他地方定義的函數(shù) // 如果這些函數(shù)需要訪問(wèn)動(dòng)態(tài)元素,考慮使用事件委托 });
// 示例:使用事件委托處理動(dòng)態(tài)元素的change事件 $("#submissionTable").on("change", ".js-dropdown", function() { // sendInfo(this); // 調(diào)用相關(guān)處理函數(shù) console.log("Select2 dropdown changed:", $(this).val()); }); // 示例:使用事件委托處理刪除按鈕的點(diǎn)擊事件 $("#submissionTable").on("click", ".btn-danger", function() { // 獲取當(dāng)前行的counter或其他標(biāo)識(shí)符 let rowId = $(this).closest('tr').attr('id').replace('tablerow', ''); // removeTr(rowId); // 調(diào)用相關(guān)刪除函數(shù) $(this).closest('tr').remove(); // 移除當(dāng)前行 console.log("Row removed:", rowId); });
動(dòng)態(tài)添加DOM元素并應(yīng)用JavaScript插件是一個(gè)常見(jiàn)的開(kāi)發(fā)場(chǎng)景。解決此類問(wèn)題的關(guān)鍵在于理解插件的初始化生命周期,并在元素完全載入DOM后,對(duì)其進(jìn)行顯式初始化。通過(guò)本文提供的修正方法和最佳實(shí)踐,開(kāi)發(fā)者可以有效地解決Select2等插件在動(dòng)態(tài)內(nèi)容中不生效的問(wèn)題,確保用戶界面的交互性和功能完整性。同時(shí),養(yǎng)成嚴(yán)謹(jǐn)?shù)腍TML字符串構(gòu)建習(xí)慣和使用事件委托的編程范式,將大大提升代碼的健壯性和可維護(hù)性。
以上就是解決JavaScript動(dòng)態(tài)添加表格行中Select2下拉框不生效的問(wèn)題的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!
每個(gè)人都需要一臺(tái)速度更快、更穩(wěn)定的 PC。隨著時(shí)間的推移,垃圾文件、舊注冊(cè)表數(shù)據(jù)和不必要的后臺(tái)進(jìn)程會(huì)占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)