构建一个超级jQuery对象
您也可以使用$.fn.extend()
一次绑定多个方法(函数)……如果您真的想深入了解,您可以使用$.fn.extend()
重新创建jQuery元素,使其成为功能强大的自定义对象,然后用于自动化和管理逻辑上/虚拟上属于同一对象或工具的DOM元素。(附注:我编造了“超级jQuery”这个词语——那不是真正的行话……好吧,现在也许是了。)
我现在正在开发一个Excel文件上传器。我将在此处重新创建/复制其中一些内容,以便让您有一个想法:
HTML
<div id="uploader" class="uploader">
<div class="uploader-item-title uploader-item title">
<span class="title-item-value title-item value">
Excel File Uploader
</span>
</div>
<div class="uploader-item-subtitle uploader-item subtitle">
<span class="subtitle-item-value subtitle-item value">
Uploads Excel files
</span>
</div>
<div id="formatError" style="width:100%;">
<div class="error-message">
</div>
</div>
<div id="messagebox" class="uploader-item-messagebox uploader-item messagebox hidden" style="width:100%;">
<span class="messagebox-item-value messagebox-item value">
</span>
</div>
<div id="dropzone" dropzone="copy f:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" class="uploader-item-dropzone uploader-item dropzone">
<span class="dropzone-item-notes dropzone-item notes">
Drag and drop your Excel file(s) here to begin the upload process.
</span>
<div id="fileSummaryTable" class="dropzone-item-filesummary dropzone-item filesummary hidden">
<table class="filesummary-item-table filesummary-item table">
</table>
</div>
<div id="pbar" class="dropzone-item-pbar dropzone-item pbar hidden">
<div class="pbar-item-filler pbar-item filler">
</div>
</div>
</div>
<div id="fallbackUploader" class="uploader-item-fallbackuploader uploader-item fallbackuploader invisible">
</div>
</div>
Javascript
var oUploader = (function () {
function oUploader(opts) {
var primaryOpts = opts || {};
var superObj_primary = $('#uploader');
var that = this;
var superObj_secondary = (function () {
function superObj_secondary(secondaryOpts) {
var self = this,
o = secondaryOpts || {},
title_val = o.title || 'Excel File Uploader',
subtitle_val = o.subtitle || 'Uploads Excel files',
notes_val = o.notes || 'Drag and drop your Excel file(s) here to begin the upload process.';
self.dropzone = $('.uploader-item-dropzone');
self.dropzone.pbar = $('.dropzone-item-pbar');
self.dropzone.fileSummaryTable = $('#fileSummaryTable');
self.fallbackUploader = $('#fallbackUploader');
self.messagebox = $('.uploader-item-messagebox');
var progress_ele = self.dropzone.pbar.children('.pbar-item-filler'),
fileSummaryTable_table_ele = self.dropzone.fileSummaryTable.children('table.filesummary-item-table'),
title_ele = $('.uploader-item-title'),
title_value_ele = title_ele.children('.title-item-value'),
subtitle_ele = $('.uploader-item-subtitle'),
subtitle_value_ele = subtitle_ele.children('subtitle-item-value'),
notes_value_ele = self.dropzone.children('.dropzone-item-notes'),
messagebox_ele = $('.uploader-item-messagebox'),
messagebox_value_ele = messagebox_ele.children('.messagebox-item-value');
Object.defineProperties(superObj_primary,
{
'title': {
'get': function () { return title_value_ele.text(); },
'set': function (val) { title_value_ele.text(val); }
},
'subtitle': {
'get': function () { return subtitle_value_ele.text(); },
'set': function (val) { subtitle_value_ele.text(val); }
},
'msg': {
'get': function () { return messagebox_value_ele.text(); },
'set': function (val) {
if (val.length) {
messagebox_value_ele.text(val);
messagebox_ele.xGrowIn(null,null,function () {
messagebox_value_ele.fadeObj('show',100);
});
} else {
messagebox_value_ele.fadeObj('invisible',100, function () {
messagebox_ele.xShrinkOut(null,function () {
messagebox_value_ele.text('.');
});
});
}
}
}
});
Object.defineProperties(self.dropzone.pbar,
{
'progress': {
'get': function () { return (parseInt(Math.round(progress_ele.attr('aria-valuenow'))) || 0); },
'set': function (val) { progress_ele.progressbar({ value: Math.round(val) }); }
}
});
self.switchToFallback = function () {
self.dropzone.addClass('hidden');
self.dropzone.fileSummaryTable.addClass('hidden');
self.dropzone.pbar.addClass('hidden');
self.fallbackUploader.removeClass('invisible');
};
self.enableDropzone = function () {
self.dropzone.removeClass('hidden');
self.dropzone.addEventListener("dragenter", dragEnter, false);
self.dropzone.addEventListener("dragexit", dragExit, false);
self.dropzone.addEventListener("dragleave", dragExit, false);
self.dropzone.addEventListener("dragover", dragOver, false);
self.dropzone.addEventListener("drop", drop, false);
function dragEnter(evt) {
evt.stopPropagation();
evt.preventDefault();
}
function dragExit(evt) {
evt.stopPropagation();
evt.preventDefault();
self.dropzone.removeClass("active-dropzone");
}
function dragOver(evt) {
evt.stopPropagation();
evt.preventDefault();
self.dropzone.addClass("active-dropzone");
};
function drop(evt) {
evt.stopPropagation();
evt.preventDefault();
self.dropzone.removeClass("active-dropzone");
superObj_primary.msg = '';
var files = evt.dataTransfer.files;
var count = files.length;
if (count == 1) {
handleFiles(files);
}
else if (count > 1) {
}
}
};
self.dropzone.pbar.complete = function () {
progress_ele.progressbar({ value: 100 });
};
self.hasDndSupport = function () {
return (window.File && window.FileReader && window.FileList && window.Blob && new XMLHttpRequest().upload);
};
};
return superObj_secondary;
})();
return $.fn.extend(superObj_primary, new superObj_secondary());
};
return oUploader;
})();
var uploader = new oUploader();
额外自动化
只要我构建相应的HTML对象,这个对象就可以工作。但通常当我完成构建它们时,我会添加一个额外的部分,在其中通过javascript在对象的构建过程中创建所有的HTML组件。这样做的目的,当然是为了使工具更容易部署。