browser.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. const url = require('url');
  2. /*const regedit = require('regedit'); //引入regedit
  3. regedit.putValue({
  4. 'HKCR/http/shell/open/command':{
  5. '默认' : {
  6. value : process.execPath,
  7. type : 'REG_SZ'
  8. }
  9. }
  10. },function () {
  11. });*/
  12. const {ipcRenderer} = require('electron');
  13. var ipc=require('electron').ipcRenderer;
  14. var US_Browser=[];
  15. /*注册命名空间*/
  16. Namespace.register("US_Browser");
  17. /*浏览器函数*/
  18. US_Browser.CreatBrower=function (address,flag) {//创建窗口,url,是否为用户选择文件
  19. var http = /^(http)/;
  20. var https = /^(https)/;
  21. var li=$$("li", {//创建ul下的li
  22. "className": "BrowerList"
  23. }, US_Browser.NavContainer);
  24. var ListBody=$$("div", {//创建li下的div
  25. "className": "BrowerListBody"
  26. }, li);
  27. US_Browser.NavContainer.insertBefore(li,US_Browser.AddButton);//把新建标签页按钮追加到ul的li下
  28. li.data={//传窗口地址
  29. "url":address,
  30. "name":null,
  31. "favicons":'public/img/tray/app.ico'
  32. };
  33. ListBody.tag_favicon=$$("img", {//标签页图标
  34. "className": "tag_favicon", "draggable":"false", "alt":""
  35. }, ListBody);
  36. ListBody.tag_favicon.onerror=function () {//不存在时显示的标签页图标
  37. this.src='public/img/tray/app.ico';
  38. webview.tag.data.favicons=this.src;
  39. };
  40. ListBody.Webname=$$("p", {//标签页标题
  41. "className": "Webname","innerHTML":address?"正在加载":"新建标签","draggable":"false"
  42. }, ListBody);
  43. ListBody.tag_close=$$("i", {//标题页关闭按钮
  44. "className":"icon-cancel tag_close"
  45. }, ListBody);
  46. var BrowerContainer=$$("div", {"className":"BrowerContainer"},$("body")[0]);//装载webview
  47. var webview=$$("webview", {//创建webview
  48. "allowpopups":"", "autosize":"on"
  49. }, BrowerContainer);
  50. webview.tag=li;//把li赋给webview标签
  51. webview.addEventListener("new-window",function (e) {//访客页面尝试打开新的浏览器窗口时触发。
  52. US_Browser.BrowersTag=$(".BrowerList");//获取选项卡li
  53. var LIwidth = ((US_Browser.NavContainer.offsetWidth - 120)/US_Browser.BrowersTag.length)-10;//得到每个li标签页宽度
  54. if(US_Browser.BrowersTag.length>=30){//如果如果li标签页大于35
  55. confirm("窗口太多,请关闭一些再使用");//弹出提示
  56. return false;
  57. }
  58. const protocol=url.parse(e.url).protocol;
  59. if(protocol==='http:'||protocol==='https:'||protocol==="about:blank"){
  60. US_Browser.CreatBrower(e.url);//系统的默认浏览器中打开新的URL
  61. }
  62. });
  63. webview.addEventListener("page-favicon-updated",function (e) {//当页面收到图标网址时触发
  64. ListBody.tag_favicon.src=e.favicons[0];
  65. this.tag.data.favicons=e.favicons[0];
  66. });
  67. webview.addEventListener('will-navigate',function (e) {//导航跳转时触发
  68. this.tag.data.url=e.url
  69. });
  70. webview.addEventListener('did-navigate',function (e) {//导航完成时触发
  71. this.tag.data.url=e.url;
  72. ListBody.Webname.innerHTML=this.getTitle();
  73. ListBody.click();
  74. });
  75. webview.addEventListener('dom-ready',function (e) {//加载完成webview后执行
  76. var canGoForward = $(".icon-right")[0];//获取前进图标
  77. var canGoBack = $(".icon-left")[0];//获取后退图标
  78. var reFresh = $(".refresh")[0];//获取刷新图标
  79. ListBody.Webname.innerHTML=this.getTitle();//更改webview的title
  80. this.tag.data.name=this.getTitle();
  81. US_Browser.goBackWebView = function(){//执行后退
  82. webview.goBack();
  83. };
  84. US_Browser.goForwardWebView = function(){//执行前进
  85. webview.goForward();
  86. };
  87. US_Browser.reFresh = function(){//执行刷洗
  88. webview.reload();
  89. };
  90. if(webview.canGoBack()){//判断是否可以后退
  91. canGoBack.style.color = '#5a5a5a';
  92. }else{
  93. canGoBack.style.color = '#d3d3d3';
  94. }
  95. if(webview.canGoForward()){//判断是否可以前进
  96. canGoForward.style.color = '#5a5a5a';
  97. }else{
  98. canGoForward.style.color = '#d3d3d3';
  99. };
  100. if(US_Browser.UrlArea.value === ""){
  101. reFresh.style.color = '#d3d3d3';
  102. }else{
  103. reFresh.style.color = '#5a5a5a';
  104. }
  105. US_Browser.LocalStorage(webview);
  106. });
  107. webview.onmousedown=function (e) {//webview鼠标事件
  108. US_Browser.MouseMenu(US_Browser.MouseMenuMain,this,US_Browser.MouseMenuCallBack,e);//右键显示创建应用菜单
  109. };
  110. ListBody.tag_close.onclick=function () {//点击标题页关闭按钮
  111. event.stopPropagation();
  112. var closeArr = [];
  113. for(var i=0;i<$(".tag_close").length;i++){//遍历li下关闭图标
  114. closeArr.push($(".tag_close")[i]);
  115. }
  116. closeArr[0].index = 0;//设置li下第一个关闭图标的index
  117. if(ListBody.tag_close.index == 0){
  118. webview.tag.nextSibling.onclick();//点击当前li下一个
  119. }else{
  120. webview.tag.previousSibling.onclick();//点击当前li上一个
  121. }
  122. US_Browser.NavContainer.removeChild(webview.tag);//移除当前li
  123. $("body")[0].removeChild(BrowerContainer);//移除当前webview
  124. }
  125. webview.src=address;//给webview的src传值
  126. US_Browser.UrlArea.onkeydown=function (e) {//获取搜索框值
  127. if(e.keyCode===13){//keycode为13
  128. if(this.value){//如果存在值
  129. if(this.value.match(http) || this.value.match(https)){//判断是否存在http或https
  130. webview.src=this.value;//给webview的src传值
  131. webview.tag.children[0].children[0].style.display = "block";//标签页图标显示
  132. }else {
  133. webview.src='http://'+this.value;//给webview的src传值
  134. webview.tag.children[0].children[0].style.display = "block";//标签页图标显示
  135. }
  136. }
  137. }
  138. };
  139. US_Browser.IconLock();//判断是否为https
  140. US_Browser.Bind(ListBody.Webname);
  141. ListBody.click();//点击li下的包裹节点
  142. if(flag){
  143. var pattern = new RegExp("^[a-zA-Z]:/[a-zA-Z_0-9//]*");
  144. if(pattern.test(address)){
  145. webview.src = "file:///"+address;
  146. }else{
  147. return false;
  148. }
  149. if(address.match(http) || address.match(https)){//判断是否存在http或https
  150. webview.src=address;//给webview的src传值
  151. webview.tag.children[0].children[0].style.display = "block";//标签页图标显示
  152. }else {
  153. webview.src='http://'+address;//给webview的src传值
  154. webview.tag.children[0].children[0].style.display = "block";//标签页图标显示
  155. }
  156. }
  157. };//创建一个新的浏览器选项卡
  158. US_Browser.MouseMenu=function (menu_main,data,callback,e,flag) {//右键菜单事件
  159. var createNode=document.body;//获取第一和参数父元素
  160. var MouseMenuMain=$('.MouseMenuMain');//获取右键菜单事件的ul元素
  161. for(var i=0;i<MouseMenuMain.length;i++){//隐藏右键菜单事件所有
  162. MouseMenuMain[i].style.display='none';
  163. }
  164. document.onmouseup=function () {//鼠标事件后触发
  165. if (e.button === 2||flag) {
  166. if (!flag) {
  167. menu_main.style.left = e.pageX + -parseFloat(createNode.getBoundingClientRect().left) + createNode.offsetLeft + 'px';//菜单定位横坐标
  168. menu_main.style.top = e.pageY + -parseFloat(createNode.getBoundingClientRect().top) + createNode.offsetTop + 'px';//菜单定位纵坐标
  169. if (menu_main.getBoundingClientRect().left + menu_main.offsetHeight - createNode.getBoundingClientRect().left > createNode.offsetWidth) {//判断距左位置
  170. menu_main.style.left = menu_main.style.left.split('px')[0] - menu_main.offsetWidth + 'px';//距左多少
  171. }
  172. if (menu_main.getBoundingClientRect().top + menu_main.offsetHeight - createNode.getBoundingClientRect().top > createNode.offsetHeight) {//判断距上位置
  173. menu_main.style.top = menu_main.style.top.split('px')[0] - menu_main.offsetHeight + 'px';//距上多少
  174. }
  175. (typeof callback === 'function') ? callback(data) : "";//webview传入回调函数
  176. }
  177. menu_main.style.display = 'block';//显示菜单
  178. document.onmouseup = null;//清空
  179. }
  180. };
  181. menu_main.onclick=createNode.onmousewheel=function () {//执行右键菜单隐藏
  182. for(var i=0;i<MouseMenuMain.length;i++){
  183. MouseMenuMain[i].style.display='none';//隐藏
  184. }
  185. (typeof callback ==='function')?callback(data):"";//webview传入回调函数
  186. };
  187. };//右键菜单函数
  188. US_Browser.MouseMenuCallBack=function (webview) {//右键菜单回调函数
  189. US_Browser.MouseMenuCallBack.GoBack=function () {//返回
  190. webview.goBack();
  191. };
  192. US_Browser.MouseMenuCallBack.canGoForward=function () {//前进
  193. webview.goForward();
  194. };
  195. US_Browser.MouseMenuCallBack.reload=function () {//刷新
  196. webview.reload();
  197. };
  198. US_Browser.MouseMenuCallBack.SourceCode = function () {//查看源代码
  199. US_Browser.CreatBrower("view-source:"+US_Browser.UrlArea.value);
  200. };
  201. US_Browser.MouseMenuCallBack.openDevToolsDown = function(){//打开开发者工具
  202. if(webview.isDevToolsOpened()){//判断是否存在
  203. webview.closeDevTools();//关闭开发者工具
  204. }
  205. webview.openDevTools();//打开开发者工具
  206. }
  207. };//网页右键菜单
  208. US_Browser.LocalStorage=function(webview){
  209. var time = (new Date()).valueOf();
  210. var today = new Date().toLocaleDateString();
  211. var datas={
  212. url:webview.src,
  213. title:webview.tag.data.name,
  214. favicons:webview.tag.data.favicons,
  215. data:new Date().toLocaleString()+' 星期'+'日一二三四五六'.charAt(new Date().getDay()),
  216. time:new Date().toLocaleTimeString(),
  217. key:time
  218. };
  219. if(localStorage[today]){
  220. var aa = JSON.parse(localStorage[today]);
  221. var bb = JSON.parse(JSON.stringify(datas));
  222. aa.push(bb);
  223. var Storage = JSON.stringify(aa);
  224. localStorage.removeItem(today);
  225. localStorage.setItem(today, Storage);
  226. }else{
  227. localStorage.setItem(today,[]);
  228. localStorage[today]="["+JSON.stringify(datas)+"]";
  229. }
  230. };//本地存储操作
  231. US_Browser.IconLock = function(){//判断是否为https
  232. var http = /^(http)/;//http
  233. var https = /^(https)/;//https
  234. if(US_Browser.UrlArea.value.search(https)!==-1){//判断搜索框是否有https
  235. $(".bowerSeach span")[0].style.color = '#035816';
  236. }else {
  237. $(".bowerSeach span")[0].style.color = '#d3d3d3';
  238. }
  239. };
  240. /*右侧菜单按钮函数*/
  241. US_Browser.about=function () {
  242. ipc.send('AboutUsW-show');
  243. };
  244. US_Browser.ShowHistory=function(){
  245. ipc.send('BrowserHistory-show');
  246. };
  247. US_Browser.Feedback=function(){
  248. ipc.send('BrowserFeedback-show');
  249. };
  250. US_Browser.ClearCache=function(){
  251. localStorage.clear();
  252. };
  253. US_Browser.Exit=function(){
  254. ipc.send('window-all-closed');
  255. };
  256. /*浏览器初始化*/
  257. US_Browser.IpcBind=function(){
  258. ipcRenderer.on('url', function(event, message){//接收用户指定的文件
  259. if(message){
  260. US_Browser.CreatBrower(message,true);//打开用户请求的页面
  261. }
  262. });
  263. ipcRenderer.on('open-history', function(event, message){//接收历史记录地址
  264. if(message){
  265. US_Browser.CreatBrower(message,true);//打开用户请求的页面
  266. }
  267. });
  268. ipcRenderer.on('download-progress',function (event,message) {
  269. console.log(message)
  270. })
  271. };//ipc通信绑定
  272. US_Browser.Bind=function(Webname){//绑定
  273. var http = /^(http)/;//http
  274. var https = /^(https)/;//https
  275. US_Browser.BrowerListBody = $(".BrowerListBody");
  276. US_Browser.BrowersTag=$(".BrowerList");//获取选项卡li
  277. US_Browser.BrowerContainer=$(".BrowerContainer");//获取webview
  278. var BrowerListBody = US_Browser.BrowerListBody[0].offsetWidth;//获取title的宽度
  279. for(var i=0;i<US_Browser.BrowersTag.length;i++){//对选项卡及webview进行操作
  280. (function (i) {
  281. US_Browser.BrowersTag[i].onclick=function () {
  282. for(var j=0;j<US_Browser.BrowersTag.length;j++){
  283. US_Browser.BrowersTag[j].className='BrowerList';
  284. US_Browser.BrowersTag[0].className='BrowerList Listindex';
  285. US_Browser.BrowerContainer[j].style.display='none';
  286. }
  287. US_Browser.BrowersTag[i].className+=' BrowerActive';
  288. US_Browser.BrowerContainer[i].style.display='block';
  289. US_Browser.UrlArea.value=this.data.url;
  290. webview = US_Browser.BrowerContainer[i].children[0];
  291. webview.addEventListener("dom-ready", function() {
  292. var canGoForward = $(".icon-right")[0];//获取前进图标
  293. var canGoBack = $(".icon-left")[0];//获取后退图标
  294. var reFresh = $(".refresh")[0];//获取刷新图标
  295. // webview.reloadIgnoringCache();
  296. if(webview.canGoBack()){//判断是否可以后退
  297. canGoBack.style.color = '#5a5a5a';
  298. }else{
  299. canGoBack.style.color = '#d3d3d3';
  300. }
  301. if(webview.canGoForward()){//判断是否可以前进
  302. canGoForward.style.color = '#5a5a5a';
  303. }else{
  304. canGoForward.style.color = '#d3d3d3';
  305. };
  306. if(US_Browser.UrlArea.value == ""){
  307. reFresh.style.color = '#d3d3d3';
  308. }else{
  309. reFresh.style.color = '#5a5a5a';
  310. }
  311. });
  312. US_Browser.UrlArea.onkeydown=function (e) {//获取搜索框值
  313. if(e.keyCode===13){
  314. if(this.value){
  315. if(this.value.match(http) || this.value.match(https)){//判断是否存在http或https
  316. webview.src=this.value;
  317. webview.tag.children[0].children[0].style.display = "block";
  318. }else {
  319. webview.src='http://'+this.value;
  320. webview.tag.children[0].children[0].style.display = "block";
  321. }
  322. }
  323. }
  324. };
  325. US_Browser.IconLock();//判断是否为https
  326. }
  327. })(i)
  328. if(BrowerListBody<40){
  329. Webname.style.display = "none";
  330. US_Browser.BrowerListBody[i].children[0].style.display = "none";
  331. }else{
  332. Webname.style.display = "block";
  333. }
  334. }
  335. };//事件绑定
  336. US_Browser.Init=function () {//初始化
  337. US_Browser.UrlArea=$(".bowerSeach input")[0];//获取搜索框
  338. US_Browser.NavContainer=$(".bowerCreaterWindow")[0];//获取标签页ul
  339. US_Browser.AddButton=$(".BrowwerAdd")[0];//获取新建标签页按钮
  340. US_Browser.BrowserHistory = $(".BrowserHistory")[0];
  341. US_Browser.BrowersMenuButtom=$("#bowerMenu")[0];//获取打开菜单
  342. US_Browser.MouseMenuMain=$("#CampusInfoBrowserMenu")[0];//获取右键菜单
  343. US_Browser.OnclickMenu=$("#CampusInfoBrowserOnclickMenu")[0];//获取菜单
  344. US_Browser.AddButton.onclick= function (){//点击新建标签页
  345. US_Browser.BrowersTag=$(".BrowerList");//获取选项卡li
  346. var LIwidth = ((US_Browser.NavContainer.offsetWidth - 120)/US_Browser.BrowersTag.length)-10;//得到每个li标签页宽度
  347. if(US_Browser.BrowersTag.length>=30){//如果如果li标签页大于35
  348. confirm("窗口太多,请关闭一些再使用");//弹出提示
  349. return false;
  350. }
  351. US_Browser.CreatBrower('');
  352. var canGoForward = $(".icon-right")[0];//获取前进图标
  353. var canGoBack = $(".icon-left")[0];//获取后退图标
  354. var reFresh = $(".refresh")[0];//获取刷新图标
  355. canGoBack.style.color = '#d3d3d3';
  356. canGoForward.style.color = '#d3d3d3';
  357. reFresh.style.color = '#d3d3d3';
  358. US_Browser.UrlArea.focus();
  359. if(US_Browser.UrlArea.value === ""){
  360. this.previousSibling.children[0].children[1].innerHTML = "新标签页";
  361. this.previousSibling.children[0].children[0].style.display = "none";
  362. }
  363. };
  364. US_Browser.BrowersMenuButtom.onmousedown=function (event) {//点击菜单
  365. US_Browser.MouseMenu(US_Browser.OnclickMenu,this,null,event,true);//右键显示创建应用菜单
  366. };
  367. window.onresize=function (e) {
  368. Array.prototype.forEach.call($("webview"), function (elm) {
  369. elm.style.width=elm.style.height='100%';//给webview设置100%宽高
  370. });
  371. };
  372. window.addEventListener('dragleave',function (e) {
  373. e.preventDefault();
  374. return false;
  375. });
  376. window.addEventListener('dragover',function (e) {
  377. e.preventDefault();
  378. return false;
  379. });
  380. window.addEventListener('dragenter',function (e) {
  381. e.preventDefault();
  382. return false;
  383. });
  384. window.addEventListener( "drop", function (e) {
  385. e.preventDefault();
  386. return false;
  387. }, false );
  388. var isBig=true;//窗口放大还原标示
  389. $(".close")[0].onclick=function(){//关闭窗口
  390. US_Browser.Exit();
  391. };
  392. $(".max")[0].onclick=function(){//最大化
  393. if(isBig){
  394. ipc.send('show-window');
  395. $(".max")[0].className='icon-window-restore max';
  396. $(".bowerCreaterWindow")[0].style.padding = "0";
  397. }else{
  398. ipc.send('orignal-window');
  399. $(".max")[0].className='icon-window-maximize max';
  400. $(".bowerCreaterWindow")[0].style.padding = "15px 0 0";
  401. }
  402. isBig=!isBig;
  403. };
  404. $(".min")[0].onclick=function(){//最小化
  405. ipc.send('hide-window');
  406. };
  407. US_Browser.CreatBrower('https://www.baidu.com');//开始进入一个页面
  408. US_Browser.IpcBind();
  409. }();