原生js上传插件,上传图片问题!

https://www.jq22.com/jquery-info22747
上面是我使用的一个上传插件。
使用场景:选择图片,点击提交按钮,上传到服务器。
遇到的问题是:我上传了正确的图片,点击提交按钮的时候,会执行if里(正常应该执行else里的)。也就是说我上传框的图片没问题,但是也alert。
这个问题在PC端重现不出来,只在手机和ipad偶尔出现过,所以不知道怎么调试。

submitInfo: function() {
        var that = this
        var img1 = ''
        var img2 = ''
        var imgList = []
        // 判断上传框为空,或者上传非图片文件
        if (!this.cupload1.uploadInput.files[0] ||
          !this.cupload2.uploadInput.files[0] ||
          !this.cupload1.uploadInput.files[0].base64 ||
          !this.cupload2.uploadInput.files[0].base64) {
          alert("请上传图片")
          return;
        } else {
          img1 = this.cupload1.uploadInput.files[0].base64;
          img2 = this.cupload2.uploadInput.files[0].base64;
          imgList = [
            {
              fileSuffix: this.cupload1.uploadInput.files[0].fileSuffix,
              fileData: img1,
            },
            {
              fileSuffix: this.cupload2.uploadInput.files[0].fileSuffix,
              fileData: img2,
            },
          ]
        }
        var paramsObj = JSON.stringify({
          params: {
            idAttatchments: imgList
          }
        })
        $.ajax({
          type: "POST",
          url: "XXXX",
          contentType: "application/json;charset=UTF-8",
          data: paramsObj,
          success: function (data) {
            that.deleteImg()
            if (data.resultStatus === 'NORMAL') {
              that.step = 'second'
            } else {
              alert(data.message);
              return;
            }
          },
        })
      },

直接改获取dom中的预览图片数据来验证即可。


<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>cupload例子</title>
</head>
<body>
    <p>图片1</p>
    <div id="cupload-1"></div>
    <p>图片2</p>
    <div id="cupload-2"></div>
    <input type="button" onclick="obj.submitInfo()" value="开始上传" />

    <script src="https://g.csdnimg.cn/??lib/jquery/1.12.4/jquery.min.js"></script>
    <script src="https://www.jq22.com/demo/cupload202001100928/static/js/cupload.js"></script>
    <script>

        var obj = {
            cupload1: new Cupload({ ele: '#cupload-1' }),
            cupload2: new Cupload({ ele: '#cupload-2' }),
            submitInfo: function () {
                var ul = $('ul.cupload-image-list'), img = ul.find('img');
                if (img.length != ul.length) {//图片容器和预览图片不一致(预览图片为选择图片未生成),所以只需要判断图片数量和容器是否一致就能知道是否选了图片
                    alert("请上传图片")
                    return
                }
                imgList = []
                img.each(function () {
                    var arr = this.src.split(';base64,');
                    var fileSuffix = arr[0].split('/').pop().toLowerCase();
                    if (fileSuffix == 'jpeg') fileSuffix = 'jpg';
                    var item = {
                        fileSuffix: fileSuffix,
                        fileData: arr[1],
                        id: 'id不太清楚怎么命名的'
                    }
                    imgList.push(item);
                });

                console.log(imgList)
                var paramsObj = JSON.stringify({
                    params: {
                        idAttatchments: imgList
                    }
                });


                $.ajax({
                    type: "POST",
                    url: "XXXX",
                    contentType: "application/json;charset=UTF-8",
                    data: paramsObj,
                    success: function (data) {
                        that.deleteImg()
                        if (data.resultStatus === 'NORMAL') {
                            that.step = 'second'
                        } else {
                            alert(data.message);
                            return;
                        }
                    },
                })
            }
        }
    </script>
</body>
</html>

打印一下this.cupload1.uploadInput,是不是数据结构不一样

源码里面是通过this.uploadInput.files.length来判断图片是否选择的,你也可以这样判断。
你的判断出问题的可能原因:
1、你if里面的cupload1,cupload2,首先要确定你这2个对象是完全独立的2个,如果你页面上要上传多个属性的图片,最好是完全独立的2套插件源码,这样才能相互独立控制对应属性的上传。
2、源码里面的file元素是动态创建的:需要确保你操作元素的时候已经渲染完成。
//源码里面,创建上传input
createUploadInput: function()

获取动态创建的元素一般有3种方式:最常用的第2种,所以建议你用jQuery,已经处理好了获取动态元素的方法。
// 1. 在模板引擎里面添加行内事件
// 2. 利用事件的委托获取(常用)
// 3. 在ajax的监听响应完成函数后面获取

PS:你问题里面提到了不能重现,偶尔出现过这些,很大的可能是元素渲染的问题,有时候元素生成了你可以获取到,有时候获取的时候元素还没有生成就获取不到。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632