【问题标题】:HTML5 drag and drop file fieldHTML5 拖放文件字段
【发布时间】:2012-06-02 05:16:29
【问题描述】:

我想通过拖放功能增强关键表单。我知道现代浏览器可以通过 HTML5 文件 API 实现这一点。

但我不希望即时上传或上传多个文件,我只是在寻找旧式文件字段的重复功能。

在做了一些研究之后,我发现 HTML5 文件 API 需要从表单的其余部分独立上传(蹩脚)。这不是我们想要的行为。

然后我考虑制作一个标准文件字段并将其设置为position : absolute; visibility : hidden;,并且必须通过.mousemove 在 dropZone 内跟随鼠标。但这是不可能的,因为当用户抓取他们的文件时,浏览器窗口不在焦点上!

我还尝试使文件字段变得巨大且不可见,但是以这种方式设置字段的样式是不可能的。

有什么想法吗?

【问题讨论】:

    标签: javascript jquery html file-upload


    【解决方案1】:

    这是最终的工作,我将原版上传字段设置为 opacity : 0,并在鼠标悬停在可见的 dropZone div 上方时,通过 'dragover' 事件将其放置在鼠标下方。

    'dragover' 克服了浏览器窗口失焦的问题,并提供了.pageX 和.pageY,然后我将它们绑定到不可见文件字段的.top 和.left。

    但是,文件字段的结果位置在 osx 和 windows 操作系统上是不同的,因此必须根据操作系统适当地放置文件字段。我在下面粘贴我的工作代码,并且我编写了一个检测浏览器、操作系统和设备的库。所以你需要找到自己的方法来检测 osx vs windows。

    dropText  = $ '#dropText'
    jdropZone = $ '#resume'
    fileField = $ '#draggy'
    
    unless $.browser.msie
    
        `var addEvent=(function(){if(document.addEventListener){return function(el,type,fn){if(el&&el.nodeName||el===window){el.addEventListener(type,fn,false)}else if(el&&el.length){for(var i=0;i<el.length;i++){addEvent(el[i],type,fn)}}}}else{return function(el,type,fn){if(el&&el.nodeName||el===window){el.attachEvent('on'+type,function(){return fn.call(el,window.event)})}else if(el&&el.length){for(var i=0;i<el.length;i++){addEvent(el[i],type,fn)}}}}})();(function(){var pre=document.createElement('pre');pre.id="view-source";addEvent(window,'click',function(event){if(event.target.hash=='#view-source'){if(!document.getElementById('view-source')){var xhr=new XMLHttpRequest();xhr.onreadystatechange=function(){if(this.readyState==4&&this.status==200){pre.innerHTML=this.responseText.replace(/[<>]/g,function(m){return{'<':'&lt;','>':'&gt;'}[m]});prettyPrint()}};document.body.appendChild(pre);xhr.open("GET",window.location,true);xhr.send()}document.body.className='view-source';var sourceTimer=setInterval(function(){if(window.location.hash!='#view-source'){clearInterval(sourceTimer);document.body.className=''}},200)}})})();`
    
        x = 0
        y = -50
    
        x = -200 unless device.mac
        x = -130 if device.mac      
    
        #alert x
    
        dragover = (e) ->
            #e.preventDefault()
            fileField.css top : e.pageY+y, left : e.pageX+x
    
        dropZone = document.getElementById 'resume'
    
        addEvent dropZone, 'dragover', dragover
    
        fileField.on 'change', ->
            fieldVal = fileField.attr 'value'
            fieldVal = fieldVal.split 'fakepath'
            fieldVal = fieldVal[fieldVal.length-1]
            fieldVal = fieldVal.substr 1, fieldVal.length if $.browser.webkit
            dropText.text 'Your Resume: '+fieldVal
    
    else
    
        fileField.css
            position : 'static'
            opacity  : 1
        dropText.text 'Upload Your Resume Here: '
    

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 2012-02-13
      • 2011-09-24
      • 1970-01-01
      • 2011-11-16
      • 2012-06-08
      • 1970-01-01
      • 2012-11-08
      • 1970-01-01
      相关资源
      最近更新 更多