我知道如何检测拖放API,也知道如何检测FileReader
和FileList
功能。问题是,现代移动浏览器可以处理所有这些事情,但它们显然不允许将文件拖放到页面上。
我在页面上有一个区域,用户可以将文件拖放到该区域,我想在不支持该功能的设备上隐藏此区域。
我知道如何检测拖放API,也知道如何检测FileReader
和FileList
功能。问题是,现代移动浏览器可以处理所有这些事情,但它们显然不允许将文件拖放到页面上。
我在页面上有一个区域,用户可以将文件拖放到该区域,我想在不支持该功能的设备上隐藏此区域。
现在有一个关于Modernizr的问题https://github.com/Modernizr/Modernizr/issues/57。目前唯一的方法是通过navigator.userAgent
来检测移动设备。
if(window.FileReader) {
完整的从桌面到浏览器拖放教程请参见::http://www.htmlgoodies.com/html5/javascript/drag-files-into-the-browser-from-the-desktop-HTML5.html#fbid=rxWgmrkH83W
要检测拖放支持,请使用如下的拖放属性:
if(Modernizr.draganddrop) {
var isEventSupported = (function() {
var TAGNAMES = {
'select': 'input', 'change': 'input',
'submit': 'form', 'reset': 'form',
'error': 'img', 'load': 'img', 'abort': 'img'
};
function isEventSupported( eventName, element ) {
element = element || document.createElement(TAGNAMES[eventName] || 'div');
eventName = 'on' + eventName;
// When using `setAttribute`, IE skips "unload", WebKit skips "unload" and "resize", whereas `in` "catches" those
var isSupported = eventName in element;
if ( !isSupported ) {
// If it has no `setAttribute` (i.e. doesn't implement Node interface), try generic element
if ( !element.setAttribute ) {
element = document.createElement('div');
}
if ( element.setAttribute && element.removeAttribute ) {
element.setAttribute(eventName, '');
isSupported = typeof element[eventName] == 'function';
// If property was created, "remove it" (by setting value to `undefined`)
if ( typeof element[eventName] != 'undefined' ) {
element[eventName] = undefined;
}
element.removeAttribute(eventName);
}
}
element = null;
return isSupported;
}
return isEventSupported;
})();
使用方法:
if (isEventSupported('dragstart') && isEventSupported('drop')) {
...
}
关于文件 API:
var isFileAPIEnabled = function() {
return !!window.FileReader;
};
参考资料:
FileReader
并不能回答“浏览器是否可以通过拖放接收文件”的问题。至少移动版Safari拥有FileReader
和拖放API,但不允许通过拖放接收文件。 - homm