标题不是很具描述性,但我找不到更好的标题。随意编辑它。
基本上我正在寻找的是执行以下操作的最佳方式:
当用户点击“添加新项目”时,会添加一个带有缩进文本框的新行,并按上述方式下拉。我能想到的选项如下:
<script language="html">
标签来定义模板。)你有什么建议?我对上述任何解决方案都不满意。
答案 0 :(得分:1)
如果您已在页面上使用jquery或sencha等框架,那么您也可以使用它。
否则,我会尽量保持简单。这看起来不是一个非常重要的核心功能,所以不要创建需要额外的https请求甚至整个库加载的东西。克隆或生成html可能看起来不太优雅,但它将是:
不要创造像过程一样过分的东西。
答案 1 :(得分:1)
假设超简单的方法,并且您的格式在表中:
<table>
<tr>
<td><input type="text" name="item_name" placeholder="item name" /></td>
<td><select name="item_type"><option value="" selected="selected">Type</option></select></td>
</tr>
<tr>
<td><input type="text" name="item_name" placeholder="item name" /></td>
<td><select name="item_type"><option value="" selected="selected">Type</option></select></td>
</tr>
<tr>
<td colspan="2" id="add">+ Add new item</td>
</tr>
</table>
您可以使用以下内容:
$('#add').on('click',function(e){
var $this = $(this);
var $newRow = $this.closest('table').find('tr:first').clone();
$newRow.find(':input').val('');
$newRow.insertBefore($this.parent());
});
细分:
$this.closest('table')
).clone()
).find(':input').val('')
)$newRow.insertBefore(...)
)上方的表格中您也可以采用模板方法,但这取决于您以及您对输出的控制程度。
答案 2 :(得分:1)
虽然我意识到你已经接受了答案,但我认为我会提供一种简单的JavaScript方法来实现同样的目标:
function closest(el, tag) {
if (!el || !tag) {
return false;
}
else {
var curTag = el.tagName.toLowerCase();
return curTag == tag.toLowerCase() && curTag !== 'body' ? el : closest(el.parentNode, tag);
}
}
function addRow(el) {
if (!el) {
return false;
}
else {
var tr = closest(el, 'tr').previousElementSibling,
newRow = tr.cloneNode(true);
tr.parentNode.insertBefore(newRow, tr.nextSibling);
}
}
document.getElementById('add').onclick = function() {
addRow(this);
}
修改上述内容,添加一个简单的垫片来处理那些没有实现previousElementSibling
的浏览器:
function closest(el, tag) {
if (!el || !tag) {
return false;
}
else {
var curTag = el.tagName.toLowerCase();
return curTag == tag.toLowerCase() && curTag !== 'body' ? el : closest(el.parentNode, tag);
}
}
function prevElementSiblingShim(el) {
if (!el) {
return false;
}
else {
var prevSibling = el.previousSibling;
return prevSibling.nodeType == 1 ? prevSibling : prevElementSiblingShim(prevSibling);
}
}
function addRow(el) {
if (!el) {
return false;
}
else {
var par = closest(el, 'tr'),
tr = par.previousElementSibling || prevElementSiblingShim(par),
newRow = tr.cloneNode(true);
tr.parentNode.insertBefore(newRow, tr.nextSibling);
}
}
document.getElementById('add').onclick = function() {
addRow(this);
}
参考文献:
答案 3 :(得分:0)
将字符串中的HTML插入DOM是最有效的方法。除非你一次插入数百个,否则它并不重要。