我编写了一个简单的 JavaScript 函数:
function fireGENURL(a){
try{
var selectedFiles = $('.fileCheck:checked');
if(selectedFiles.length < 1 ){
alert("Please select at least one file.");
return false;
}
var fileID = $(selectedFiles[0]).attr('fileid');
/* var $fileChecks = $('.fileCheck:checked');
$fileChecks.each(function() {
var file = $(this).attr('fileid');
alert(file+"has been selected");
});
var count = $fileChecks.length;*/
$('body').pWin("open", {
x: 260,
y: 47,
height: 450,
width: 881,
title: "Generate URL",
skinMode:'dialog',
iframe:true,
url: "file/url/genurl.jsp",
data: {
nodeID:fileID
},
offResize:true,
offMove:true,
onTitle:false,
offBottom:true
});
}catch(e)
{
alert(e);
}
}
当我选中任何文件上的复选框并触发 GENURL 按钮时,就会调用上面的函数。下面是我的屏幕截图:
它调用 genurl.jsp
来检索选中复选框的 fileID。
GENURL.JSP:
<%
//grabs the file id of each file
long nodeID = Long.parseLong(request.getParameter("nodeID"));
//need to input logic to populate data on each row
int count = 0;
List files = fileFacade.list_items(nodeID);
for (Iterator rstltr = files.iterator(); rstltr.hasNext();) {
Fmedia fv = (Fmedia) rstltr.next();
Node nd = nodeFacade.get(fv.getNodeid(), false);
// Fmedia fm = fileFacade.get_file(fv.getNodeid());
count++;
%>
<tbody>
<tr>
<td width="5%">
<!-- Checkbox -->
<input type="checkbox" name="name1" />
</td>
<td>
<!-- No -->
</td>
<td width="28%">
<!-- Filename -->
<%=nd.getNodedesc()%>
</td>
</tr>
</tbody>
<%}
%>
如您所见,nd.getNodedesc
将返回文件名并填充我的 jsp 页表。
无论如何,如果我选中一个框并填充表格,它就会起作用,但是如果多次勾选并填充表格,如何让它检索多个文件 ID?
我知道这一行 var fileID = $(selectedFiles[0]).attr('fileid');
仅检索一个文件 ID,但我不知道如何让多个文件传递它到JSP页面。
编辑
在我的 JavaScript 函数中,在注释掉的代码下,该代码段能够检索多个文件 ID,但无法将值传递给 data
。
function fireGENURL(a){
try{
var selectedFiles = $('.fileCheck:checked');
if(selectedFiles.length < 1 ){
alert("Please select at least one file.");
return false;
}
cutFiles = new Object();
var count = 0;
for(var file in selectedItems){
var fileID = file.substring(0);
// post each selected fileID
cutFiles['fileID' + count] = fileID;
count += 1;
alert(fileID +" has been selected");
}
// var fileID = $(selectedFiles[0]).attr('fileid');
/* var $fileChecks = $('.fileCheck:checked');
$fileChecks.each(function() {
var file = $(this).attr('fileid');
alert(file+"has been selected");
});
var count = $fileChecks.length;*/
$('body').pWin("open", {
x: 260,
y: 47,
height: 450,
width: 881,
title: "Generate URL",
skinMode:'dialog',
iframe:true,
url: "file/url/genurl.jsp",
data: {
nodeID:fileID
},
offResize:true,
offMove:true,
onTitle:false,
offBottom:true
});
}catch(e)
{
alert(e);
}
}
编辑4
String[] split = request.getParameter("nodeID").split(",",0);
for(int i=0;i<split.length;i++){
long file=Long.parseLong(split[i]);
}
最佳答案
使用我知道的单个数据变量通过 JS 中的 HTML GET 传递数组的唯一方法是以某种方式将其字符串化:
var selectedFiles = [];
$('.fileCheck:checked').each(function() { selectedFiles.push($(this).attr('fileid')); });
var stringArray = JSON.stringify(selectedFiles);
$('body').pWin("open", {
x: 260,
y: 47,
height: 450,
width: 881,
title: "Generate URL",
skinMode:'dialog',
iframe:true,
url: "file/url/genurl.jsp",
data: {
nodeID:stringArray
},
offResize:true,
offMove:true,
onTitle:false,
offBottom:true
});
这将发送一个可以解析为数组的字符串:
JSON.parse(request.getParameter("nodeID"));
请参阅 Fiddle 示例,它会产生什么输出。
https://jsfiddle.net/h3Legzt6/1/
编辑:
但也有一些限制: What is the maximum length of a URL in different browsers?
其他方法是使用本地存储:
localStorage.setItem('IDs', JSON.stringify(selectedFiles));
和
JSON.parse(localStorage.getItem('IDs'));
这也有限制,但基于浏览器默认设置,仅限于更多空间。不幸的是,这个空间不能得到保证,因为用户可以配置 localStorage 可以占用多少空间。 What is the max size of localStorage values?
此外,请小心,因为多个选项卡可能会干扰此存储,并且在存储名称中包含一些调用标识,每个选项卡名称唯一的将是一个好主意,并向 JSP 提供此唯一 ID,以便 JSP 能够找到它。
编辑2:
要将其实现到您的代码中,应该这样做:
function fireGENURL(a){
try{
var selectedFiles = $('.fileCheck:checked');
if(selectedFiles.length < 1 ){
alert("Please select at least one file.");
return false;
}
var filesList = [];
var $fileChecks = $('.fileCheck:checked');
$fileChecks.each(function() {
filesList.push($(this).attr('fileid'));
});
var count = $fileChecks.length;
var stringArray = JSON.stringify(filesList);
$('body').pWin("open", {
x: 260,
y: 47,
height: 450,
width: 881,
title: "Generate URL",
skinMode:'dialog',
iframe:true,
url: "file/url/genurl.jsp",
data: {
nodeID:stringArray
},
offResize:true,
offMove:true,
onTitle:false,
offBottom:true
});
}catch(e)
{
alert(e);
}
}
编辑3:
根据评论,还可以生成一串分隔数字(例如:123,234)并在 JSP 中将它们拆分,然后将它们转换为循环中的 Long。
编辑4:
这只是一次尝试,语法可能是错误的,我想你已经差不多明白了。您可以分割、循环它并转换为 Long,这个 long 可以与代码的其余部分一起使用:
<%
String[] split = request.getParameter("nodeID").split(",",0);
for(int i=0;i<split.length;i++){
long file=Long.parseLong(split[i]);
//need to input logic to populate data on each row
int count = 0;
List files = fileFacade.list_items(file);
for (Iterator rstltr = files.iterator(); rstltr.hasNext();) {
Fmedia fv = (Fmedia) rstltr.next();
Node nd = nodeFacade.get(fv.getNodeid(), false);
// Fmedia fm = fileFacade.get_file(fv.getNodeid());
count++;
%>
<tbody>
<tr>
<td width="5%">
<!-- Checkbox -->
<input type="checkbox" name="name1" />
</td>
<td>
<!-- No -->
</td>
<td width="28%">
<!-- Filename -->
<%=nd.getNodedesc()%>
</td>
</tr>
</tbody>
<%}}
%>
关于JavaScript - 如何获取超过 1 个文件的文件 id 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55038907/