如何在选择文件时自动上载图像,而不是按上载按钮?


54

我有一个自定义内容类型,允许用户上传图像。我试图使界面尽可能简单。

内容类型包含一个图像字段。此方法有效,但是某些用户不知道该图像已上传,因为他们在选择后看不到该图像(要预览上传,必须按下上传按钮)。有没有一种方法可以跳过/自动按下上传按钮,以便在选择文件后立即显示图像?

换句话说,选择文件后立即显示以下图片而不是下面的图片(其中显示了路径,但在Firefox中很难读取):

在此处输入图片说明

我希望预览显示如下: 在此处输入图片说明

Answers:


95

您最好在模块级别而不是主题级别上执行此操作,因为JS否则不会对管理页面生效(除非您对两个主题都使用相同的主题)。

这是一个在整个系统范围内提供此功能的小模块:

档案:auto_upload.info

name = Auto Upload
description = Removes the need for users to press the 'Upload' button for AJAX file uploads.
core = 7.x
dependencies[] = file

文件:auto_upload.js:

(function ($) {
  Drupal.behaviors.autoUpload = {
    attach: function (context, settings) {
      $('form', context).delegate('input.form-file', 'change', function() {  
        $(this).next('input[type="submit"]').mousedown();
      }); 
    }
  };
})(jQuery);

文件:auto_upload.module

function auto_upload_init() {
  drupal_add_js(drupal_get_path('module', 'auto_upload') . '/auto_upload.js');
}

安装模块后,所有经过AJAX认证的文件输入(即具有“更新”按钮的文件输入)都将受到影响...选择文件后,您无需再按“上传”按钮。

通过使用该delegate()方法,这对于允许多次上传的文件字段以及由于AJAX请求而加载到页面中的字段也将非常适用。

我已经在Chrome,Safari和Firefox中对其进行了测试,并且可以正常工作:)

脚注:在您的网站正在使用jQuery 1.7的事件中(可能不太可能),您应该使用该on()方法,该方法具有超级种子delegate()

更新我已经为此模块创建了一个沙箱项目


1
感谢您对proxy()的了解,这是非常有用的知识!
Johnathan Elmore

@Clive真的很棒!您会考虑将其作为沙箱发布吗?如果不是,介意我这样做吗?
Letharion

4
如果可以的话,我会再次投票;)为了避免不必要的重复工作,我只想指出还有Ajax,并且Ajax可以采用任何形式提交,两者都是相关的。
Letharion

1
@Clive如果我安装了jQuery Update模块(即使jQuery版本设置为1.7,但仍然使用'delegate'而不是'on'),则代码可以完美工作。但是,如果我禁用了jQuery Update模块,则自动上传开始但没有完成,它将进入无休止的上传过程。您可以确认需要jQuery Update吗?
deinqwertz

1
@deinqwertz不应该delegate()在1.4.2中添加,Drupal 7附带1.4.4。我很确定我在安装了jQuery的几个旧站点上都能正常工作
Clive

13

对于这种情况下的任何人,请尝试使用“自动上传”模块。

AutoUpload是用户界面(UI)增强功能,可启动文件自动上传,以最大程度地减少用户所需的点击次数。

当前,用户必须选择文件,然后按“上传”按钮。我们发现用户经常没有意识到按下按钮的必要,并且错误地认为不需要上传按钮就可以上传他们的图像。

目前适用于D6和D7


9

Drupal 6

准备好在jQuery文档中尝试类似的方法

jQuery('.form-file').change( function() {   
  jQuery(this).next('.ahah-processed').click();
}); 

将以下内容粘贴到page.tpl或node.tpl中

drupal_add_js("jQuery(document).ready(function() {
  jQuery('.form-file').change( function() { 
    jQuery(this).next('.ahah-processed').click();
  });   
});", 'inline');

我不熟悉任何Drupal实现此目标的方法。

小提琴


不幸的是,我不知道如何使用jQuery。还有另一种方法吗?
Patrick Kenny 2012年

@PatrickKenny,请参阅我的编辑。我不熟悉任何Drupal实现此目标的方法。
niksmac

1
您应该用jQuery替换$ ...参见下面的Clive答案,或者像这样修改上面的内容:drupal_add_js(“ jQuery(document).ready(function(){jQuery('。form-file')。change(function (){jQuery(this).next('。ahah-processed')。click();});});“,'inline');
Johnathan Elmore

1
@JohnathanElmore,是的,它将无法在D7中使用。编辑
niksmac 2012年

1
@NikhilMohan还有其他一些问题:.ahah-processed是一个Drupal 6类名,并且由于click()某种原因该方法实际上并未调用这些按钮。您需要使用mousedown():)
克莱夫(Clive)

5

您可以使用实现它on()delegate()已不推荐使用。

(function ($) {
  Drupal.behaviors.autoUpload = {
    attach: function (context, settings) {
      $('form', context).on('change', 'input.form-file', function() {  
        $(this).next('input[type="submit"]').mousedown();
      }); 
    }
  };
})(jQuery);

4

看一下Plupload集成模块。

Plupload小部件上传多个文件和Drupal 之间提供集成。Plupload是GPL许可的多文件上传工具,可以根据客户端计算机的功能显示Flash,Gears,HTML 5,Silverlight,BrowserPlus和HTML4中的小部件。


3

如果您在AJAX表单上使用文件上传字段-提交后,您可能会失去自动上传功能(请参阅https://drupal.stackexchange.com/a/31453/7313

要修复-使用此脚本

(function($) {

Drupal.behaviors.autoUpload = {
  attach: function (context, settings) {
    $('input.form-file', context).once(function() {
      $(this).change(function() {
        $(this).parent().find('input[type="submit"]').mousedown();
      });
    });
  }
};

})(jQuery);

就我而言,这导致表单不断在后台发送对文件字段的AJAX请求。另外,它在一个空字段上显示一个加载异常。
ЕлинЙ.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.