- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用一个简单的浏览器窗口,如下所示:
let win = new BrowserWindow({
width: 500,
height: 613,
title: 'My App',
autoHideMenuBar:true,
icon: path.join(__dirname, 'logo.ico'),
resizable:false,
backgroundColor:"#2c2f33",
webPreferences: {
session : session,
webSecurity: false,
}
})
win.on('closed', () => {
win = null
})
// Load a remote URL
win.loadURL('http://192.168.40.189:1337')
session.fromPartition('persist:name');
session.defaultSession.cookies.get({}, (error, cookies) => {
console.log(error, cookies)
})
每当我单击浏览器窗口中的链接时,就会创建一个 Electron 浏览器窗口的新实例。是否可以使用默认系统浏览器打开链接? ( Chrome /火狐/维瓦尔第/等)
我已经阅读了这些资源以及其他资源。但没有一个取得任何成功:
How do I open a url from on default OS browser?
编辑:
我已经尝试过这个,它似乎是我找到的所有解决方案中最有可能起作用的,但它给了我:webContents.on 不是一个函数
。
const {webContents} = require(' Electron ')
var handleRedirect = (e, url) => {
if(url != webContents.getURL()) {
e.preventDefault()
require('electron').shell.openExternal(url)
}
}
webContents.on('will-navigate', handleRedirect)
webContents.on('new-window', handleRedirect)
HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" integrity="sha384-rwoIResjU2yc3z8GV/NPeZWAv56rSmLldC3R/AZzGRnGxQQKnKkoFVhFQhNUwEyJ" crossorigin="anonymous">
<link rel="stylesheet" href="/css/normalize.css">
<link rel="stylesheet" href="/css/main.css">
</head>
<body>
<div id="loader-wrapper">
<div id="loader"></div>
<div class="loader-section section-left"></div>
<div class="loader-section section-right"></div>
</div>
<div class="chat">
<div class="chat-header clearfix">
<div class="chat-about">
</div>
<i class="fa fa-star"></i>
</div> <!-- end chat-header -->
<div class="chat-history">
<ul id="content"></ul>
</div> <!-- end chat-history -->
<div class="chat-message clearfix">
<input type="text" id="input" class=" message-to-send" tabindex="1" disabled="disabled" placeholder="Enter name" />
</div>
</div>
<div class="chat-num-messages" id="status" style="display: none!important;">Connecting...</div>
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript">window.jQuery || document.write('<script src="js/vendor/jquery-1.9.1.min.js"><\/script>')</script>
<script type="text/javascript" src="/chat-frontend.js"></script>
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="js/main.js"></script>
<script type="text/javascript">
const shell = require('electron').shell
const links = document.querySelectorAll('a[href]')
Array.prototype.forEach.call(links, function (link) {
const url = link.getAttribute('href')
if (url.indexOf('http') === 0) {
link.addEventListener('click', function (e) {
e.preventDefault()
shell.openExternal(url)
})
}
})
</script>
<script src="js/vendor/modernizr-2.6.2.min.js"></script>
</body>
</html>
JS 前端:
// "use strict";
// for better performance - to avoid searching in DOM
const inputElement = document.getElementById('input');
const contentElement = document.getElementById('content');
const statusElement = document.getElementById('status');
var userName = document.getElementById('status');
// my color
var myColor = false;
// my name
var myName = false;
// if mozilla, use built in.
window.WebSocket = window.WebSocket || window.MozWebSocket;
if (!window.WebSocket) {
contentElement.innerHTML = "<p>Sorry, your browser doesn't support websocket.</p>";
inputElement.style = "display: none";
statusElement.style = "display: none";
}
// open connection
const connection = new WebSocket('ws://192.168.40.189:1337');
connection.addEventListener('open', function(e) {
inputElement.removeAttribute('disabled');
statusElement.innerHTML = ' ';
});
connection.addEventListener('error', function (error) {
contentElement.innerHTML = '<p>Sorry, but there\'s some problem with your connection, or the server is down.</p>';
});
connection.addEventListener('message', function (message) {
var json;
try {
json = JSON.parse(message.data);
} catch (e) {
console.log('Invalid JSON: ', message.data);
return;
}
if (json.type === 'color') {
myColor = json.data;
statusElement.innerHTML = myName + '';
statusElement.style.color = myColor;
inputElement.removeAttribute('disabled');
userName = userName;
} else if (json.type === 'history') {
for (var i=0; i < json.data.length; i++) {
var str = json.data[i].text;
var strChanged = str.replace(/https?:\/\/[^ ]+/g, '<span class="linkIsHere">➜</span><a target="_blank" href="$&">[Link]</a>'); // match any word until space
addMessage(json.data[i].author, strChanged, json.data[i].color, new Date(json.data[i].time));
}
} else if(json.type === 'message' && (json.data.author != userName)){
// console.log("author: "+ json.data.author + userName.value);
var str = json.data.text;
var strChanged = str.replace(/https?:\/\/[^ ]+/g, '<span class="linkIsHere">➜</span><a target="_blank" href="$&">[Link]</a>'); // match any word until space
addMessage(json.data.author,strChanged,json.data.color, new Date(json.data.time));
}
else if (json.type === 'message' && json.data.text.length > 60) { //spam protection....
inputElement.value = "Denna checken gjordes speciellt för Christian...";
}
else if (json.type === 'message') {
// standard message.
inputElement.removeAttribute('disabled');
// convert urls to links.
var str = json.data.text;
var strChanged = str.replace(/https?:\/\/[^ ]+/g, '<span class="linkIsHere">➜</span><a target="_blank" href="$&">[Link]</a>'); // match any word until space
addMessageRight(json.data.author, strChanged, json.data.color, new Date(json.data.time));
}
else {
console.log('Hmm..., I\'ve never seen JSON like this:', json);
}
});
//username cookie
function createCookie(name,value,days) {
if (days) {
var date = new Date();
date.setTime(date.getTime()+(days*24*60*60*1000));
var expires = "; expires="+date.toGMTString();
}
else var expires = "";
document.cookie = name+"="+value+expires+"; path=/";
}
function readCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for(var i=0;i < ca.length;i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1,c.length);
if (c.indexOf(nameEQ) != 0) return nameEQ.match("([^=]*)")[i];
console.log(nameEQ.match("([^=]*)")[i]);
}
return nameEQ.match("([^=]*)");
}
function getCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for(var i=0;i < ca.length;i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1,c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
}
return null;
}
function eraseCookie(name) {
createCookie(name,"",-1);
}
/**
* Send message when user presses Enter key
*/
//Cookie Check
if(readCookie(document.cookie) != ""){
var listener = function(){
var myName = ' ';
myName = readCookie(document.cookie);
connection.send(myName);
console.log("HE222EEJ: ")
inputElement.setAttribute('placeholder','Send Message...');
document.removeEventListener('click',listener,true);
};
document.addEventListener('click',listener,true);
// connection.send(msg);
}
if(getCookie(document.cookie) == null){
console.log("HEE333EJ: ")
input.addEventListener('keydown', function(e) {
if (e.keyCode === 13) {
const msg = inputElement.value;
if (!msg) {
return;
}
connection.send(msg);
inputElement.value = '';
inputElement.setAttribute('placeholder','Send Message...');
if(!myName && msg.length > 20){inputElement.value="Sluta nu Christian...";}
if(myName === false){
myName = msg;
userName = myName;
createCookie(userName,userName,7);
}
}
else{
return;
}
});
}
/* om det är connection-problem */
setInterval(function() {
if (connection.readyState !== 1) {
statusElement.innerHTML = 'ERROR';
inputElement.setAttribute('disabled', 'disabled');
inputElement.value = 'Unable to communicate with the WebSocket server.';
}
}, 3000);
/**
* Add message to the chat window
*/
function addMessage(author, message, color, dt) {
contentElement.innerHTML += `<li class="clearfix">
<div class="message-data">
<span class="message-data-name">
<i class="fa fa-circle online"></i>`
+author+
`</span>
<span class="message-data-time">`
+ (dt.getHours() < 10 ? '0'
+ dt.getHours() : dt.getHours()) + ':'
+ (dt.getMinutes() < 10
? '0' + dt.getMinutes() : dt.getMinutes())+
`</span>
</div>`
+`<div class="message my-message" style="background:`+color+`;--my-color-var:`+color+`;">`+message+`
</div>
</li>`;
contentElement.scrollIntoView({block: "end"}); //gjord speciellt för christian.
}
function addMessageRight(author, message, color, dt) {
contentElement.innerHTML += `<li class="clearfix">
<div class="message-data align-right">
<span class="message-data-time">` + (dt.getHours() < 10 ? '0'+ dt.getHours() : dt.getHours()) + ':'+ (dt.getMinutes() < 10? '0' + dt.getMinutes() : dt.getMinutes())+`</span>
<span class="message-data-name">` +author+`</span><i class="fa fa-circle online"></i>
</div>`
+`<div class="message other-message float-right" style="background:`+color+`;--my-other-color-var:`+color+`;">`+message+`
</div>
</li>`;
contentElement.scrollIntoView({block: "end"});
var audio = new Audio('notification.mp3');
audio.play();
}
谢谢
最佳答案
您可以按照尝试使用 webContents
的类实例方法而不是静态函数的方式来执行此操作
const { app, BrowserWindow, shell } = require('electron')
app.once('ready', () => {
const handleRedirect = (e, url) => {
if (url !== e.sender.getURL()) {
e.preventDefault()
shell.openExternal(url)
}
}
const win = new BrowserWindow()
// Instead bare webContents:
win.webContents.on('will-navigate', handleRedirect)
win.loadURL('http://google.com')
})
关于node.js - 如何使用 Electron 在默认浏览器中打开链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51130743/
首先,我创建了一个标签,并使用electron-packager构建了我的应用程序: node_modules/.bin/electron-packager . MyApp --platform=wi
我正在寻找一种基于 Electron 加载页面中提供的信息来更新MAC应用程序的徽章值的方法。 我在启动时使用main.js文件中的以下代码加载页面。 function createWindow ()
我正在使用 Electron 构建一个应用程序,并使用 Electron Builder 进行打包。当运行 Electron 时,我想通过这个command line argument: --enab
我遇到一种情况,当用户安装我的 Electron 应用程序时,我实际上需要安装2个应用程序:我的应用程序+一个单独的Windows MSI,它将作为我的应用程序工件的一部分包含在内。 我是Electr
使用 Electron 生成器构建 Electron 应用程序后,我无法从dist文件夹中打开该应用程序。我确实更改了所有链接以使用path.join(__ dirname,“relative_pat
我使用Linux,并正在制作要在Windows,Mac和Linux上分发的Electron App。我想要的是我的应用程序可以自我更新-但这需要代码签名。 这是否意味着我需要同时购买Windows和M
我在 Electron 应用主程序中使用foreverjs,如下所示: const forever = require("forever-monitor"); let child = forever.
在我在 Windows 10 上运行的 electron-forge 应用程序中,没有呈现 ejs 模板,尽管没有可见错误。 我可以使用创建的应用程序重现该问题 electron-forge init
我有一个 Electron 应用程序,该应用程序可以完美运行到开发环境中,并且日志引擎可以写入文件(使用winston.js)。 该项目的结构是这样的: 当我运行 Electron 构建器来打包我的应
Electron 应用程序是使用 electron-forge webpack 模板初始化的,一切都适用于 macOS。 使用 运行开发版本时 Electron 锻造开始该应用程序在 Windows
我正在尝试将我的 Electron 应用发布到GitHub版本,但无法正常工作。 这就是我所拥有的:package.json .... "scripts": { "start": "elect
我现在使用electron-builder并设法达到事件监听器的设置和触发点,但是我认为我没有完全正确设置它,因为当我使用electron .打开应用程序时,出现以下错误: Checking for
我想要的不是排除未使用的文件,而是将使用过的文件包排除到.exe文件中 我提供了一个像 config.json 这样的文件供用户编辑一些自定义配置,然后应用程序可以读取该文件来做一些事情。所以我不希望
我想了解 Signal Desktop 或 Visual Studio Code 等 Electron 桌面应用程序正在使用哪个版本的 Electron。有没有简单的方法——比如在开发控制台中输入命令
我有一个Electron我想在其中引入并行发布 channel 的应用程序:stable、next(用于早期采用者)和dev(用于测试最新版本)。 这些都会有一个分支,新功能首先出现在 dev 中,然
我是 Electron 新手,我想在主窗口中运行非 Electron 可执行文件。可以这样做吗? 这是我的代码: mainWindow = new BrowserWindow({width: 860,
我开始使用 GitHub 按需培训学习 Electron。当我执行以下命令时。系统抛出错误。 electron % electron-forge init electron-app ⚠ Could n
在我的 Electron 应用程序中,我使用“electron-json-storage”模块在本地存储一些设置数据。 但是,为了访问这些数据,我必须先找到本地路径。 为此,我正在使用 app.get
最近开始接触 Electron 。任何人都可以帮助我选择数据库。似乎没有直接的选择。 建议中型项目的数据库。 最佳答案 在 Electron 应用程序中,您可以使用您选择的数据库: https://g
我是Electron的新手,无法找到应用程序菜单的工作示例。 尝试将Quick Start应用程序与Electron文档的Class: Menu页面中的示例结合使用时,似乎什么都没发生-更改label
我是一名优秀的程序员,十分优秀!