使用 Jquery 限制以表单形式克隆的文件输入

发布于 2024-10-09 17:27:50 字数 696 浏览 4 评论 0原文

我使用这个 Jquery 函数来克隆表单中的文件输入字段,

$(function() {
    var scntDiv = $('#clone');
    var i = $('#clone p').size() + 1;

    $('#addImg').live('click', function() {
            $('<p><label for="attach"><input type="file" name="attachment_'+ i +'"  /> <a href="#" id="remImg">Remove</a></label></p>').appendTo(scntDiv);
            i++;
            return false;
    });

    $('#remImg').live('click', function() {
            if( i > 2 ) {
                    $(this).parents('p').remove();
                    i--;
            }
            return false;
    });
});

是否可以限制可以克隆的字段?假设有 4 个字段?

非常感谢,
菲利普

i use this Jquery function to clone the file input fields in my form,

$(function() {
    var scntDiv = $('#clone');
    var i = $('#clone p').size() + 1;

    $('#addImg').live('click', function() {
            $('<p><label for="attach"><input type="file" name="attachment_'+ i +'"  /> <a href="#" id="remImg">Remove</a></label></p>').appendTo(scntDiv);
            i++;
            return false;
    });

    $('#remImg').live('click', function() {
            if( i > 2 ) {
                    $(this).parents('p').remove();
                    i--;
            }
            return false;
    });
});

is it possible to limit the fields that can be cloned? lets say a number of 4 fields?

thanks a lot,
Philip

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

滥情哥ㄟ 2024-10-16 17:27:50

例如,首先在添加输入的函数中使用它:

if($('input[name^="attachment_"]').length>=4){return false;}

它使用以 attachment_ 开头的名称属性对输入进行计数,如果找到 4,则离开该函数。

此外:您不应该对克隆的元素使用 ID,因为 ID 必须是唯一的,但在本例中它们不是唯一的。使用其他属性,例如 classname

Use for example this first inside the function that adds an input:

if($('input[name^="attachment_"]').length>=4){return false;}

It counts the input's with a name-attribute that starts with attachment_ and leaves the function if 4 are found.

Furthermore: you shouldn't use IDs for the elements that you clone, because IDs have to be unique, what they are not in this case. Use other attributes like class or name.

池予 2024-10-16 17:27:50

除了 Dr.Molle 的回答之外...检查/限制服务器端输入字段的数量。因为JS可以在客户端操作..

In Addition to the answer from Dr.Molle...check/limit the amount of the input fields on the server side. Because JS can be manipulated on the client side..

北恋 2024-10-16 17:27:50

要真正正确处理它,您需要其他东西,如下所示:

$(function() {
    $('#addImg').live('click', function(e) {
       for(var i=1; i<5; i++) { 
         if ($('#clone input[name="attachment_'+i+'"]').length == 0) break;
         if(i == 4) return false;
       }
       $('<p><label><input type="file" name="attachment_'+ i +'"  /> <a href="#" class="remImg">Remove</a></label></p>').appendTo('#clone');
       e.preventDefault();
    });

    $('#clone').delegate('.remImg', 'click', function(e) {
       if($('#clone input[name^="attachment_"]').length > 1) {
          $(this).closest('p').remove();
       }
       e.preventDefault();
    });
});

您可以对其进行测试(查看生成的 HTML /节点)在这里

它会循环执行什么操作并找到第一个可用的 i 来使用。您的原始代码假设最后一个始终是被删除的,但情况可能并非如此,并且您仍然会遇到重复的数字。相反,这个循环会获取第一个可用索引并使用它...如果我们到达 4 并且它们都在使用中,则中止(您可以添加一个 alert()if 中的内容(如果您愿意的话)。

另请注意 remImg 类的使用,因为它是重复的,以及 .delegate() 效率更高一点...您也可以使用普通的 #addImg 上的“nofollow">.click() 处理程序,但我不能 100% 确定它在此处的位置。

To really handle it correctly, you need something else, like this:

$(function() {
    $('#addImg').live('click', function(e) {
       for(var i=1; i<5; i++) { 
         if ($('#clone input[name="attachment_'+i+'"]').length == 0) break;
         if(i == 4) return false;
       }
       $('<p><label><input type="file" name="attachment_'+ i +'"  /> <a href="#" class="remImg">Remove</a></label></p>').appendTo('#clone');
       e.preventDefault();
    });

    $('#clone').delegate('.remImg', 'click', function(e) {
       if($('#clone input[name^="attachment_"]').length > 1) {
          $(this).closest('p').remove();
       }
       e.preventDefault();
    });
});

You can test it out (seeing the generated HTML/nodes) here.

What this does it loop through and finds the first available i to use. Your original code assumes the last one is always the one removed, this may not be the case, and you'd still have a number repeated. Instead this loops though, gets the first available index and uses that...if we get to 4 and they were all in use, abort (you could add an alert() or something in that if as well, if you wanted).

Also note the use of a class for remImg since it's repeated, and the use of .delegate() to be a bit more efficient...you can also probably use just a normal .click() handler on #addImg, but I'm not 100% sure of it's location here.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文