【问题标题】:Using $(this) with FileReader() to target result使用 $(this) 和 FileReader() 来定位结果
【发布时间】:2012-11-13 10:55:49
【问题描述】:

我正在尝试显示来自文件输入的图像的 ajax 预览。使用 FileReader() 很容易,但我将它与循环一起使用,所以当我需要将结果放在图像源中时,我需要使用 $(this) 来定位输入的循环项。这对我来说甚至没有意义,所以我们开始吧。

我们有一个循环..

<li>
  <input type="file" class="image" />
  <img src="" class="preview" />
</li>
<li>
  <input type="file" class="image" />
  <img src="" class="preview" />
</li>
<li>
  <input type="file" class="image" />
  <img src="" class="preview" />
</li>

现在假设选择了第二个输入,现在我需要将 FileReader 的结果添加到它的图像 src。我如何定位第二个循环项目及其内容来做事?

 function readURL(input) {
        if (input.files && input.files[0]) {
            var reader = new FileReader();
            reader.onload = function (e) {
               // Here I need to use $(this) to target only the second list item's img.preview
               $('.preview').attr('src', e.target.result);
            };

            reader.readAsDataURL(input.files[0]);
        }
 }

【问题讨论】:

  • 不确定我是否明白,但您的函数是否甚至保留了范围,以便 this 关键字等于某个元素,或者您只是希望它会?
  • 我真的不知道。我刚刚发现这种方法在多个 tuts 中用于预览文件输入。我会带着希望去。

标签: jquery file-upload filereader


【解决方案1】:

我会这样做。将目标分配给阅读器对象本身并稍后使用。

function readURL(input) {
    if (input.files && input.files[0]) {
        var reader = new FileReader();
        // set where you want to attach the preview
        reader.target_elem = $(input).parent().find('preview');
        reader.onload = function (e) {
           // Attach the preview
           $(reader.target_elem).attr('src', e.target.result);
        };

        reader.readAsDataURL(input.files[0]);
    }
 }

【讨论】:

    【解决方案2】:

    我以前从未使用过这个 API。有趣的东西。

    此版本循环遍历所有文件输入并加载其预览图像。该功能由按钮点击触发。

    $(function(){
        $("#btnLoadPreviews").click(loadPreviews_click);
    })
    
    function loadPreviews_click(e) {
        $(".image").each(function() {
            var $input = $(this);
            var inputFiles = this.files;
            if(inputFiles == undefined || inputFiles.length == 0) return;
            var inputFile = inputFiles[0];
    
            var reader = new FileReader();
            reader.onload = function(event) {
                $input.next().attr("src", event.target.result);
            };
            reader.onerror = function(event) {
                alert("I AM ERROR: " + event.target.error.code);
            };
            reader.readAsDataURL(inputFile);
        });
    }
    

    如果您希望在选择预览图像时加载它们,您可以改用此版本。

    $(function(){
        $(".image").change(showPreviewImage_click);
    })
    
    function showPreviewImage_click(e) {
        var $input = $(this);
        var inputFiles = this.files;
        if(inputFiles == undefined || inputFiles.length == 0) return;
        var inputFile = inputFiles[0];
    
        var reader = new FileReader();
        reader.onload = function(event) {
            $input.next().attr("src", event.target.result);
        };
        reader.onerror = function(event) {
            alert("I AM ERROR: " + event.target.error.code);
        };
        reader.readAsDataURL(inputFile);
    }
    

    【讨论】:

    • 是否不能在文件输入上使用更改功能,然后运行我在其中提供的功能,这样我就可以将 $this 用于输入并用它来做其他事情?
    • @PolluxKhafra - 当然是。您提到您正在循环输入,所以我也尝试这样做。我的第一个版本实际上是使用 change 事件编写的。
    • 循环是一个可以编辑的帖子的 wordpress 循环。所以我只需要定位在列表项中使用的输入。我离开前循环基本只是为了前任。我尝试使用内部功能的更改功能,但它不起作用。你能举个例子吗?
    • @PolluxKhafra - 你去。功能其实很相似。
    猜你喜欢
    • 2017-09-08
    • 2012-12-22
    • 2017-10-09
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 2019-09-23
    • 2011-08-06
    • 2012-08-03
    相关资源
    最近更新 更多