【问题标题】:Image not getting empty when cancel is clicked on file input?在文件输入上单击取消时图像不为空?
【发布时间】:2017-11-09 18:37:35
【问题描述】:

我正在为这个裁剪图像功能使用Croppie 插件。当用户单击文件输入的取消时,输入文本字段变为空并且图像不会变为空。当用户单击文件输入上的取消按钮时,我也想删除图像。 DEMO

HTML

<form action="test-image.php" id="form" method="post">
  <input type="file" id="upload" value="Choose a file">
  <div id="upload-demo"></div>
  <input type="hidden" id="imagebase64" name="imagebase64">
  <a href="#" class="upload-result">Send</a>
</form>

JS

$(document).ready(function() {
  var $uploadCrop;

  function readFile(input) {
    if (input.files && input.files[0]) {
      var reader = new FileReader();
      reader.onload = function(e) {
        $uploadCrop.croppie('bind', {
          url: e.target.result
        });
        $('.upload-demo').addClass('ready');
      }
      reader.readAsDataURL(input.files[0]);
    }
  }
  $uploadCrop = $('#upload-demo').croppie({
    viewport: {
      width: 200,
      height: 200,
      type: 'circle'
    },
    boundary: {
      width: 300,
      height: 300
    }
  });
  $('#upload').on('change', function() {
    readFile(this);
  });
  $('.upload-result').on('click', function(ev) {
    $uploadCrop.croppie('result', {
      type: 'canvas',
      size: 'original'
    }).then(function(resp) {
      $('#imagebase64').val(resp);
      $('#form').submit();
    });
  });   
});

【问题讨论】:

    标签: javascript jquery html crop croppic


    【解决方案1】:

    这对你有帮助

    $( document ).ready(function() {
        var $uploadCrop;
    
        function readFile(input) {
            if (input.files && input.files[0]) {
                var reader = new FileReader();          
                reader.onload = function (e) {
                    $uploadCrop.croppie('bind', {
                        url: e.target.result
                    });
                    $('.upload-demo').addClass('ready');
                }           
                reader.readAsDataURL(input.files[0]);
            }
        }
    
        $uploadCrop = $('#upload-demo').croppie({
            viewport: {
                width: 200,
                height: 200,
                type: 'circle'
            },
            boundary: {
                width: 300,
                height: 300
            }
        });
    
        $('#upload').on('change', function () { readFile(this); });
        $('.upload-result').on('click', function (ev) {
            $uploadCrop.croppie('result', {
                type: 'canvas',
                size: 'original'
            }).then(function (resp) {
                $('#imagebase64').val(resp);
                $('#form').submit();
            });
        });
        
        $('.reset').on('click', function(){
           $('input').val('');
           $('.cr-viewport').html('');
           $('.cr-image').attr('src','');
        });
    
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <form action="test-image.php" id="form" method="post">
    <input type="file" id="upload" value="Choose a file">
    <div id="upload-demo"></div>
    <input type="hidden" id="imagebase64" name="imagebase64">
    <a href="#" class="upload-result">Send</a>
    </form>
    
    <a class="reset">cancel</a>

    【讨论】:

    • 这不是答案。检查当用户单击文件输入时我要取消的演示链接。
    • 一旦用户上传,输入字段应该变成右边的取消按钮
    • 检查@Guruprasad 的答案。
    【解决方案2】:

    好吧,这可能是一个典型的场景,因为您无法将click event 绑定到文件上传的cancel 按钮,因为文件对话框的结果不会暴露给浏览器。所以我的建议是,将onchange event 写入文件上传元素并检查其值是否为空。如果是,则在销毁 croppie 实例后重置它。这是更新后的代码和 working Fiddle

    HTML

    <form action="test-image.php" id="form" method="post">
      <input type="file" id="upload" value="Choose a file" onchange="clearImage(this)" />
      <div id="upload-demo"></div>
      <input type="hidden" id="imagebase64" name="imagebase64">
      <a href="#" class="upload-result">Send</a>
    </form>
    

    JS

    var $uploadCrop;
    var opts = {
      viewport: {
        width: 200,
        height: 200,
        type: 'circle'
      },
      boundary: {
        width: 300,
        height: 300
      }
    };
    
    //change function.    
    function clearImage(ctrl) {
      if ($(ctrl).val() == "") {
        $('#upload-demo').croppie('destroy');
        $uploadCrop=$('#upload-demo').croppie(opts);
      }
    }
    
    $(document).ready(function() {
      function readFile(input) {
        if (input.files && input.files[0]) {
          var reader = new FileReader();
          reader.onload = function(e) {
            $uploadCrop.croppie('bind', {
              url: e.target.result
            });
            $('.upload-demo').addClass('ready');
          }
          reader.readAsDataURL(input.files[0]);
        }
      }
    
      $uploadCrop = $('#upload-demo').croppie(opts);
    
      $('#upload').on('change', function() {
        readFile(this);
      });
      $('.upload-result').on('click', function(ev) {
        $uploadCrop.croppie('result', {
          type: 'canvas',
          size: 'original'
        }).then(function(resp) {
          $('#imagebase64').val(resp);
          $('#form').submit();
        });
      });
    
    });
    

    【讨论】:

    • 完美@Guruprasad 你的解释让我对此有了更多的了解。再次感谢:)
    • 任何时候..快乐编码..:)
    • 我支持这个答案,这样你就可以在没有ajax的情况下将base64图像提交到服务器端。
    【解决方案3】:

    我意识到这篇文章已经选择了一个答案,但是有一种更简单的方法可以检测用户是否取消了文件选择对话框窗口。

    在您的onchange 函数中,您可以使用FileReader 构造函数和一个简单的if 语句来捕捉用户是否选择了一个文件。基本上,FileReader 构造函数让您的 Web 应用程序读取用户使用 File 或 Blob 对象选择的文件的内容。

    您只需调用一个简单的if 语句来检查上传的文件是否可以被FileReader 读取。在这种情况下,如果用户点击文件选择对话框窗口上的取消按钮,则无法读取文件。

    以下是如何实现此功能的示例。虽然下面的示例是在 JS 中,但它可以在 jQuery 函数中使用。

    input.onchange = function() {
        var file = this.files[0];
        var reader = new FileReader();
    
        reader.readAsDataURL(file);
    
        if(reader) {
            // A FILE WAS SELECTED.
        } else {
            // THE USER CANCELLED THE FILE SELECTION.
        }
    }
    

    您可以阅读有关FileReader Constructor 的更多信息,以了解有关其功能和浏览器支持的更多信息。

    这是我能找到的最简单的解决方案。我希望它可以帮助其他遇到此问题的人。

    【讨论】:

    • 谢谢@Matthew,下次我会检查的。该项目已经提交。 :)
    猜你喜欢
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 2012-01-21
    • 2018-09-12
    • 1970-01-01
    相关资源
    最近更新 更多