Lilah的个人博客使用了大量基于脚本的小组件。这些组件用于增强访问者的体验,但是她的页面在不加载这些组件的情况下也能正常运行(支持禁用脚本的浏览器用户)。目前,她在HTML文件的顶部加载所有小组件,但是读者抱怨说页面加载时间太长,因为脚本执行的缘故。她尝试把脚本移到页面的底部来提高速度,但是由于小组件内容太多,这种修改过程太繁琐。她真正想做的是让这些组件尽可能快的加载,但是不要阻碍页面上的其他内容。经过快速搜索后,她发现HTML5的async属性符合自己的需求。通过把所有基于脚本的小组件放在一个外部文件中,她可以在基于脚本的功能增强和性能之间取得更好的平衡:
Lilah's Blog
HTML5拖放(Drag and Drop)
拖放功能在桌面客户端软件中应用十分普遍。HTML5标准对拖放做了规定,IE和之前的版本支持dataTransfer对象和拖放图片、超链接、文本的事件。IE10预览版对所有元素增加了draggable属性,并且支持把一个或多个文件从桌面拖放到网页上。draggable属性支持你将任意HTML元素设为页面可拖放的。它提供了如下状态:
// this function runs when the page loads to set up the drop area
function init()
{
// Set the drop-event handlers
var dropArea = document.getElementById("dropspot");
dropArea.addEventListener("drop", dropHandler, false);
dropArea.addEventListener("dragover", doNothing(event), false);
}
function dropHandler(event)
{
// use our doNothing() function to prevent default processing
doNothing(event);
// get the file(s) that are dropped
var filelist = event.dataTransfer.files;
if (!filelist) return; // if null, exit now
var filecount = filelist.length; // get number of dropped files
if (filecount > 0)
{
// Do something with the files.
}
}
// Prevents the event from continuing so our handlers can process the event.
function doNothing(event)
{
event.stopPropagation();
event.preventDefault();
}
function startRead() {
// Obtain input element through DOM.
var file = document.getElementById('file').files[0];
if(file) {
getAsText(file);
}
}
function getAsText(readFile) {
var reader = new FileReader();
// Read file into memory as UTF-16
reader.readAsText(readFile, "UTF-16");
// Handle progress, success, and errors
reader.onprogress = updateProgress;
reader.onload = loaded;
reader.onerror = errorHandler;
}
function updateProgress(evt) {
if (evt.lengthComputable) {
// evt.loaded and evt.total are ProgressEvent properties.
var loaded = (evt.loaded / evt.total);
if (loaded < 1) {
// Increase the progress bar length.
// style.width = (loaded * 200) + "px";
}
}
}
function loaded(evt) {
// Obtain the read file data.
var fileString = evt.target.result;
// Handle UTF-16 file dump
if(utils.regexp.isChinese(fileString)) {
//Chinese Characters + name validation.
}
else {
// Run other charset test.
}
// xhr.send(fileString)
}
function errorHandler(evt) {
if(evt.target.error.code == evt.target.error.NOT_READABLE_ERR) {
// The file could not be read.
}
}