我自己制作了一个书签工具(bookmarklet),它的功能正常,但是当在Opera或Firefox中添加到工具栏时,它只使用浏览器的默认书签图标(分别为地球仪和星星)。我的网站有一个favicon,窗口、选项卡甚至是[网站]书签都使用了我指定的favicon,但我的书签工具没有使用。
如何编写我的网站或书签工具,以便书签工具也能获得favicon?
我知道用户可以使用各种手动hack技术来在事后设置favicon,但这些解决方案并不理想。
我自己制作了一个书签工具(bookmarklet),它的功能正常,但是当在Opera或Firefox中添加到工具栏时,它只使用浏览器的默认书签图标(分别为地球仪和星星)。我的网站有一个favicon,窗口、选项卡甚至是[网站]书签都使用了我指定的favicon,但我的书签工具没有使用。
如何编写我的网站或书签工具,以便书签工具也能获得favicon?
我知道用户可以使用各种手动hack技术来在事后设置favicon,但这些解决方案并不理想。
以下是您如何完成此操作的步骤:
<DT><A HREF="http://mail.google.com/mail/u/0/#inbox" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABV0lEQVQ4jdWQzUoCYRiFnxl/0plso0IKX7mqXWCLIlq0qEW4d19Qi6BLCELwEgpvQbyAVrroCrSNUJFGAyrkEEEMNs5PCxtRHGsZneX7nedwzgd/LQngObfnykIQOj9Disd/BFxdZ3hVwtE0Mje3kuw9OJqGWSji1BtzYafeGHk0jTdzCIA8aXANA/O6hFWuzMBWuYJ5XcI1DF6MAY8fxmxAYHdnZK7WMAtFXF3H1XXMQhGrWsN2XR5WM/QGn2MmOBkQOj5CFoJhuTKe5DUzbJvW1jbWZhbqd/4BAIGDfSQhGH7XBehLMlruEGlFzEyTZy6AvL5G+PICWQja6iJaPu8L+zbw9B4MYpyeEB4MkF7782z+AZ1OD0WNkk4vA7AUi/HUav8eYNsOnW6XZCJBJLIwvieTcVQ1SrN5j2XbUwFTf9DpdkmnUlOwJ0VRyGY3UBVl7px/qi+cdYQvZvKCUwAAAABJRU5ErkJggg==">Gmail</A>
<DT><A HREF="javascript:(function(){...书签脚本代码...})();" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABV0lEQVQ4jdWQzUoCYRiFnxl/0plso0IKX7mqXWCLIlq0qEW4d19Qi6BLCELwEgpvQbyAVrroCrSNUJFGAyrkEEEMNs5PCxtRHGsZneX7nedwzgd/LQngObfnykIQOj9Disd/BFxdZ3hVwtE0Mje3kuw9OJqGWSji1BtzYafeGHk0jTdzCIA8aXANA/O6hFWuzMBWuYJ5XcI1DF6MAY8fxmxAYHdnZK7WMAtFXF3H1XXMQhGrWsN2XR5WM/QGn2MmOBkQOj5CFoJhuTKe5DUzbJvW1jbWZhbqd/4BAIGDfSQhGH7XBehLMlruEGlFzEyTZy6AvL5G+PICWQja6iJaPu8L+zbw9B4MYpyeEB4MkF7782z+AZ1OD0WNkk4vA7AUi/HUav8eYNsOnW6XZCJBJLIwvieTcVQ1SrN5j2XbUwFTf9DpdkmnUlOwJ0VRyGY3UBVl7px/qi+cdYQvZvKCUwAAAABJRU5ErkJggg==">我的书签脚本</A>
基本上的步骤是获取 书签 标签的 ICON 属性并将其插入到 书签脚本 标签中。
一个书签脚本使用 javascript://
模式,因此没有域名可以加载网站图标。
所以,目前你无法为一个书签脚本提供网站图标。可以这么想:记得整个 JavaScript 沙箱的事情吗——JavaScript 可以访问正在运行的网页域外的任何内容吗?那么需要绑定到当前观看的页面所在域名的书签脚本,不能也绑定到你自己网站的网站图标上。
更新:根据 Hans Schmucker 的答案,有可能创建一个书签脚本,在浏览器加载到书签菜单时会生成一个具有网站图标的 HTML 文档。这种想法似乎可行,但我还没有看到类似的实际操作,并且我的测试结果是负面的。
domain
(例如 http-scheme)不是导致无图标书签的原因。您可以打开一个本地 HTML 文件(即 file-scheme),该文件为 favicon 提供了浏览器可读的源,然后它将出现为书签的图标。但是,对于大多数书签,这个 离线持久化的图像 通常必须手动配置。这取决于它们的来源。 - hc_dev在阅读tapper[ware]和Restafarian网站后,我想到了最简单的解决方案:
<a href="javascript:
var title = window.location.href;
if (title.indexOf('http://yourwebsite/bookmarklet/') == 0) {
'<head><link rel=\'shortcut icon\' href=\'favicon.ico\'></head>Bookmarklet';
} else {
(function(){document.body.appendChild(document.createElement('script')).src='http://yourwebsite/bookmarklet.js';})();
}">Click Me!</a>
在 Chrome 和 FF 中表现良好,但只有 FF4 能够将图标保存到书签栏中。下面是它的样子:http://cl.ly/5WNR
这并不完全正确:一个书签小程序没有域名,但它有一个位置(即书签小程序本身),你可以为它指定一个图标。之后浏览器保存图标的方式取决于具体浏览器的实现 (Firefox会永久保存书签的图标,其他浏览器可能就没那么走运了)。
另外,安全性并不是问题,图标可以来自任何地方,没有限制。
根据Wizek的建议,您可以将代码放入数据URI中。
data:text/html;charset=utf-8,
<html>
<link rel="shortcut icon" href="https://stackoverflow.com/favicon.ico">
<script type="text/javascript">
alert('It works!')
</script></html>
将所有内容保存为书签。(试一下!将代码拖到您的选项卡栏中)
不幸的是,它仅适用于某些情况(见下文)。
它是如何工作的:
(至少在Chrome中)它类似于使用格式javascript:“<html>……您的HTML代码,包括在加载时运行的javascript标记……</ html>”
的书签。在这种情况下,您所在页面的HTML 将被替换为书签中的HTML,但位置保持不变,并且书签本身仍没有位置,因此Chrome无法为其保存favicon。
相比之下,使用数据URI书签,我们转到其他页面,它有自己的位置,并且浏览器可以为其保存favicon。可以将其视为“在浏览器中托管网站”,如果同步书签,则可以在其他计算机上访问它。如果要将所有内容保留在本地,则还可以使用base64图像作为favicon。
它有限制。
当您单击它时,它会离开当前页面并在数据中加载页面。因此,您将无法将其用于与当前页面交互的书签,仅适用于可以在不同页面中执行的代码。
不要使用//进行注释。由于所有内容都将保存在一行中,请将其包裹在/**/中,并不要忘记分号
在FF中,它保存了favicon,但我无法设置它始终打开弹出窗口,如果我想使用window.open(),因为它不允许我为数据URL保存默认行为。
例如:
使用此技术,我创建了一个小型带有图标生成器的书签。您可以将此代码拖到您的URL栏中(或将其保存为书签)以使用它。它是一个简单的页面,具有用于代码和图标的输入区域,然后生成带有图标的书签。
data:text/html;charset=utf-8,<html><head>
<title>Bookmarklet With Icon Generator</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" ></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" >
<link rel="shortcut icon" href="https://www.freefavicon.com/freefavicons/objects/plain-thumbs-up-152-237293.png">
</head>
<body>
<div class="container">
<div class="page-header">
<h2>Write your javascript and specify a favicon, then drag the button to your bookmarks bar</div>
</h2>
<a id="bookmarkbutton" href='' ondragend='this.click()' draggable="true" class="btn btn-primary btn-lg" role="button">
Drag me to your bookmarks bar! </a><br /><br />
<div>
<label for="fav_href">Favicon:</label>
<input id="fav_href" value='https://stackoverflow.com/favicon.ico' style='width:100%'></input> </div><br />
<div>
<label for='ta'>Write your JavaScript below</label>
<textarea id="ta" style="width:100%;height:50%">
setTimeout(()=>{ &%2313
alert('hello world'); /*Use this format for comments, use %2523 instead of hash (number sign)*/ &%2313
window.history.back(); &%2313
},200);
</textarea></div>
</div>
<script type = "text/javascript"></script>
</body>
data:text/html;charset=utf-8,
<html>
<link rel="shortcut icon" href="https://facebook.com/images/messengerdotcom/favicon/favicon.ico">
<script type="text/javascript">
url = 'https://www.messenger.com/';
w = 740; h = 700;
x = parseInt( screen.availWidth/2 - w/2 );
y = parseInt( screen.availHeight/2 - h/2 );
nw = window.open(url,'', 'width='+ w +',height='+ h +',top='+ y +',left='+ x);
nw.focus();
setTimeout(()=>{
window.history.back();
window.close();
},200);
</script>
其他获取Chrome书签图标的解决方案:
导出书签栏,进行编辑,然后再次导入,如此描述的答案https://superuser.com/questions/212722/how-can-i-add-a-favicon-to-a-bookmarklet-in-google-chrome
将书签转换为扩展程序。它不再是书签,但具有相同的功能。这里有一个简单的网站可以帮助你实现:http://sandbox.self.li/bookmarklet-to-extension/,然后只需更改所需的图标文件即可。缺点是扩展程序占用内存(对于简单的扩展程序大约为10mb),如果你有很多扩展程序和较少的内存,则可能不适合你。此外,您将没有像书签中那样的文本,只有图标。
// set favicon
if( !stupidBrowser && useIcon )
{
var icon=$('favicon');
(newIcon = icon.cloneNode(true)).setAttribute('href',ctx.canvas.toDataURL());
icon.parentNode.replaceChild(newIcon,icon);
}
所以,这还不是完整的解决方案,但可能是朝着工作方向迈出的一步。
data:
在 data:
-uri 编码的 HTML 中编码图标,让我感到惊讶,它能够正常工作。
data:text/html;charset=utf-8, <title>Separator Tab</title><link rel="shortcut icon" href="data:image/png;base64,AAABAAEAEBAAAAEAIAAoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/5aWlv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP+Wlpb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/lpaW/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/5aWlv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP+Wlpb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/lpaW/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/5aWlv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP+Wlpb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/lpaW/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/5aWlv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP+Wlpb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/lpaW/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/5aWlv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWlpb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /> Separator Tab
由于这是<html>
,我们也可以在其中运行<script type="javascript">
。
对于一些书签脚本来说,这可能已经足够了。但对于其他想要修改当前页面或至少在打开新标签页之前获取一些信息的脚本来说,目前还没有办法。如果我找到了方法,我会更新这个答案。
我认为一种可能的方式是在书签脚本锚点中使用Unicode字符,就像您的图标一样:
http://unicode-table.com/en/#cyrillic
筛选所有可能的符号,您可以找到与您想要的图标更相似的字符。