2009-09-09 46 views
0

我有一个jsp页面,其中有一个输入类型文件,我允许用户浏览文件。我有一个这样的输入在jsp上,其余我通过JavaScript动态生成。在动态生成jsp文件时保留输入类型文件的值

这是我的JSP代码:

<div id="labelContainer" style="display:inline"> 
<table align="center"> 
<tr> 
<td align="left"><input type="text" id="label0" name="label0" size="15"></td> 
<td align="center"><input type="file" id="filePath0" name="browsetrainset0"></td> 
<td id="addlabel" ><img src="../images/add.png" title="Add Label" onclick="addLabel()"></td> 
<td id="removelabel"><img src="../images/remove.png" title="Remove Label" onclick="removeLabel('labelDiv0')"></td> 
</tr> 
</table> 
</div> 

,这是我javacsritp代码:

function addLabel(){ 
var text=""; 
lCount++; 
text+=("<table id='labelDiv"+lCount+"' align='center'>"); 
text+=("<tr>"); 
text+=("<td align='left' style='display:none'><input type='checkbox' checked='true' name='labelchkbox'/></td>"); 
text+=("<td align='left' id='label'><input type='text' id='label"+lCount+"' name='label"+lCount+"' size='15'></td>"); 
text+=("<td align='center'id='filePath' ><input type='file' id='filePath"+lCount+"'name='browsetrainset"+lCoun t+"'></td>"); 
text+=("<td id='addlabel' ><img src='../images/add.png' title='Add Label' onclick='addLabel()'></td>"); 
text+=("<td id='removelabel'><img src='../images/remove.png' title='Remove Label' onclick=\"removeLabel('labelDiv"+lCount+"')\"></td>"); 
text+=("</tr>"); 
text+=("</table>"); 
document.getElementById("labelContainer").innerHTM L+=text; 
} 

但林不能够保留我浏览文件路径的值,在JSP页面一旦我点击添加标签并生成另一个输入类型文件。 我正在使用IE7。请告诉我如何重新浏览文件的价值,以便我可以进一步使用它们。

+0

纠正我,如果我错了,但这与JSP无关......? – skaffman 2009-09-09 13:29:19

回答

1

document.getElementById(“labelContainer”)。innerHTM L + = text;

永远不要在innerHTML上使用+ =。它不会做你的想法。

相反,它很费力地将div的整个内容串行化为HTML,将您的字符串添加到HTML代码中,然后将整个区域解析回对象。

这很慢,并且丢失HTML字符串中不能记住的所有信息,例如JavaScript引用,事件处理程序(所有onclicks将停止工作)和表单字段内容(包括文件上载)。

你可以添加所有的新的HTML内容到一个临时容器而不是,然后移动使用DOM方法目标:

var div= document.createElement('div'); 
div.innerHTML= text; 
while (div.firstChild) 
    document.getElementById("labelContainer").appendChild(div.firstChild); 

或者你可以使用DOM方法来创建和直接添加节点。在你的情况下,由于新的节点是如此相似,旧的,你可以克隆它们:

function addLabel() { 
    var container= document.getElementById('labelContainer'); 
    var tables= container.getElementsByTagName('table'); 
    var n= tables.length; 
    var table= tables[0].cloneNode(true); 

    table.id= 'labelDiv'+n; 
    var inputs= table.getElementsByTagName('input'); 
    inputs[0].id=inputs[0].name= 'label'+n; 
    inputs[1].id=inputs[1].name= 'browsetrainset'+n; 

    container.appendChild(table); 
} 

(护理:IE具有虽然改变字段名的东西像单选按钮的一些问题)

如果你想在没有JavaScript的情况下访问(通常是一个好主意),通常的做法是包含最大数量的条目,并使用脚本隐藏未使用的条目。

+0

非常谢谢你。这对我来说非常合适。 – nidhiac 2009-09-11 12:12:51

0

如果我没有记错,不可能以编程方式设置与<input type="file">元素关联的filepsec,因为这会构成安全风险,因为允许恶意脚本上传用户未特意选择的文件。

设置filespec的唯一方法是从Web浏览器浏览它。