下面的这段Plupload插件代码中的
init: {
FilesAdded: function(up, files) { //文件上传前
var length_has_upload = $("#ul_pics").children("li").length;
if (files.length >= upload_total) { //超过上传总数量则隐藏
$("#local_upload").hide();
}
var li = '';
plupload.each(files, function(file) { //遍历文件
if (length_has_upload <= upload_total) {
li += "<li class='li_upload' id='" + file['id']
+ "'><div class='progress'>
+ <span class='bar'></span>
+ <span class='percent'>0%</span></div></li>";
}
length_has_upload++;
});
$("#ul_pics").prepend(li);
uploader.start();这段代码是Plupload文件上传插件中处理文件添加的核心逻辑,主要实现文件列表的动态生成和上传控制。以下是详细解析:
代码功能说明
核心条件判断:
javascriptCopy Codeif (length_has_upload <= upload_total) { li += "<li class='li_upload' id='" + file['id'] + "'><div class='progress'>" + "<span class='bar'></span>" + "<span class='percent'>0%</span></div></li>"; }当已上传文件数量
length_has_upload小于等于允许的总数量upload_total时,才会生成新的文件项每个文件项包含进度条结构(
bar和percent元素)循环机制:
通过
plupload.each(files, function(file) {...})遍历所有待上传文件每次循环检查当前文件是否在允许上传的数量范围内
满足条件则拼接HTML字符串到
li变量中关键变量:
length_has_upload:已上传文件计数器(初始值为当前列表项数量,每次循环+1)upload_total:允许上传的最大文件数li:用于累积拼接的HTML字符串
执行流程
初始化时获取当前已上传文件数量
遍历新添加的文件集合:
检查是否超过限制数量
未超限则生成带进度条的文件项HTML
更新已上传文件计数器
将生成的HTML插入到列表顶部
触发上传流程
循环特点
提前终止:当
length_has_upload超过upload_total时后续文件不再处理增量构建:通过字符串拼接逐步构建整个HTML片段
实时更新:每次循环后计数器立即更新,影响后续判断
这段代码典型应用于文件上传控件的客户端实现,既限制了最大上传数量,又提供了可视化进度反馈。
上面的li变量是如何累积的?
li += "<li class='li_upload' id='" + file['id'] + "'><div class='progress'>" + "<span class='bar'></span>" + "<span class='percent'>0%</span></div></li>";
这段代码中的li变量是通过字符串拼接(+=操作)逐步累积生成的,其核心机制如下:
1. 初始累积逻辑
初始状态:
li初始为空字符串(var li = '';)拼接语法:每次循环满足条件时,通过
+=将新生成的HTML片段追加到li末尾完整流程:
// 第一次循环 li = "<li class='li_upload' id='file1'><div class='progress'><span class='bar'></span><span class='percent'>0%</span></div></li>" // 第二次循环 li = "<li class='li_upload' id='file1'><div class='progress'><span class='bar'></span><span class='percent'>0%</span></div></li>" + "<li class='li_upload' id='file2'><div class='progress'><span class='bar'></span><span class='percent'>0%</span></div></li>"
2. 循环终止条件
计数器限制:
length_has_upload初始为已上传文件数,每次循环+1,当超过upload_total时停止拼接示例:
// 假设upload_total=2,当前已有1个文件 // 第一次循环:length_has_upload=2 → 生成新文件项 // 第二次循环:length_has_upload=3 → 终止拼接
3. 最终输出
批量插入:循环结束后,通过
$("#ul_pics").prepend(li)一次性插入所有累积的HTML结果示例:
<ul id="ul_pics"> <li class="li_upload" id="file2">...</li> <li class="li_upload" id="file1">...</li> </ul>
4. 关键点总结
这种设计既满足了动态生成需求,又确保了代码的可维护性和性能。
前面的代码中有一句
var length_has_upload = $("#ul_pics").children("li").length;
是什么意思?
代码功能解析
1. 变量定义
语句:
var length_has_upload = $("#ul_pics").children("li").length;作用:计算当前已上传文件的数量。
2. 具体解释
$("#ul_pics"):
通过ID选择器获取<ul id="ul_pics">元素,通常是文件列表的容器。
.children("li"):
获取该<ul>元素下所有直接子元素<li>(每个<li>代表一个已上传的文件项)。
.length:
返回这些<li>元素的数量,即已上传文件的总数。
3. 使用场景
初始化检查:
在文件上传前,先统计当前列表中已有的文件数量,作为后续判断的基准(length_has_upload)。动态控制:
结合upload_total(允许的最大上传数),决定是否允许新文件上传(见前文代码逻辑)。
4. 示例
假设#ul_pics包含以下内容:
<ul id="ul_pics"> <li class="li_upload" id="file1">...</li> <li class="li_upload" id="file2">...</li> </ul>
结果:
length_has_upload = 2(表示已有2个文件)。
5. 注意事项
仅统计直接子元素:
.children("li")不会递归统计嵌套的<li>(如子列表中的文件)。实时性:
若列表内容动态变化,需重新执行此语句以更新计数。
前面代码中这两句是什么意思?干啥的?
$("#ul_pics").prepend(li); uploader.start();
功能解析
1. $("#ul_pics").prepend(li);
作用:将累积生成的HTML文件列表片段插入到
<ul id="ul_pics">的最前面。关键点:
li是之前循环拼接的字符串(如<li>文件1</li><li>文件2</li>)prepend()会将这些<li>作为新内容插入到列表的首部,保持最新文件显示在最上方。示例效果:
<!-- 插入前 --> <ul id="ul_pics"> <li>旧文件1</li> <li>旧文件2</li> </ul> <!-- 插入后 --> <ul id="ul_pics"> <li>新文件1</li> <li>新文件2</li> <li>旧文件1</li> <li>旧文件2</li> </ul>
2. uploader.start();
作用:触发Plupload上传器的异步上传流程。
关键点:
仅当文件列表生成完成后调用,避免重复上传。
上传进度会通过前文代码中的
<span class="percent">实时更新。
整体协作逻辑
生成列表 → 2. 插入DOM → 3. 启动上传
(确保界面渲染与功能执行分离)
注意事项
若
li为空字符串(无新文件),prepend()不会报错但无实际效果。start()可能因浏览器策略或网络错误失败,需结合错误回调处理。
上面的prepend是个函数吗?
是的,prepend() 是 jQuery 提供的一个DOM操作方法,属于函数/方法(Function)。以下是具体说明:
1. prepend() 的功能
作用:将指定内容插入到匹配元素的内部起始位置(即作为第一个子元素)。
类比原生JS:相当于
parentNode.insertBefore(newNode, parentNode.firstChild)。示例:
// 插入单个元素
$("#ul_pics").prepend("<li>新文件</li>");
// 插入多个元素(前文代码中的用法)
$("#ul_pics").prepend(li); // li是拼接好的多个<li>字符串2. 与类似方法的区别
3. 前文代码中的用途
动态列表更新:将新上传的文件项显示在列表顶部(符合用户操作习惯,最新文件优先可见)。
性能优化:通过字符串拼接一次性插入多个元素,减少DOM操作次数。
4. 注意事项
参数可以是HTML字符串、DOM元素或jQuery对象。
若插入内容已存在于文档中,
prepend()会先移动该元素(而非复制)。