GVKun编程网logo

javascript-检测何时将文件拖到文件输入中(js检查文件是否存在)

11

在这里,我们将给大家分享关于javascript-检测何时将文件拖到文件输入中的知识,让您更了解js检查文件是否存在的本质,同时也会涉及到如何更有效地Html多文件输入–javascript访问和删除

在这里,我们将给大家分享关于javascript-检测何时将文件拖到文件输入中的知识,让您更了解js检查文件是否存在的本质,同时也会涉及到如何更有效地Html多文件输入 – javascript访问和删除文件、javascript – HTML动态添加文件输入不起作用、javascript – Html文件输入,从File对象设置选择、javascript – jQuery文件上传在动态创建文件输入时不起作用的内容。

本文目录一览:

javascript-检测何时将文件拖到文件输入中(js检查文件是否存在)

javascript-检测何时将文件拖到文件输入中(js检查文件是否存在)

我有这段代码可以检测用户何时单击文件输入以上传文件.

$('input:file').click(function() {
    // do stuff here
});

我发现许多用户都将文件拖到文件输入上以上传文件,并且这种情况不会触发.我考虑过将鼠标悬停,或者与mouseup结合使用,但是我不确定如何知道用户在执行此操作时是否持有文件.

为了澄清,我不需要实现拖放的帮助.另外,如果可能的话,我想继续使用文件输入,而不要使用涉及拖放到其他元素(例如div)上的解决方案.我希望放置在实际文件输入中.

如何检测文件被拖到文件输入上以便对它做出反应?

解决方法:

您可以对浏览器的本地拖动事件(例如dragenter和dragleave)做出反应

container.addEventListener("dragenter", this.dragenter, true);
container.addEventListener("dragleave", this.dragleave, true);

因此,您只需要定义要在拖动发生时监视的区域以及对此事件的操作即可.

Html多文件输入 – javascript访问和删除文件

Html多文件输入 – javascript访问和删除文件

我试图从html文件输入中删除值.

<input type="file" name="images" id="i1"multiple />

我似乎无法访问.files数组来删除其中一个值.我曾尝试使用隐藏的输入类型与文件值,但我不认为这可以做….所以我试图访问输入元素删除!

所有代码都有一个小提琴.有很多东西可以复制情况,但控制删除事件的代码大约是js的一半.

http://jsfiddle.net/dheffernan/ryrfS/1

有没有人有一个访问方法,例如多个文件上传和删除的第三个输入值?

下面的js代码 – 使用.splice尝试.

var files=jQuery('#i'+inputid)[0].files; 

        for (var i = 0; i < files.length; i++) {
        console.log(files[i].name);
        }
    var inputname= 3;
    jQuery('#i'+inputid).splice(inputname,1); 
 // no files are being deleted!!!

    console.log('2nd test');
    var files=jQuery('#i'+inputid)[0].files; 

        for (var i = 0; i < files.length; i++) {
        console.log(files[i].name);
        }

    }

解决方法

使用html5 FormData解决方案:

基本上将图像添加到FormData,使用ajax提交它并返回我上传它们的网址(我包括用于wordpress的PHP).我从js代码和PHP代码中删除了所有数据验证以保持简短,我仍然需要针对ie9 /较旧浏览器的解决方法.

jQuery代码:

jQuery(document).on('change','.imageup',function(){

        var id= jQuery(this).attr('id');
        var length= this.files.length;

        if(length>1) {// if a multiple file upload



        var images = new FormData();
        images.append('action','uploadimg'); //wordpress specific add functionname

            jQuery.each(event.target.files,function(key,value ){

                        images.append(key,value);

            });



        jQuery.ajax({
            url: '/wp-admin/admin-ajax.PHP',type: 'POST',data: images,cache: false,processData: false,contentType: false,success: function(data) {
                    var obj= JSON.parse(data);


                    jQuery.each(obj,value){
                        if(key!='errors') {
                        var ind = value.lastIndexOf("/") + 1;
                        var filename = value.substr(ind);

                        //do something here with filename
                        console.log(filename);
                        }
                    });

        }//end of success function
        }); //end ajax


    } 
});

PHP代码wordpress,如果不使用wordpress更改上面的url等.

function uploadimg() {

$error = false;
$files = array();
if ( ! function_exists( 'wp_handle_upload' ) ) require_once( ABSPATH . 'wp-admin/includes/file.PHP' );
$upload_overrides = array( 'test_form' => false );
$url=array();



foreach($_FILES as $file){

    $uploadimage= $file;

    $movefile = wp_handle_upload( $uploadimage,$upload_overrides );
        if ( $movefile ) {

            if($movefile['url']) {
                $url[]=$movefile['url'];
            } else {
                $url['errors'][]="error ".$movefile['file']." is not valid";
            }
    } else {

    }
}


$url['errors'][]="error is not valid";
echo json_encode($url);
exit; 



}

add_action('wp_ajax_uploadimg','uploadimg');
add_action('wp_ajax_nopriv_uploadimg','uploadimg');

javascript – HTML动态添加文件输入不起作用

javascript – HTML动态添加文件输入不起作用

例如,我有一个名为学生的部分

我允许用户动态添加学生

每个学生都有字段名称,点数和&图片

名字和名称积分有效.添加Image字段时出现问题

看到上面的附件,当我尝试从第二个学生中选择文件时,图像值将转到第一个学生.

< label for =“student-image-1”>指向第一名学生
< label for =“student-image-2”>指向第二个学生

并且文件输入的ID是正确的.

注意:我使用jQuery.clone来复制div

知道为什么我选择第二个输入将填充到第一个?

源代码

$('#student-add-more').click(function(e) {

    e.preventDefault();

    var count = $('div[id^=student-row-]').length;
    var last = $('div[id^=student-row-]').last();
    var $clone = last.clone(true);

    var next_id = count + 1;

    $clone.attr('id', 'student-row-' + next_id);

    $clone.find('.image-label')
        .attr('for', 'student-image-' + next_id)
    ;
    var fileinput = $clone.find('.filestyle')
        .attr('id', 'student-image-' + next_id)
        .attr('name', 'students_image['+count+']')
    ;

    fileinput.wrap('<form>').closest('form').get(0).reset();
    fileinput.unwrap();
    $clone.find('.bootstrap-filestyle > label.btn')
        .attr('for', 'student-image-' + next_id)
    ;
    $clone.find('.bootstrap-filestyle > input').val('');

    var delete_button = $clone.find('.btn-danger')
        .attr('data-url', 'student-row-' + next_id)
        .attr('href','#deleteModal')
        .attr('class', 'btn btn-danger btn-sm btn-delete')
    ;
    delete_button.closest('.form-group').removeAttr('style');

    $clone.show().insertAfter(last);
});

来自萤火虫的HTML

<div id="student-row-1">
    <div>
        <div>
            <span>1</span>
            <div></div>
            <labelfor="student-1">Name</label>                                            <em>*</em>
        </div>
        <div>
            <input type="text" value="" name="students[0][title]"id="title-1">                                        </div>
    </div>
    <div>
        <div>
            <labelfor="point-1">Points</label>                                            <em>*</em>
         </div>
        <div>
            <input type="text" value="" name="students[0][point]"id="point-1">                                        </div>
    </div>
    <div>
        <div>
            <labelfor="student-image-1">Image</label>                                            <em>*</em>
        </div>
        <div>
            <input type="file" name="students_image[0]" data-classinput="form-control inline input-s" data-classbutton="btn btn-default" data-icon="false"id="student-image-1"><divhttps://www.jb51.cc/tag/dis/" target="_blank">display: inline;"><input type="text" disabled=""> <labelfor="student-image-1"><span>Choose file</span></label></div>                                        </div>
    </div>
    <div>
        <div></div>
        <div>
            <a title="Delete" data-toggle="modal" href="#"data-url="student-row-1">Delete</a>
        </div>
    </div>
</div>
<div id="student-row-2"https://www.jb51.cc/tag/dis/" target="_blank">display: block;">
    <div>
        <div>
            <span>2</span>
            <div></div>
            <labelfor="student-1">Name</label>                                            <em>*</em>
        </div>
        <div>
            <input type="text" value="" name="students[1][title]"id="title-2">                                        </div>
    </div>
    <div>
        <div>
            <labelfor="point-1">Points</label>                                            <em>*</em>
         </div>
        <div>
            <input type="text" value="" name="students[1][point]"id="point-2">                                        </div>
    </div>
    <div>
        <div>
            <labelfor="student-image-2">Image</label>                                            <em>*</em>
        </div>
        <div>
            <input type="file" name="students_image[1]" data-classinput="form-control inline input-s" data-classbutton="btn btn-default" data-icon="false"id="student-image-2"><divhttps://www.jb51.cc/tag/dis/" target="_blank">display: inline;"><input type="text" disabled=""> <labelfor="student-image-2"><span>Choose file</span></label></div>                                        </div>
    </div>
    <div>
        <div></div>
        <div>
            <a title="Delete" data-toggle="modal" href="#deleteModal"data-url="student-row-2">Delete</a>
        </div>
    </div>
</div>

解决方法:

终于解决了问题,我才意识到文件输入是使用Bootstrap Filestyle.

// file
var file_container = $clone.find('.filestyle').parent();
file_container.empty();
var fileinput = $('<input>').addClass('filestyle').attr({
    id: 'student-image-'+next_id,
    name: 'students_image['+count+']',
    type: 'file',
});
file_container.append(fileinput);
fileinput.filestyle({
    icon: 'false',
    classButton: 'btn btn-default',
    classInput: 'form-control inline input-s',
});
var file_label_container = file_container.prev();
var new_label = $('<label>').addClass('image-label').attr('for', 'student-image-'+next_id).text(file_label_container.find('label').text());
file_label_container.find('label').remove();
file_label_container.prepend(new_label);

我删除了原始输入,并重新创建了一个普通输入,然后使用filestyle来设置文件输入的样式并附加到容器中.以及左侧的标签.

javascript – Html文件输入,从File对象设置选择

javascript – Html文件输入,从File对象设置选择

我理解< input type =“file”>由于安全原因,大多数情况下都无法通过 javascript进行操作,但是如果我有一个File对象可以吗?

我在页面上有一个拖动区域,我可以从中获取File对象.我不想使用xhr.sendAsBinary,我宁愿只是从目标设置为框架的常规表单上传.

我尝试过这样的事情

var select = document.getElementById('upload_1'); 
select.files[0] = myFile;
myForm.submit();

有没有办法做到这一点?

解决方法

UPDATE

您似乎想从drop事件中获取File对象并将其分配给< input>元件.不幸的是,你做不到.只有用户才能选择文件;您无法动态更改将上传的文件,因为出于安全原因,浏览器会拒绝JavaScript此功能.

既然你说你有一个拖动区域,我假设你正在使用并定位支持拖放的浏览器.请注意,并非所有浏览器都支持拖放,因此我的示例仅限于此类浏览器.

通过拖放,您可以从drop事件中获取File对象,而不需要输入元素.

// when you attach the 'drop' event listener
var dropzone = document.getElementById('drag_area'); // <-- ID of your drag area
attachEvent(dropzone,'drop',function(event) {

    var dt = event.dataTransfer;
    var fileList = dt.files;
    var file = fileList[0]; // you would have to change this if you allow multi-file upload

    uploadFile(file);

});

function uploadFile(filetoUpload) {

    var xhr = new XMLHttpRequest();
    xhr.open("POST","url",true);   // <-- provide the proper URL

    var form_data = new FormData();
    form_data.append('file',filetoUpload);
    xhr.send(form_data);

}

function attachEvent(element,type,fn) {
    if (element.addEventListener) {
        element.addEventListener(type,fn,false);
    } else if (element.attachEvent) {
        element.attachEvent('on' + type,fn);
    }
}

请注意,这不是100%浏览器兼容.某些浏览器不支持通过XMLHttpRequest()上传文件.如果您想支持这些浏览器,那么您必须做一些不同的事情.

最后,我的示例不考虑使用表单.如果您想要基于表单的方法,请告诉我.我也可以帮助你:)

如果您有任何疑问,请告诉我.

javascript – jQuery文件上传在动态创建文件输入时不起作用

javascript – jQuery文件上传在动态创建文件输入时不起作用

我正在使用这个jquery上传器(http://blueimp.github.io/jQuery-File-Upload/basic.html),当文件输入放在网站的原始代码中时它工作正常,但我动态地用jquery附加字段,它不起作用.这是触发上传的jquery:

$('.fileupload').fileupload({
    dataType: 'json',
    done: function (e, data) {
        $.each(data.result.files, function (index, file) {
            alert(file.name);
            //$('<p/>').text(file.name).appendTo(document.body);
        });
    }
});

这就是应该触发上传的内容:

<inputtype="file" name="files[]" data-url="uploads/">

这是jquery附加的代码:

$(document).on('click','.addItem', function(){
            $('<!--ROW START-->\
                <formdata-url="uploads/">\
                    <div>\
                        <div><input type="text"name="itemName[]"></div>\
                        <div><textareaname="itemDescription[]" cols="20" rows="1"></textarea></div>\
                        <div><textareaname="itemCondition[]" cols="20" rows="1"></textarea></div>\
                        <input type="hidden"name="itemId[]" value="">\
                        <input type="hidden" name="itemInventoryId[]" value="<?=$_GET["inventory_id"]?>">\
                        <input type="hidden" name="itemParent[]" value="'+$(this).closest('.formHolder').data('parent-room')+'">\
                        <div>\
                            <div>\
                                <inputtype="file" name="files[]">\
                            </div>\
                        </div>\
                        <div><i> </i>&nbsp;&nbsp;&nbsp;<i> </i></div>\
                    </div>\
                </form>\
            <!--/ROW END-->').fadeIn(500).appendTo($(this).parents().siblings('.items'));
            $(this).parent().parent().siblings('.widget-header, .header-margin, .hide').removeClass('hide').fadeIn();
        });

就像我说的,当我把它添加到实际的代码中,而不是动态它的罚款.有人可以帮忙吗?

解决方法:

这是因为在添加元素之前绑定了fileupload事件.

尝试将代码移动到回调函数中,该函数将在创建输入元素后执行.从appendTo()doesn’t support callback开始,你可以使用每个(回调):

$('code_that_you_append').appendTo('some_element').each(function () {
    // here goes $('.fileupload').fileupload({ ... }) function
});

如果需要在代码中的多个位置将事件绑定到.fileupload,则可以创建一个函数来避免代码重复,如下所示:

function bindFileUpload() {
    $('.fileupload').fileupload({
        dataType: 'json',
        done: function (e, data) {
            $.each(data.result.files, function (index, file) {
                alert(file.name);
            });
        }
    });
};

然后在回调中调用它,就像之前一样:

$('code_that_you_append').appendTo('some_element').each(function () {
    bindFileUpload();
});

我创建了一个little demo.它绑定click而不是fileupload来简化事情(fileupload是外部插件…),但一般规则保持不变.

关于javascript-检测何时将文件拖到文件输入中js检查文件是否存在的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Html多文件输入 – javascript访问和删除文件、javascript – HTML动态添加文件输入不起作用、javascript – Html文件输入,从File对象设置选择、javascript – jQuery文件上传在动态创建文件输入时不起作用的相关知识,请在本站寻找。

本文标签: