Радж
С пониманием у меня действительно туго.
И я подозревал, что проблема с DOM.
Можно ли как-то в решить правильно эту проблему, без костылей?
Danila
перед подпиской на событие клика быть гарантированно уверенным, что элемент li есть в DOM
Vadim
Радж
О, класс ))) Спасибо всем!!!
Радж
Я пробую клики вынести в отдельную функцию и добавлять ее в li - onclick="myFunction()"
Радж
ПЛОХАЯ ИДЕЯ !
Прилетела ошибка - Refused to execute inline event handler because it violates the following Content Security Policy directive: "script-src 'self'". Either the 'unsafe-inline' keyword, a hash ('sha256-...'), or a nonce ('nonce-...') is required to enable inline execution.
Vadim
А слушатель ставишь когда? Поставь лог до того как ставить слушатель, выведи сам элемент
Danila
Я думаю, что вам всё-таки не в Electron-сообщество. В данном случае данные из IPC можно получить через fetch/xhr и будет то же самое
Радж
Если бы это был обычный web, проблем бы не было.
Скорее всего это таки связанно с электроном, вернее с тем как он работает с DOM.
Я попробовал добавить один элемент из render.js, он работает с событиями даже после добавления настоящих.
Думаю jq работает с dom круче )
Радж
Может vue прикрутить. Есть у кого опыт добавление в готовый проект?
Это возможно?
Danila
Danila
Вы решите проблемы с пониманием JavaScript и всё будет хорошо
Danila
вы сейчас пытаетесь решить проблему неподходящего шурупа другой отверткой
Радж
Я понимаю, что это по определению не может быть.
Если бы я все делал в web, работало безотказно .
Но тут я столкнулся с тем, что противоречит моему опыту.
Можно я тут приведу кусочки кода?
Oleh
Я вообще честно так и не понял в чем проблема
Oleh
Конечно можно, лучше всего на каком-то плейграунде, типо codepen
Oleh
Радж
Там использую стороннюю библиотеку
Радж
// main.js
. . .
const { promiseIpcMain } = require('promisify-electron-ipc');
promiseIpcMain
.send("info", mainWindow.webContents, info)
.then(answer => console.log(answer));
. . .
// render.js
. . .
const { promiseIpcRenderer } = require('promisify-electron-ipc');
var ul = document.getElementById("info-block");
promiseIpcRenderer.on("info", info => {
ul.innerHTML += '<li class="info"><a type="button"> ' + info+ </a></li>'
);
});
let informs = document.querySelectorAll(".info")
if (informs != null) {
for (i = 0; i < informs .length; i++) {
informs[i].addEventListener('click', function() {
alert("Yes!!")
});
}
}
. . .
// index.html
. . .
<ul id="info-block">
<script src="js/render.js"></script>
. . .
Oleh
Мне непонятно где какие файлы вызываются, main.js в index.html, render.js
Радж
index.html открывается в main.js
Oleh
А main - это main process?
Oleh
Вам надо скорее всего открывать index.html в render.js
Oleh
https://github.com/electron/electron-quick-start
А можете сделать пример на этом шаблоне?
Радж
Не думаю. index.html, это главное окно. Вернее он грузится в главное окно при старте проекта
Радж
Boris
Кто-нибудь сталкивался с ошибкой UnhandledPromiseRejectionWarning: Error: An object could not be cloned ?
Oleh
Сейчас скину
Danila
Danila
он должен быть Transferable. То есть приводиться к простому объекту (как JSON)
Danila
даже не Transferable (это между воркерками). Serializable
Boris
Oleh
Попробую
https://github.com/AleshaOleg/electron-quick-start
Oleh
npm i
npm start
Oleh
Учтите, что я включил nodeIntegration что бы сделать импорт библиотеки. Это не безопастно
Oleh
У меня не сохранят изображения в версии с app store, кто-то сталкивался? Какого-то пермишена может не хватает?
Oleh
https://github.com/ubergrape/grape-electron/blob/master/build/entitlements.mas.plist#L21
Вроде бы все правильно у меня стоит
Electron.js releases
v11.0.0-nightly.20200610
https://github.com/electron/electron/releases/tag/v11.0.0-nightly.20200610
v11.0.0-nightly.20200610
Радж
https://github.com/AleshaOleg/electron-quick-start
Да, ваш вариант работает. Но это не тот случай. Я наверное очень устал искать решение, вот и сумбурно рассказал.
У меня в main.js приходят данные с сервера.
Я из main.js их отправляю в renderer.js
const { promiseIpcMain } = require('promisify-electron-ipc');
promiseIpcMain
.send("info", mainWindow.webContents, info)
.then(answer => console.log(answer));
Уже из renderer.js я их добавляю их в index.html
const { promiseIpcRenderer } = require('promisify-electron-ipc');
var ul = document.getElementById("info-block");
promiseIpcRenderer.on("info", info => {
ul.innerHTML += '<li class="info"><a type="button"> ' + info+ </a></li>'
);
});
let informs = document.querySelectorAll(".info")
if (informs != null) {
for (i = 0; i < informs .length; i++) {
informs[i].addEventListener('click', function() { // Это событие клика
alert("Yes!!")
});
}
}
Это в index.html
<ul id="info-block"></ul>
<script src="js/render.js"></script>
То есть у меня происходит динамическое добавление li в ul
Вот тут и проблема. Если я, как и вы, добавлю в index.html "готовый" li,
то клик на него срабатывает до тех пор, пока туда не добавятся динамические данные.
И больше клики не срабатывают.
Oleh
Ну это не проблема электрона
Oleh
Потому что события нужно навесить после того как дом отрисовался
Oleh
У вас в коде они только на начальном рендере добавляются
Oleh
Нужно делать тоже самое в callback
Oleh
Для события info
Danila
Радж
Да ............
СПАСИБО ОГРОМНОЕ ВСЕМ!!!!!
Данила, вам отдельное спасибо ) Сделал так, как вы указали.
И все заработало.
Просто я не привык к таким не очевидным алгоритмам какие применяются в js.
Алексей
подскажите, установщик почему-то виснет в таком виде..Не пойму почему.
Алексей
Алексей
выяснил что это происходит после добавления параметра appId в конфиг билдера. Но почему так происходит - до сих пор не понятно
Danila
Радж
)
Алексей
Подскажите, почему добавление appId в конфиг билдера приводит к зависанию инсталятора?
Anonymous
А никто не сталкивался с тем, что globalshortcut ( https://www.electronjs.org/docs/api/accelerator ) не работает с просто одной кнопкой?
Anonymous
то есть CommandOrControl+A работает, а на "CommandOrControl" он плюется ошибкой
Danila
Vadim
Vadim
Забыл как либа та называется, тут ее часто проклинали)
Danila
Ну и не по гайдам это
Danila
Anonymous
Vadim
Evgeny
Переезжаю на forge, вот и первый концептуальный вопрос подоспел, может кто знает ответ https://github.com/electron-userland/electron-forge/issues/1758
Илья
Пс пс Ребят
А есть где ниб хорошие курсы или уроки по Электрону?
Electron.js releases
v11.0.0-nightly.20200611
https://github.com/electron/electron/releases/tag/v11.0.0-nightly.20200611
v11.0.0-nightly.20200611
Sergey F
Sergey F
потом на coursehunter можешь
Electron.js releases
v11.0.0-nightly.20200612
https://github.com/electron/electron/releases/tag/v11.0.0-nightly.20200612
v11.0.0-nightly.20200612
Electron.js releases
v9.0.4
https://github.com/electron/electron/releases/tag/v9.0.4
v9.0.4
Anonymous
Дратуте. Подскажите, насколько разумно при использовании базы ( lokijs, sqlite ) держать ее на стороне мейна, а все операции с базой проводить через ipc? Сейчас держу базу в рендере и столкнулся с проблемой синхронизации между несколькими окнами
Danila
Максимально разумно в рендере не держать ничего, кроме UI
Anonymous
Радж
Всем доброго времени суток )))
Простите за глупый вопрос, но если использовать в проекте sqlite3, нужно ли его устанавливать дополнительно?
Спасибо )
Радж
Просто приложение будут раздавать как архив. Распаковали и запустили бинарник.
Oleh
Oleh
Если electron-builder, то есть такая опция. https://www.electron.build/configuration/nsis#portable