JavaScript - 如何获取超过 1 个文件的文件 id 属性?

标签 javascript

我编写了一个简单的 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 按钮时,就会调用上面的函数。下面是我的屏幕截图:

Screenshot

它调用 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" />&nbsp;
            </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" />&nbsp;
            </td>

            <td>

                <!-- No   -->

            </td>
            <td width="28%">

                <!-- Filename   -->
                <%=nd.getNodedesc()%>
            </td>


        </tr>

        </tbody>


    <%}}
    %>

关于JavaScript - 如何获取超过 1 个文件的文件 id 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55038907/

相关文章:

javascript - 为什么在使用 switch 语句循环对象中的键时会出现流错误?

javascript - 设置 iframe 的样式,然后使其可见

javascript - insertRow() 到特定行 id

javascript - Flowtype:不安全的实例变量访问

javascript - 从服务 Angular 5 设置和获取数据

javascript - 如何将选中的复选框数据附加到html <div> 标签中的列表顶部?

javascript - crm2013 - 如何过滤特定实体的客户端查找

javascript - css - 扩展导航栏防止点击输入

javascript - 无法识别或风格化 d3 中的拉丝(即选定)元素

javascript - 如何将 item 更新到 PostgreSQL 中的 jsonb 数据类型列