触发:在Electron中浏览时访问状态(使链接变为紫色)

时间:2017-06-23 11:50:05

标签: javascript electron browser-history muon

在我的Electron应用程序中,我有一个webview。如果我点击链接(例如在Google上),然后向后移动,则链接不会变为紫色,就像在普通浏览器中一样。

我可以在Electron中激活此行为吗?或者以编程方式进行,如果我自己存储浏览历史记录?

我想这是history support in Electron还不是最好的?

使用电子的Muon分叉可能有可能吗?

1 个答案:

答案 0 :(得分:2)

正如您在this file第16行的评论中所看到的那样,电子人/女孩已经创建了自己的导航解决方案。这似乎无法正确处理a:visited

相反,我们可以轻松创建自己的解决方案。将以下函数添加到所有渲染器脚本中,并确保将simuHistory();放在每个页面的开头:

function simuHistory() {
    var localstorageSimuHistory = localStorage.getItem('simuHistory');
    var simuHistory = localstorageSimuHistory ? JSON.parse(localstorageSimuHistory) : [];
    var found = false;
    var windowHref = window.location.href;
    for(let i=0;i<simuHistory.length;i++) {
        if(simuHistory[i] == windowHref) {
            found = true;
            break;
        }
    }
    if(found === false) {
        simuHistory[simuHistory.length] = windowHref;
        localStorage.setItem('simuHistory', JSON.stringify(simuHistory));
    }
    var elements = document.getElementsByTagName('a');
    for(let i=0;i<elements.length;i++) {
        for(let h=0;h<simuHistory.length;h++) {
            if(elements[i].href == simuHistory[h]) {
                elements[i].className += ' visited';
            }
        }
    }
}

并将以下CSS添加到样式表中:

.visited {
    color: purple;
}

或者,如果您不想包含CSS(或希望它包含所有内容),您可以替换此行:

elements[i].className += ' visited';

......用这一行:

elements[i].style.color = 'purple';

可扩展性

TL; DR就是这样,除非您的应用中有超过25,000个相当长的唯一网址,否则您无需担心可扩展性。

访问过的网址存储在localStorage中。这是有限的,因此我们可以存储的URL数量有限。我相信Electron这个限制在5MB左右。我使用以下代码通过向simuHistory数组添加25,000个其他URL来测试性能:

for(var i=0;i<25000;i++) {
    simuHistory[simuHistory.length] = 'https://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-a-url-in-different-browsers' + Math.floor((Math.random() * 1000000) + 1);
}

选择网址是因为它相当长。最后的随机数实际上根本没有影响;我只是加入它来增加一些额外的长度。然后我在我糟糕的笔记本电脑(没有SSD)上运行simuHistory()

25,000 URLs == ~210ms
 1,000 URLs == ~13ms

在我看来,几乎所有Electron应用程序的速度都很快,但这取决于你的用例,你可能会得到多少个URL。