Прежде всего, по причинам Chromecast, я хочу ограничить в настоящее время решение браузером Chrome.
То, что я хотел бы сделать, - это упаковать каталог изображений с помощью пакетного файла (cmd или sh) запуска и html файла. Файл html должен быть полностью автономным, без импорта.
Файл bat содержал бы что-то вроде:
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files "file://%CD%\SlideShow1.2.html?slideDir=%CD%\Slides"
В настоящее время я могу использовать
<input type="file" id="slideInput" multiple="multiple" webkitdirectory="webkitdirectory" onchange="appendToSlideList();" accept=".png,.gif,.jpg,.jpeg" />
вручную выбрать файлы и
var slideList = [];
var numSlides = 0;
function appendToSlideList()
{
var slideInput = document.getElementById("slideInput");
var slides = slideInput.files;
for(j = 0; j < slides.length; j++)
{
slideList[numSlides++] = slides[j];
}
}
для добавления изображений из выбранных каталогов в основной список слайдов. Затем через объект Timer() отображаются слайды:
function showNext()
{
if(picture == null)
{
picture = document.getElementById("slideShow");
intervalElem = document.getElementById("interval");
}
if(currentPicture == numSlides)
{
currentPicture = 0;
}
// this comes from https://www.w3.org/TR/file-upload/#file
picture.src = window.URL.createObjectURL(slideList[currentPicture++]);
var interval = parseInt(intervalElem.value) * 1000;
timer = new Timer(showNext, interval);
}
Если вы читали это далеко, то неуютно. Таким образом, все это (плюс другой вспомогательный код, который не соответствует желаемому решению) работает, чтобы показать слайд-шоу, основанное на пользовательском вводе объекта.
Мое желание состоит в том, чтобы упаковать вещи, чтобы все, что нужно сделать пользователю, - это дважды щелкнуть файл bat, и браузер продолжит показывать слайд-шоу.
Итак, после всего этого, мой вопрос заключается в том, как взять переданный каталог и получить все графические файлы в этом каталоге для использования в уже работающем коде.
Я провел последние шесть часов, исследуя этот вопрос, многое из StackOverflow, и мне кажется, в настоящее время, что это невозможный квест.
Здесь скрипка с "полным" минималистским кодом: https://jsfiddle.net/hrvrdfjs/
Спасибо!
Том.
Мне не удалось использовать команду "dir", как указано выше, возможно, потому, что я использую Windows 7. Вот что я придумал, вместо этого:
mkdir C:\Temp\slideShow
rem Replace each instance of a back slash with two, as javascript will remove a single backslash
rem (Unless it is followed by a 'valid' backslash char (r,n,etc.), which is not what we want.).
echo var topLocation = '%CD:\=\\%'; > C:\Temp\slideShow\topLocation.js
echo var slideDirContents = ' > "C:\Temp\slideShow\slideDirContents.js"
dir %CD%\Slides\*.jpeg %CD%\Slides\*.jpg %CD%\Slides\*.png %CD%\Slides\*.gif /B /ON >> "C:\Temp\slideShow\slideDirContents.js"
echo '; >> C:\Temp\slideShow\slideDirContents.js
Затем, чтобы разделить каждый файл из входного файла.js и создать путь к файлу, который позже будет использоваться для создания URL-адреса, который img.src мог бы представить файл (ПРИМЕЧАНИЕ: функция добавления должна была быть выполнена после страницы был загружен, поэтому элемент textarea будет присутствовать для изменения javascript):
function doOnloadFunctions()
{
addStaticsToSlideList();
}
function addStaticsToSlideList()
{
// Empty dir on Windows == size 2 (CR-LF)
// Empty dir on others == size 1 (CR or LF)
if((slideDirContents.length != 2) && (slideDirContents.length != 1))
{
var slidelistElem = document.getElementById("slidelist");
// Linux/Unix/BSD based line separator = \n
// Windows based line separator = \r\n
// Mac based line separator = \r
var re = /\n|\r\n|\r/;
var slides = slideDirContents.split(re);
for(j = 0; j < slides.length; j++)
{
var aFile = {};
var theName = slides[j].trim();
if(theName.length > 0)
{
var fileName = slides[j];
aFile.fileName = topLocation + '\\Slides\\' + fileName;
// Set the original index to the current insertion point.
aFile.oi = numSlides;
// Set the shuffle index simply to instantiate it. We'll
// set the si for real when we want to shuffle the array.
aFile.si = 0;
var listElem = document.createElement("li");
listElem.appendChild(document.createTextNode(fileName));
slidelistElem.appendChild(listElem);
slideList[numSlides++] = aFile;
}
}
}
}
Там элемент ввода <file>, который можно использовать для добавления локальных файлов в список слайдов, вход <файл> не заполняет name
fileName
которое просто заполняет name
таким образом, это код дифференцирования, который создает каждый <img> с помощью правильный URL:
if(!(typeof slideList[currentPicture].fileName === 'undefined' || slideList[currentPicture].fileName === null))
{
// variable is defined and not null
picture.src = "file://" + slideList[currentPicture++].fileName;
}
else
{
// this comes from https://www.w3.org/TR/file-upload/#file
picture.src = window.URL.createObjectURL(slideList[currentPicture++]);
}
Благодаря NineBerry для кода и предложений!
В настоящее время JavaScript не может использовать JavaScript в браузере для отображения файлов из каталога без явного выбора пользователем каталога в браузере.
Однако вы можете легко создать файл JavaScript, содержащий список файлов изображений в каталоге из пакетного файла, например:
@echo off
echo var toC = ' > "C:\slides\data.js"
dir C:\slides\*.png,*.gif,*.jpg,*.jpeg /B >> "C:\slides\data.js"
echo '; >> C:\slides\data.js
Это создаст файл data.js, который выглядит так:
var toC = '
funny.png
serious.png
holidays.jpeg
';
Пояснения:
echo var toC = ' > "C:\slides\data.js"
Создает или перезаписывает файл C:\slides\data.js кодом javascript, который является первой частью создания литерала шаблона.
dir C:\slides\*.png,*.gif,*.jpg,*.jpeg /B >> "C:\slides\data.js"
Сообщает директорию, чтобы отобразить файлы с указанными расширениями в данном каталоге и добавляет имена файлов в файл data.js. Параметр /B
делает dir только выводом имен файлов, никакой другой информации и также пропускает вывод верхнего и нижнего колонтитула для распечатки.
echo '; >> C:\slides\data.js
Это добавляет конец литерала шаблона javascript.
В JavaScript ES6 и новее литералы шаблонов могут использоваться для создания строковых литералов, которые охватывают несколько строк и могут содержать произвольные символы.
Загрузите файл data.js динамически из своего html-документа (добавив тег скрипта, который ссылается на файл), и вы можете получить доступ к переменной toC
которая содержит список файлов в виде многострочной строки.
Это демо, где файл data.js статически включен:
<html>
<head>
<script src="C:\slides\data.js"></script>
</head>
<body>
<script>
window.alert(toC);
</script>
</body>
</html>