1. Modal
$modal
是一个可以迅速创建模态窗口的服务,创建部分页,控制器,并关联他们
$modal
仅有一个方法open(options)
templateUrl
:模态窗口的地址template:用于显示html标签
scope
:一个作用域为模态的内容使用(事实上,$modal会创建一个当前作用域的子作用域
)默认为$rootScope
controller
:为$modal指定的控制器,初始化$scope,该控制器可用$modalInstance
注入resolve
:定义一个成员并将他传递给$modal指定的控制器,相当于routes的一个reslove属性,如果需要传递一个objec对象,需要使用angular.copy()backdrop
:控制背景,允许的值:true(默认),false(无背景),“static
” - 背景是存在的,但点击模态窗口之外时,模态窗口不关闭keyboard
:当按下Esc时,模态对话框是否关闭,默认为turewindowClass
:指定一个class并被添加到模态窗口中
open方法返回一个模态实例,该实例有如下属性
close(result)
:关闭模态窗口并传递一个结果dismiss(reason)
:撤销模态方法并传递一个原因result
:一个契约,当模态窗口被关闭或撤销时传递opened
:一个契约,当模态窗口打开并且加载完内容时传递的变量
另外,$modalInstance扩展了两个方法$close(result)
、$dismiss(reason)
,这些方法很容易关闭窗口并且不需要额外的控制器
- <!DOCTYPE html>
- <html ng-app="ModalDemo">
- <head>
- <title></title>
- <link href="lib/bootstrap/css/bootstrap.min.css" rel="stylesheet">
- <script src="lib/angular/angular.min.js"></script>
- <script src="lib/bootstrap-gh-pages/ui-bootstrap-tpls-0.7.0.min.js"></script>
- <script src="lib/angular/i18n/angular-locale_zh-cn.js"></script>
- </head>
- <body>
- <div ng-controller="ModalDemoCtrl">
- <script type="text/ng-template" id="myModalContent.html">
- <div class="modal-header">
- <h3>I'm a modal!</h3>
- </div>
- <div class="modal-body">
- <ul>
- <li ng-repeat="item in items">
- <a ng-click="selected.item = item">{{ item }}</a>
- </li>
- </ul>
- Selected: <b>{{ selected.item }}</b>
- </div>
- <div class="modal-footer">
- <button class="btn btn-primary" ng-click="ok()">OK</button>
- <button class="btn btn-warning" ng-click="cancel()">Cancel</button>
- </div>
- </script>
- <button class="btn" ng-click="open()">Open me!</button>
- </div>
- <script>
- var ModalDemo = angular.module('ModalDemo', ['ui.bootstrap']);
- var ModalDemoCtrl = function ($scope, $modal, $log) {
- $scope.items = ['item1', 'item2', 'item3'];
- $scope.open = function () {
- var modalInstance = $modal.open({
- templateUrl: 'myModalContent.html',
- controller: ModalInstanceCtrl,
- resolve: {
- items: function () {
- return $scope.items;
- }
- }
- });
- modalInstance.opened.then(function(){//模态窗口打开之后执行的函数
- console.log('modal is opened');
- });
- modalInstance.result.then(function (result) {
- console.log(result);
- }, function (reason) {
- console.log(reason);//点击空白区域,总会输出backdrop click,点击取消,则会暑促cancel
- $log.info('Modal dismissed at: ' + new Date());
- });
- };
- };
- var ModalInstanceCtrl = function ($scope, $modalInstance, items) {
- $scope.items = items;
- $scope.selected = {
- item: $scope.items[0]
- };
- $scope.ok = function () {
- $modalInstance.close($scope.selected);
- };
- $scope.cancel = function () {
- $modalInstance.dismiss('cancel');
- };
- };
- </script>
- </body>
- </html>
Popover
-
popover-title
:显示的标题 -
popover-placement
:默认为top,其他为"bottom", "left", "right" -
popover-animation
:是否有fade in和fade out的动画效果,默认为true -
popover-popup-delay
:鼠标放置多少毫秒之后才会显示内容,默认为0 -
popover-trigger
:何种方式触发提示,mouseenter,focus,详见tooltip popover-append-to-body
:是否追加至$body
- <!DOCTYPE html>
- <html ng-app="Demo">
- <head>
- <title></title>
- <link href="lib/bootstrap/css/bootstrap.min.css" rel="stylesheet">
- <script src="lib/angular/angular.min.js"></script>
- <script src="lib/jquery/jquery-1.10.2.min.js"></script>
- <script src="lib/bootstrap-gh-pages/ui-bootstrap-tpls-0.7.0.min.js"></script>
- <script src="lib/angular/i18n/angular-locale_zh-cn.js"></script>
- </head>
- <body>
- <div ng-controller="PopoverDemoCtrl">
- <div class="well">
- <div>
- <h4>Dynamic</h4>
- <div>Dynamic Popover : <input type="text" ng-model="dynamicPopoverText"></div>
- <div>Dynamic Popover Popup Text: <input type="text" ng-model="dynamicPopover"></div>
- <div>Dynamic Popover Popup Title: <input type="text" ng-model="dynamicPopoverTitle"></div>
- <div><button popover="{{dynamicPopover}}" popover-title="{{dynamicPopoverTitle}}" class="btn">{{dynamicPopoverText}}</button></div>
- </div>
- <div>
- <h4>Positional</h4>
- <button popover-placement="top" popover="On the Top!" class="btn">Top</button>
- <button popover-placement="left" popover="On the Left!" class="btn">Left</button>
- <button popover-placement="right" popover="On the Right!" class="btn">Right</button>
- <button popover-placement="bottom" popover="On the Bottom!" class="btn">Bottom</button>
- </div>
- <div>
- <h4>Triggers</h4>
- <button popover="I appeared on mouse enter!" popover-trigger="mouseenter" class="btn">Mouseenter</button>
- <input type="text" value="Click me!"
- popover="I appeared on focus! Click away and I'll vanish..."
- popover-trigger="focus" />
- </div>
- <div>
- <h4>Other</h4>
- <button Popover-animation="true" popover="I fade in and out!" class="btn">fading</button>
- <button popover="I have a title!" popover-title="The title." class="btn">title</button>
- </div>
- </div>
- </div>
- <script>
- var Demo = angular.module('Demo', ['ui.bootstrap']);
- var PopoverDemoCtrl = function ($scope) {
- $scope.dynamicPopover = "Hello, World!";
- $scope.dynamicPopoverText = "dynamic";
- $scope.dynamicPopoverTitle = "Title";
- };
- </script>
- </body>
- </html>
Tooltip
两个版本:tooltip
,tooltip-html-unsafe
-
tooltip-placement
: -
tooltip-animation
: -
tooltip-popup-delay
: -
tooltip-trigger
:mouseenter
,mouseleave
,click
,focus
,blur
tooltip-append-to-body
- <!DOCTYPE html>
- <html ng-app="Demo">
- <head>
- <title></title>
- <link href="lib/bootstrap/css/bootstrap.css" rel="stylesheet">
- <script src="lib/angular/angular.min.js"></script>
- <script src="lib/jquery/jquery-1.10.2.min.js"></script>
- <script src="lib/bootstrap-gh-pages/ui-bootstrap-tpls-0.7.0.min.js"></script>
- <script src="lib/angular/i18n/angular-locale_zh-cn.js"></script>
- </head>
- <body>
- <div ng-controller="TooltipDemoCtrl">
- <div class="well">
- <div>Dynamic Tooltip Text: <input type="text" ng-model="dynamicTooltipText"></div>
- <div>Dynamic Tooltip Popup Text: <input type="text" ng-model="dynamicTooltip"></div>
- <p>
- Pellentesque <a><span tooltip="{{dynamicTooltip}}">{{dynamicTooltipText}}</span></a>,
- sit amet venenatis urna cursus eget nunc scelerisque viverra mauris, in
- aliquam. Tincidunt lobortis feugiat vivamus at
- <a><span tooltip-placement="left" tooltip="On the Left!">left</span></a> eget
- arcu dictum varius duis at consectetur lorem. Vitae elementum curabitur
- <a><span tooltip-placement="right" tooltip="On the Right!">right</span></a>
- nunc sed velit dignissim sodales ut eu sem integer vitae. Turpis egestas
- <a><span tooltip-placement="bottom" tooltip="On the Bottom!">bottom</span></a>
- pharetra convallis posuere morbi leo urna,
- <a><span tooltip-animation="false" tooltip="I don't fade. :-(">fading</span></a>
- at elementum eu, facilisis sed odio morbi quis commodo odio. In cursus
- <a><span tooltip-popup-delay='1000' tooltip='appears with delay'>delayed</span></a> turpis massa tincidunt
- dui ut.
- </p>
- <p>
- I can even contain HTML. <a><span tooltip-html-unsafe="{{htmlTooltip}}">Check me out!</span></a>
- </p>
- <p>
- Or use custom triggers, like focus:
- <input type="text" value="Click me!"
- tooltip="See? Now click away..."
- tooltip-trigger="mouseleave"
- tooltip-placement="right"/>
- </p>
- <form name="myForm" >
- <div>
- here
- <input
- class="span2"
- name="input1id"
- type="text"
- ng-model="input1"
- required
- tooltip="See? Now click away..."
- tooltip-placement="bottom"
- tooltip-trigger="{{{true: 'mouseenter', false: 'never'}[myForm.input1id.$invalid]}}"
- />
- </div>
- <pre>myForm.input1id.$invalid: {{myForm.input1id.$invalid}}</pre>
- </div>
- </div>
- <script>
- var Demo = angular.module('Demo', ['ui.bootstrap']);
- Demo.config(['$tooltipProvider', function ($tooltipProvider) {
- $tooltipProvider.options({
- placement: 'right',
- animation: true,
- popupDelay: 0,
- appendToBody: false
- });
- }]);
- var TooltipDemoCtrl = function ($scope) {
- $scope.dynamicTooltip = "Hello, World!";
- $scope.dynamicTooltipText = "dynamic";
- $scope.htmlTooltip = "I've been made <h6>bold</h6>!";
- };
- </script>
- </body>
- </html>
Typeahead
-
$viewValue
:用户输入的值 -
ng-model
:对应的模型绑定 -
typeahead
:对应的表达式,类似于select -
typeahead-editable
:是否允许不从提示中选择,默认为ture,设置为false时,如果不是从提示中选择,该input的验证为false -
typeahead-input-formatter
:选中之后格式化显示 -
typeahead-loading
:指定一个模型,当查询时,该模型为ture -
typeahead-min-length
:输入最少数量的字符时出现提示 -
typeahead-on-select
:选择选项时的回调函数,默认为空 -
typeahead-template-url
:自定义内容的url -
typeahead-wait-ms
:键入最后一个字符时的等待时间,默认为0
- <!DOCTYPE html>
- <html ng-app="Demo">
- <head>
- <title></title>
- <link href="lib/bootstrap/css/bootstrap.css" rel="stylesheet">
- <script src="lib/angular/angular.min.js"></script>
- <script src="lib/jquery/jquery-1.10.2.min.js"></script>
- <script src="lib/bootstrap-gh-pages/ui-bootstrap-tpls-0.7.0.min.js"></script>
- <script src="lib/angular/i18n/angular-locale_zh-cn.js"></script>
- </head>
- <body>
- <div class='container-fluid' ng-controller="TypeaheadCtrl">
- <pre>Model: {{selected | json}}</pre>
- <form name="myForm">
- <input type="text" ng-model="selected" name="selected"
- typeahead="state.id as state.name for state in states | filter:{ name : $viewValue }"
- typeahead-editable="false"
- typeahead-input-formatter="formatInput($model)">
- <input type="text" ng-model="search"
- typeahead="result for result in lookup($viewValue)"
- typeahead-loading="isLoading" />
- </form>
- {{myForm.selected.$valid}}
- </div>
- <script>
- var Demo = angular.module('Demo', ['ui.bootstrap']);
- function TypeaheadCtrl($scope,$filter) {
- $scope.selected=3;
- $scope.states = [
- {id:1,name:"Alabama"},
- {id:2,name:"Montana"},
- {id:3,name:"Arkansas"}
- ];
- $scope.formatInput = function($model) {
- return $filter('filter')($scope.states,{id:$model})[0].name;
- }
- $scope.lookup = function() {
- console.log("isLoading is " + $scope.isLoading);
- return [];
- }
- }
- </script>
- </body>
- </html>
Datepicker Settings
-
show-weeks
:是否显示每月的第几周,默认为ture -
starting-day
:日历显示的时间的第一个日期,默认为0,(0=Sunday, ..., 6=Saturday) -
min
:定义最小的显示时间,默认为空 - max:定义最大的显示时间,默认为空
-
date-disabled (date, mode)
(Default: null) : An optional expression to disable visible options based on passing date and current mode(day|month|year). -
day-format
:日期的格式,即每月的中的当前日期,默认dd -
month-format
:默认为MMMM -
year-format
:默认为yyyy -
year-range
:时间的选择范围,默认为20 -
day-header-format
:(Default: 'EEE') : Format of day in week header. -
day-title-format
:(Default: 'MMMM yyyy') : Format of title when selecting day. -
month-title-format
:(Default: 'yyyy') : Format of title when selecting month.
Popup Settings
通过datepicker-options
来设置,格式为json
弹出的具体设置如下:
-
datepicker-popup
:显示日期的格式,默认为yyyy-MM-dd -
current-text
:选择当天的按钮的显示文本,默认为Today -
toggle-weeks-text
:默认为Weeks -
clear-text
:默认为Clear -
close-text
:默认为Done -
close-on-date-selection
:默认为true,选择日期后是否关闭 -
datepicker-append-to-body
:
注:如果需要中文,可以引入i18n/angular-locale_zh-cn.js
- <!DOCTYPE html>
- <html ng-app="Demo">
- <head>
- <title></title>
- <link href="lib/bootstrap/css/bootstrap.min.css" rel="stylesheet">
- <script src="lib/angular/angular.min.js"></script>
- <script src="lib/jquery/jquery-1.10.2.min.js"></script>
- <script src="lib/bootstrap-gh-pages/ui-bootstrap-tpls-0.7.0.min.js"></script>
- <script src="lib/angular/i18n/angular-locale_zh-cn.js"></script>
- </head>
- <body>
- <div ng-controller="DatepickerDemoCtrl">
- <pre>Selected date is: <em>{{dt | date:'fullDate' }}</em></pre>
- <h4>Inline</h4>
- <div class="well well-small" ng-model="dt" style="display:inline-block;">
- <datepicker min="minDate" show-weeks="showWeeks"></datepicker>
- </div>
- <h4>Popup</h4>
- <div class="form-horizontal">
- <p>
- <input type="text" datepicker-popup="{{format}}" ng-model="dt" is-open="opened" min="minDate" max="'2015-06-22'" datepicker-options="dateOptions" date-disabled="disabled(date, mode)" ng-required="true" close-text="Close" />
- <button class="btn" ng-click="open()"><i class="icon-calendar"></i></button>
- </p>
- <p><i>Format options:</i> <select ng-model="format" ng-options="f for f in formats"><option></option></select></p>
- </div>
- <hr />
- <button class="btn btn-small btn-inverse" ng-click="today()">Today</button>
- <button class="btn btn-small btn-inverse" ng-click="dt = '2009-08-24'">2009-08-24</button>
- <button class="btn btn-small btn-success" ng-click="toggleWeeks()" tooltip="For inline datepicker">Toggle Weeks</button>
- <button class="btn btn-small btn-danger" ng-click="clear()">Clear</button>
- <button class="btn btn-small" ng-click="toggleMin()" tooltip="After today restriction">Min date</button>
- </div>
- <script>
- var Demo = angular.module('Demo', ['ui.bootstrap']);
- var DatepickerDemoCtrl = function ($scope, $timeout) {
- $scope.today = function() {
- $scope.dt = new Date();
- };
- $scope.today();
- $scope.showWeeks = true;
- $scope.toggleWeeks = function () {
- $scope.showWeeks = ! $scope.showWeeks;
- };
- $scope.clear = function () {
- $scope.dt = null;
- };
- // Disable weekend selection
- $scope.disabled = function(date, mode) {
- return ( mode === 'day' && ( date.getDay() === 0 || date.getDay() === 6 ) );
- };
- $scope.toggleMin = function() {
- $scope.minDate = ( $scope.minDate ) ? null : new Date();
- };
- $scope.toggleMin();
- $scope.open = function() {
- $timeout(function() {
- $scope.opened = true;
- });
- };
- $scope.dateOptions = {
- 'year-format': "'yy'",
- 'starting-day': 1
- };
- $scope.formats = ['dd-MMMM-yyyy', 'yyyy/MM/dd', 'shortDate'];
- $scope.format = $scope.formats[0];
- };
- </script>
- </body>
- </html>
Timepicker
-
hour-step
:时间变化的步长,默认为1 -
minute-step
:分钟变化的步长,默认为1 -
show-meridian
:是否显示am、pm切换,默认为true -
meridians
:切换am、pm的文本,默认为['AM','PM'] -
readonly-input
:是否允许用户输入,默认为false -
mousewheel
:当输入框获得焦点时,是否允许用户用滚滑轮变化数值大小,默认为ture
- <!DOCTYPE html>
- <html ng-app="Demo">
- <head>
- <title></title>
- <link href="lib/bootstrap/css/bootstrap.min.css" rel="stylesheet">
- <script src="lib/angular/angular.min.js"></script>
- <script src="lib/jquery/jquery-1.10.2.min.js"></script>
- <script src="lib/bootstrap-gh-pages/ui-bootstrap-tpls-0.7.0.min.js"></script>
- <script src="lib/angular/i18n/angular-locale_zh-cn.js"></script>
- </head>
- <body>
- <div ng-controller="TimepickerDemoCtrl">
- <div ng-model="mytime" ng-change="changed()" class="well well-small" style="display:inline-block;">
- <timepicker hour-step="hstep" minute-step="mstep" show-meridian="ismeridian"></timepicker>
- </div>
- <pre>Time is: {{mytime | date:'shortTime' }}</pre>
- <div>Hours step is: <select ng-model="hstep" ng-options="opt for opt in options.hstep"></select></div>
- <div>Minutes step is: <select ng-model="mstep" ng-options="opt for opt in options.mstep"></select></div>
- <button class="btn" ng-click="toggleMode()">12H / 24H</button>
- <button class="btn" ng-click="update()">Set to 14:00</button>
- <button class="btn btn-danger" ng-click="clear()">Clear</button>
- </div>
- <script>
- var Demo = angular.module('Demo', ['ui.bootstrap']);
- var TimepickerDemoCtrl = function ($scope) {
- $scope.mytime = new Date();
- $scope.hstep = 1;
- $scope.mstep = 15;
- $scope.options = {
- hstep: [1, 2, 3],
- mstep: [1, 5, 10, 15, 25, 30]
- };
- $scope.ismeridian = true;
- $scope.toggleMode = function() {
- $scope.ismeridian = ! $scope.ismeridian;
- };
- $scope.update = function() {
- var d = new Date();
- d.setHours( 14 );
- d.setMinutes( 0 );
- $scope.mytime = d;
- };
- $scope.changed = function () {
- console.log('Time changed to: ' + $scope.mytime);
- };
- $scope.clear = function() {
- $scope.mytime = null;
- };
- };
- </script>
- </body>
- </html>
jQuery File Upload的最简模型
jQuery File Upload包含了一堆文件,首先需要弄清楚的是最核心的部分是哪些,根据官方的例子可以知道,一个最简单的jQuery File Upload上传组件,必须包括以下文件:
- jQuery核心库,建议使用jQuery 1.8以上版本
- js/vendor/jquery.ui.widget.js : jQuery UI Widget
- js/jquery.iframe-transport.js : 扩展iframe数据传输
- js/jquery.fileupload.js : jQuery File Upload核心类
- js/cors/jquery.xdr-transport.js 在IE下应载入此文件解决跨域问题
此时只需要加载一个上传按钮
- <input id="fileupload" type="file" name="files[]" data-url="server/php/" multiple>
以及一行代码
- $('#fileupload').fileupload();
就完成了一个最基本的上传组件。这个最简单的上传组件可以将选中的文件以表单形式提交到data-url约定的URL,同时提供了足够多的设置和基础事件可供扩展。
jQuery File Upload的简单扩展
对于最简模型,稍加扩展就可以实现一些比较常用的功能,比如可以在上传完毕后可以显示一个简单的结果:
- $('#fileupload').fileupload({
- done: function (e, data) {
- $.each(data.result, function (index, file) {
- $('<p/>').text(file.name + ' uploaded').appendTo($("body"));
- });
- }
- });
或者显示上传进度,配合一些进度条组件就可以构成一个上传进度条
- $('#fileupload').fileupload('option', {
- progressall: function (e, data) {
- var progress = parseInt(data.loaded / data.total * 100, 10);
- console.log(progress + '%');
- }
- });
等等。只要多阅读手册就可以配合项目做更具体的扩展开发。
XHR响应为Json时IE的下载BUG
这里需要特别注意的是,由于jQuery File Upload都是采用XHR在传递数据,服务器端返回的通常是JSON格式的响应,但是IE会将这些JSON响应误认为是文件传输,然后直接弹出下载框询问是否需要下载。
解决这个问题的方法是必须将相应的Http Head从
- Content-Type: application/json
更改为
- Content-Type: text/plain
具体的实现根据服务端不同有所区别,比如ZF2中可以在Controller中这样写:
- $this->getServiceLocator()->get('Application')->getEventManager()->attach(\Zend\Mvc\MvcEvent::EVENT_RENDER, function($event){
- $event->getResponse()->getHeaders()->addHeaderLine('Content-Type', 'text/plain');
- }, -10000);
这也是我在stackoverflow上的对ZF2更改最终响应类型的一个回答
jQuery File Upload UI的构成与说明
为了引入更多功能,jQuery File Upload在上面最简模型的基础上又实现了一套jQuery File Upload UI,也就是官方给出的最终Demo,这套UI额外提供了以下功能:
- 最大/最小文件限定 Options.maxFileSize / Options.mixFileSize
- 文件类型限定,通过正则表达式检测文件名实现 Options.acceptFileTypes
- 选择文件后自动上传 Options.autoUpload
- 上传文件数量限制,通过上传后将选择文件按钮置为Disabled实现 Options.maxNumberOfFiles
- 上传模板,就是选择文件后显示预览的html代码 Options.uploadTemplate
- 下载模板,当文件上传完毕后显示的html代码 Options.downloadTemplate
等等,同时还增加了一系列新的接口和事件,具体都可以查阅官方手册。
具体对应到文件为:
- JavaScript-Templates : JS模板引擎
- JavaScript-Load-Image : 图片预览功能
- js/jquery.fileupload-ui.js & css/jquery.fileupload-ui.css : UI核心类,CSS可以替换旧式的上传控件为统一的按钮
- js/jquery.fileupload-fp.js:进度条扩展功能
也许正是因为附加功能太多,各功能之间耦合非常重,jQuery File Upload UI显得不够友好,主要体现在:
- 上述功能均无法拆分,必须统一全部加载
- 各功能需要界面存在相应元素,如果缺少某些元素,包括JS模板内的元素,整个UI无法正常工作
- JS模板引擎对标签配对非常严格,标签如果遗漏也有可能引起UI无法正常工作
所以经验之谈是,在定制jQuery File Upload UI时,如果UI无法工作。首先检查js文件是否全部加载,然后检查页面元素是否齐全,再次检查JS模板标签是否严格配对,最后还可以查看页面是否有重复调用fileupload()方法。
jQuery File Upload UI构成元素
UI的部件都是硬编码的HTML class,无法更改。核心的几个部件为
全局控制按钮 (必须)
- <div class="fileupload-buttonbar">
- <span class="fileinput-button"><input type="file" name="files[]" multiple></span>
- <button type="submit" class="start">Start upload</button>
- <button type="reset" class="cancel">Cancel upload</button>
- <button type="button" class="delete">Delete</button>
- <input type="checkbox" class="toggle">
- </div>
最外层容器为.fileupload-buttonbar,内部包含
- 文件选择按钮 .fileinput-button (必须),内部必须包裹一个input:file
- 开始上传按钮 .start
- 取消上传按钮 .cancel
- 删除按钮 .delete
- 文件勾选按钮 .toggle
整体上传进度 (可选)
- <div class="fileupload-progress">
- <div class="progress">
- <div class="bar" style="width:0%;"></div>
- </div>
- <div class="progress-extended"></div>
- </div>
最外层容器为.fileupload-progress,内部包含
- 上传进度条容器.progress
- 上传进度条 .bar
- 上传进度文本 .progress-extended
文件显示容器 (必须)
- <div class="files"></div>
.file容器是最重要的UI部件,上传时的文件预览模板以及上传完毕后的文件显示模板都将显示在这里。
文件预览模板 (必须)
- <script id="template-upload" type="text/x-tmpl">
- {% for (var i=0, file; file=o.files[i]; i++) { %}
- <div class="template-upload">
- {% if (file.error) { %}
- <div class="error">{%=file.error%}</div>
- {% } else { %}
- <div class="preview"><span class="fade"></span></div>
- <div class="name"><span>{%=file.name%}</span></div>
- <div class="size"><span>{%=o.formatFileSize(file.size)%}</span></div>
- <div class="progress progress-success progress-striped active" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0" style="height:5px;"><div class="bar" style="width:0%;"></div></div>
- <span class="start">
- {% if (!o.options.autoUpload) { %}
- <button>Start Upload</button>
- {% } %}
- </span>
- {% } %}
- <span class="cancel"><button>Cancel</button></span>
- </div>
- {% } %}
- </script>
这部分逻辑不难读懂,由于文件选择是多选的,所以被选择文件一开始以数组方式存放,循环输出。即使我们加入最大文件只能上传一个,这里得到的仍然是数组形式。
当文件有任何错误时,如文件类型被禁止,文件大小不符合约定,会得到file.error。文件检测没有问题,则可以用以下元素控制当前文件:
- 开始上传当前文件按钮.start (必须)
- 取消上传当前文件按钮.cancel (可选)
- 当前文件上传进度.progress (可选)
上传后文件回调显示模板 (必须)
- <script id="template-download" type="text/x-tmpl">
- {% for (var i=0, file; file=o.files[i]; i++) { %}
- <div class="template-download">
- {% if (file.error) { %}
- <div class="error">{%=file.error%}</div>
- <span class="cancel"><button class="btn btn-block"><i class="icon-ban-circle"></i>Cancel</span>
- {% } else { %}
- <div class="preview"><img src="{%=file.thumbnail_url%}"></div>
- <div class="name"><span>{%=file.name%}</span></div>
- <div class="size"><span>{%=o.formatFileSize(file.size)%}</span></div>
- <div class="delete"><button data-type="{%=file.delete_type%}" data-url="{%=file.delete_url%}">Delete</button>
- </div>
- {% } %}
- </div>
- {% } %}
- </script>
这一部分的o.files完全来自服务器端的json响应,所以模板内容可以自由发挥。唯一被定制的元素为删除按钮.delete。 点击这个按钮会向按钮中指定的url发送请求,比如
- <div class="delete"><button data-type="DELETE" data-url="/file/1">Delete</button></div>
点击后则会用DELETE方式发送HTTP请求
DELETE /file/1
jQuery File Upload UI工作流程
有了上面罗列的UI元素,就可以拼凑出一个简单的jQuery File Upload UI工作流程:
- 用户点击.fileinput-button选择要上传的文件(多个)
- 文件选择后,文件信息被整理为数组置入文件预览模板#template-upload
- 模板引擎循环处理文件信息并生成模板.template-upload
- 每生成一个模板,模板就被插入到文件显示容器.files的最后。
- 用户点击上传按钮.start上传,文件信息被转换为XHR请求至服务器端
- UI获得服务器端生成JSON响应文件
- JSON响应信息也被整理成数组置入回调显示模板#template-download
- 模板引擎循环处理文件信息并生成模板.template-download
- 每生成一个模板,会将此模板替换对应的.template-upload部分
定制过程
有了上面的基础,要个性化的定制jQuery File Upload就简单了很多:
限制文件类型
由于没有使用Flash空间,上传的文件选择框是无法限制文件类型的,所以所谓的限制文件类型,只能让用户选择文件之后,用file.error显示一个错误信息。例如本次需要限定可上传的文件为图片,那么Options指定:
- acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i
即可。
在Google Chrome浏览器中,可以用input:file原生支持文件类型限定,可以配合使用:
<input type="file" name="upload[]" accept="image/png, image/gif, image/jpg, image/jpeg">
不过在客户端做再多的限定也只是提升用户体验,不能真正保证安全性,所以不要忘记了在服务器端做同样的类型检测。
文件数量限制
只需在Options指定
maxNumberOfFiles : 1
即可。jQuery File Upload UI的处理方式是当用户上传一个文件后,文件选择按钮被置为Disabled。
这同样只是客户端的小把戏,真正想要严格的约束用户只能上传一个文件还是需要在服务器端通过Session做更加复杂的控制。
文件大小限制
Options中指定
maxFileSize: 5000000
即只允许单文件最大5MB。
Firefox disable bug
在Firefox环境下测试是,发现如果将文件数量限制为1,选择一次文件,刷新页面之后文件选择按钮会莫名其妙的被加上一个Disabled属性,导致无法点击。所以最终我们的初始化代码为:
- var uploader = $("#fileupload");
- uploader.fileupload({
- dataType: 'json',
- autoUpload: false,
- acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
- maxNumberOfFiles : 1,
- maxFileSize: 5000000
- });
- uploader.find("input:file").removeAttr('disabled');
相关推荐
一个想当漂亮的jquery提示框:jQuery Modal Dialog弹出对话框插件,可用它实现各种的网页提示效果,比如错误提示框、警告框、操作提示框等,暖色调界面,使用方法简单,参考本例所展示的各种提示框生成办法,就可...
### jQuery UI全教程之一:Dialog及Datepicker使用详解 #### 一、Dialog 组件使用教程 **1.1 Dialog 概述** Dialog 是 jQuery UI 中一个非常常用的组件,它可以实现弹出层的功能,广泛应用于登录、注册、消息提示...
在重写过程中有些东西丢失了,但是现在它使用了Modal和本机动画驱动程序,并且还具有可与Touchables一起使用的出色帮助器。 感谢@jeanregisser和悬挂PR的作者的代码。 要求 以前(版本0.0.6 ),此模块要求react...
本文将围绕"jquery.modaldialog.1.0.0.zip"这个压缩包中的内容,深入探讨jQuery模态对话框的使用方法和相关知识点。 首先,我们要了解jQuery模态对话框的基本概念。模态对话框(Modal Dialog)是一种阻塞用户界面,...
本篇文章将深入探讨jQuery Tooltip的使用方法、特点以及如何与其他编程语言如PHP、Java、C#进行集成。 ### 1. jQuery Tooltip基本概念 jQuery Tooltip是一种基于JavaScript库jQuery的小型插件,它通过简单的API...
**jQuery浮动层插件——...通过理解其基本使用方法、样式调整以及事件和配置选项的应用,我们可以轻松地在项目中实现符合设计要求的模态浮动层。而压缩包中的四种样式可以作为参考,帮助我们快速理解和实践Modal插件。
**jQuery模态框插件(jquery-Modal-Plug)**是一种用于增强网页交互性的JavaScript工具,它是基于广泛使用的jQuery库构建的。模态框在网页设计中被广泛应用,用于显示弹出式窗口,如警告、确认对话框或者展示详细...
本文将深入探讨jQuery ModalDialog插件的核心概念、使用方法以及实战技巧。 一、jQuery ModalDialog插件概述 jQuery ModalDialog是基于JavaScript库jQuery的一个扩展,主要用于实现模态对话框功能。模态对话框是一...
jQuery弹窗插件Modal.js是一款广泛应用于网页中的轻量级交互元素,主要用于显示重要的公告信息或者用户须知,提供了一种高效且易于定制的方式来实现页面内的弹窗提示。这款插件基于JavaScript库jQuery构建,因此它...
要深入了解Moa Modal及其使用方法,可以访问官方的演示地址:[http://www.jq22.com/jquery-info505](http://www.jq22.com/jquery-info505)。此外,查看`moaModal-master`压缩包中的源代码和文档,将有助于理解插件的...
因此,了解并熟练使用React Native的生命周期方法、状态管理和事件处理机制是非常重要的。同时,熟悉Swift和Objective-C也有助于深入理解原生组件的工作原理,以便在必要时进行桥接或自定义原生模块。 总的来说,...
标题 "jquery login modal dialog" 指的是使用 jQuery 实现的一种登录模态对话框功能。在 Web 开发中,模态对话框常用于提供一种不中断用户主界面体验的交互方式,例如显示登录表单。jQuery 是一个广泛使用的 ...
jQuery模态Modal是一个jQuery插件,用于显示重叠的对话提示。安装要安装,请将javascripts和stylesheets目录复制到您的项目中,然后将以下代码段添加到标题中: [removed][removed][removed][removed]<link href=...
#Modal jQuery 插件 v1.0 使用 TDD(Qunit) 创建。 打开 razorsJqModal-test.html 以运行所有测试。 在项目中的 jQuery.js 1.x 之后包含 razorsJqModal.min.js。 在身体上创建一个元素作为模态。 添加 ID="#modal-...
在IT行业中,JavaScript库和框架极大地简化了网页开发工作,jQuery和jQuery UI是其中非常流行的两个工具。本文将深入探讨这两个库以及它们在EasyUI框架中的应用。 首先,jQuery(通常简写为 `$`)是一个轻量级的...
jQuery Dialog是jQuery UI库中的一个核心组件,它提供了一种优雅的方式来创建模态或非模态对话框。对话框在Web应用中广泛用于显示警告、确认消息、详细信息或者进行表单输入等交互操作。本篇文章将深入探讨jQuery ...
只需在项目中引入jQuery库和popModal插件的JavaScript及CSS文件,然后通过jQuery选择器和方法,即可轻松实现各种弹出效果。同时,插件提供了丰富的API和配置选项,让开发者可以根据需要进行深度定制。 总的来说,...
Moa Modal 是一款灵活的 jQuery 模态插件,允许用户自定义动画和定位。在线演示 标签:MoaModal
一个简单的web项目,利用 1.reveal 模态框 2.bootstrap datepicker 做成一个模态框的日期选择控件
在本篇文章中,我们将深入探讨如何使用 jQuery UI 实现 Dialog,并通过实例来展示其用法。 1. **引入 jQuery 和 jQuery UI** 在使用 Dialog 之前,确保你的页面已经引入了 jQuery 和 jQuery UI 的 CSS 和 JS 文件...