Относительно & hellip;
& ldquo; хотел бы иметь возможность перетаскивать файл в интерфейс [HTA] & rdquo;
& hellip; который я интерпретирую как желание сбрасывать файлы в HTA & rsquo; окно, а не удаление файлов в самом файле HTA или ярлык к нему.
С HTML5 само удаление легко. Используйте, например, элемент <div>
как область перетаскивания. Для этого элемента обработайте события dragenter
, dragover
и drop
. Например. обработчик сброса может выглядеть так:
function on_drop( e )
{
e.preventDefault(); // stops the browser from redirecting off to the file
var dt = e.dataTransfer
var is_file_transfer = false;
for( var i = 0; i < dt.types.length; ++i )
{
if( dt.types[i].toLowerCase() == 'files' )
{
is_file_transfer = true;
}
}
if( !is_file_transfer )
{
return false;
}
on_files_dropped( dt.files );
return true;
}
& hellip; где on_files_dropped
- это определенная вами функция, которая обрабатывает удаление файлов.
Динамическое добавление обработчиков событий в событие загрузки документа может выглядеть следующим образом:
var dropbox = document.getElementById( 'blah' );
dropbox.addEventListener( 'dragenter', on_dragenter, false );
dropbox.addEventListener( 'dragover', on_dragover, false );
dropbox.addEventListener( 'drop', on_drop, false );
Пока все хорошо.
Однако безопасность вмешивается с ограничением: вы не получаете непосредственного знания об исходных путях файлов , только об именах файлов и размерах файлов. Для этого функционал предназначен для Интернета, а не для локальных доверенных приложений HTML. Так что это может или не может быть проблемой.
В целях использования отброшенного файла в качестве источника для элемента HTML и, как правило, для чтения отброшенного файла, HTML5 предоставляет FileReader
(там доступно несколько учебных пособий , ссылки на которые приведены далее в технической документации.
Где необходим локальный путь, например для воспроизведения файла в Windows Mediaplayer вы можете предположить , что операция перетаскивания возникла из проводника Windows, теперь также называемого проводником файлов, а затем просто проверить, в каком окне проводника, если таковое имеется, содержится файл с таким именем и размер.
Надеюсь, будет найдено не более одного такого исходного окна.
var shell = new ActiveXObject( "Shell.Application" );
var fso = new ActiveXObject( "Scripting.FileSystemObject" );
function possible_paths_for( filename )
{
var windows = shell.windows(); // Windows Explorer windows.
var n_windows = windows.Count;
var lowercase_filename = filename.toLowerCase();
var paths = Array();
for( var i = 0; i < n_windows; ++i )
{
var url = windows.Item(i).LocationURL;
var path = decodeURI( url.substr( 8 ) ).replace( /\//g, '\\' );
// The path can be the path of this HTML application (.hta file), so:
if( fso.FolderExists( path ) )
{
var folder = fso.GetFolder( path );
for( var it = new Enumerator( folder.Files ); !it.atEnd(); it.moveNext() )
{
var file = it.item();
if( file.Name.toLowerCase() == lowercase_filename )
{
paths.push( file.Path.toLowerCase() );
}
}
}
}
return paths;
}
По сути, это так. За исключением, может быть, поскольку HTA по умолчанию IE7, как получить функциональность HTML5. Ну, может, через объявление doctype, но пока в своих маленьких экспериментах я просто использую следующее:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<!-- A windows web control defaults to quirky IE7 semantics. Request for better: -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta http-equiv="MSThemeCompatible" content="yes">
Это дает вам новейший движок Internet Explorer, но за счет HTA
элемента и, следовательно, не имеет прямого доступа к командной строке. Я обнаружил, что командную строку можно получить, запустив Windows & rsquo; wmic
программа , но это ужасный взлом. Вся эта проблемная область, где большинство открытых дорог оказались закрытыми, является следствием того, что Microsoft теперь рассматривает устаревшие технологии HTA a и постепенно отказывается от них в пользу полноэкранного приложения для Windows 8 AppStore .
В любом случае, удачи!