Page 70 - JavaScript修炼之道
P. 70

任务26  使用动态多文件上传              59


                   表单的HTML代码


                    form/uploads/index.html

                   <form method="post" action="server.php" enctype="multipart/form-data">
                     <ul id="uploads"></ul>
                     <p><input type="file" name="files[]" id="filSelector" /></p>
                     <p><input type="submit" value="Send these files" /></p>
                   </form>

                   将文件上传项加入队列

                    form/uploads/uploads.js

                   function queueFile() {
                     var fileName = $F(this), clone = this.cloneNode(true);
                     var item = new Element('li', { 'class': getFileClass(fileName) });
                     $(clone).observe('change', queueFile).setValue('');
                     this.parentNode.appendChild(clone);
                     item.appendChild(this);
                     item.appendChild(document.createTextNode(fileName));
                     item.insert('<button><img src="remove.png" alt="Remove" /></button>');
                     $('uploads').appendChild(item);
                   }

                   document.observe('dom:loaded', function() {
                     $('filSelector').observe('change', queueFile);
                     $('uploads').observe('click', handleQueueRemoval);
                   });

                   做得更气派:根据文件扩展名设置样式,移除被单击的队列项

                    form/uploads/uploads.js

                   var ICONS = $H({ word: $w('doc docx'), image: $w('jpg jpeg gif png') });

                   function getFileClass(fileName) {
                     var ext = (fileName.match(/\.(.+?)$/) || [])[1].toString().toLowerCase();
                     var icon = ICONS.detect(function(pair) { return pair[1].include(ext); });
                     return (icon || [])[0];
                   }

                   function handleQueueRemoval(e) {
                     var trigger = e.findElement('button');
                     trigger && trigger.up('li').remove();
                   }
   65   66   67   68   69   70   71   72   73   74   75