Электронный Js, Drag-drop, JavaScript

Я новичок в Electron Framework. Я пытаюсь разработать настольное приложение с помощью Electron Framework. Я хочу реализовать такой вариант использования, как просмотрщик команд с левой стороны, где у меня есть локальные каталоги, а с правой стороны - сетевые каталоги. Я хочу скопировать файл или папку из локальной сети в сеть с помощью функции перетаскивания. Как мне это сделать в JavaScript?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
3 248
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете сделать это с помощью Electron.

Для вашей логики перетаскивания вы можете попробовать следующее: Перетащите и отпустите электрон или просто используйте любую библиотеку перетаскивания html / js, если она вам нужна только внутри одного окна.

Вы можете получить доступ к файлам с помощью узловых модулей, в этом случае вы можете использовать модуль файловой системы Узел ФС.

«Для вашей логики перетаскивания вы можете попробовать следующее: перетащить и оставить Electron или просто использовать любую html / js библиотеку перетаскивания, если она вам нужна только внутри одного окна». как реализовать?

priyatham j.s 04.09.2018 12:42

Вы хотите два BrowserWindows и перетаскивать их из одного в другое или из одного окна и перетаскивать внутри него?

Rapwnzel 04.09.2018 12:51

Да, более или менее похоже на просмотрщик команды. Я хочу перетащить из одного div, в котором у меня есть локальный каталог, а в другом div есть каталог linux. Я просто хочу перетащить файл или папку из локального в сеть. Перетаскивание и падение происходит но копирование файла не происходит.

priyatham j.s 04.09.2018 15:32

Найдите ссылку на render.js docs.google.com/document/d/… main.html docs.google.com/document/d/…

priyatham j.s 05.09.2018 14:36

Вам нужно отправить сообщение на ваш main.js с помощью IPCRenderer, прослушать это сообщение в вашем main.js и скопировать файл, если это сообщение получено. Вы, вероятно, отправили бы указанное сообщение в своей функции перетаскивания. Вам нужно передать идентификатор или полный путь в качестве аргумента.

Rapwnzel 05.09.2018 16:53

Вы можете помочь мне с любым образцом кода, который соответствует моим требованиям?

priyatham j.s 06.09.2018 08:14

Я опубликовал новый ответ, так как он немного длиннее

Rapwnzel 06.09.2018 10:51

Я пробовал ваш код, но вижу белый экран в окне браузера и никаких ошибок в консоли. Пожалуйста, создайте плункер и поделитесь ссылкой. заранее спасибо.

priyatham j.s 06.09.2018 11:50

Вы создавали какие-либо файлы внутри этих двух папок? Окно будет отображать только файлы, поэтому оно останется пустым, если файлов нет.

Rapwnzel 06.09.2018 12:03

Спасибо. Это сработало. Но как зацикливать системные каталоги и выполнять ту же операцию, что и передача файлов.

priyatham j.s 06.09.2018 12:11

Это выходит за рамки вашего первоначального вопроса. Кроме того, поскольку приведенный ниже ответ является ответом на ваш вопрос, отметьте его как правильный ответ, чтобы его могли увидеть другие. Удачи тебе с твоим проектом!

Rapwnzel 06.09.2018 12:16
Ответ принят как подходящий

Хорошо, поэтому я собрал быстрый пример. Вам придется изменить это, потому что это работает только для перемещения файлов на том же диске.

Вот мой index.html с двумя div для проверки управления перетаскиванием:

<html>
<head>
    <link rel = "stylesheet" href = "style.css">
    <script src = "app.js"></script>
</head>
<body>
    <div id = "sourceDrive" class = "drive" ondrop = "dropOnSource(event)" ondragover = "allowDrop(event)"></div>
    <div id = "destinationDrive" class = "drive" ondrop = "dropOnDestination(event)" ondragover = "allowDrop(event)"></div>
</body>

И соответствующий app.js:

const electron = require('electron');
const ipc = electron.ipcRenderer;

function loadFiles(){
    ipc.send("loadFiles");
}
loadFiles();

ipc.on('sourceFiles', (ev, args) => {
    document.querySelector("#sourceDrive").innerHTML = "";
    args.forEach(file => { 
        document.querySelector("#sourceDrive").innerHTML += '<div id = "'+file+'" draggable = "true" ondragstart = "drag(event)">'+file+'</div>';
    });
})
ipc.on('destinationFiles', (ev, args) => {
    document.querySelector("#destinationDrive").innerHTML = "";
    args.forEach(file => { 
        document.querySelector("#destinationDrive").innerHTML += '<div id = "'+file+'" draggable = "true" ondragstart = "drag(event)">'+file+'</div>';
    });
})

function allowDrop(ev) {
    ev.preventDefault();
}
function drag(ev) {
    ev.dataTransfer.setData("text", ev.target.id);
}
function dropOnSource(ev) {
    ev.preventDefault();
    var data = ev.dataTransfer.getData("text");
    ipc.send('moveToSource', data);
    loadFiles();
}
function dropOnDestination(ev) {
    ev.preventDefault();
    var data = ev.dataTransfer.getData("text");
    ipc.send('moveToDestination', data);
    loadFiles();
}

А вот и main.js:

const electron = require('electron');
const app = electron.app;
const BrowserWindow = electron.BrowserWindow;
const ipc = electron.ipcMain;
const fs = require("fs");

let mainWindow;

const sourcePath = "fileSource";
const destinationPath = "fileDestination";

app.on('ready', _ => {
    console.info("App running");

    mainWindow = new BrowserWindow({
        width: 600,
        height: 400
    });
    mainWindow.loadURL('file://' + __dirname + '/ui/index.html');

    ipc.on("loadFiles", (event, arg) => {
        var fileStackSource = [];
        fs.readdirSync(sourcePath).forEach(file => {
            fileStackSource.push(file);
        });
        var fileStackDestination = [];
        fs.readdirSync(destinationPath).forEach(file => {
            fileStackDestination.push(file);
        });
        mainWindow.webContents.send('sourceFiles', fileStackSource);
        mainWindow.webContents.send('destinationFiles', fileStackDestination);
    });

    ipc.on('moveToSource', (event, arg) => {
        console.info("moving " + arg + " from " + destinationPath + " to " + sourcePath);
        fs.renameSync(destinationPath + "/" + arg, sourcePath + "/" + arg);
    });
    ipc.on('moveToDestination', (event, arg) => {
        console.info("moving " + arg + " from " + sourcePath + " to " + destinationPath);
        fs.renameSync(sourcePath + "/" + arg, destinationPath + "/" + arg);
    });
});

Мой каталог выглядит следующим образом:

  • main.js

  • ui

- index.html

- app.js

  • fileSource

  • fileDestination

Это должно помочь вам понять основы того, что вы планируете делать. Если вы все еще не уверены в основах работы с электроном, я рекомендую вам начать с этого.

Другие вопросы по теме