Как установить значок / значок при перетаскивании букмарклета на панель инструментов? - PullRequest
107 голосов
/ 06 февраля 2009

Я сделал себе букмарклет, и он прекрасно работает, но при добавлении на панель инструментов в Opera или Firefox он просто берет значок закладки по умолчанию для браузера (глобус и звезда соответственно). У моего сайта есть значок, а в окне, на вкладке и даже в закладке [сайт] используется указанный мной значок. Просто не мой букмарклет.

Как мне кодировать свой сайт или букмарклет, чтобы букмарклет тоже получал значок?

Мне известны различные методы ручного взлома, которые пользователи могут использовать для установки фавиконов после факта, но это нежелательные решения.

Ответы [ 9 ]

22 голосов
/ 27 февраля 2009

Букмарклет использует схему javascript:// и, следовательно, не имеет домена, из которого может быть загружен значок.

Таким образом, в настоящее время у вас нет возможности предоставить значок для букмарклета. Подумайте об этом так: вспомните всю песочницу Javascript - где Javascript может не получить доступ к чему-либо за пределами домена веб-страницы, где он работает? Ну а букмарклет, который нужно привязать к тому или иному домену для текущей просматриваемой страницы, нельзя также привязать к фавикону на вашем собственном веб-сайте.

Обновление: согласно ответу Ханса Шмукера, есть возможность создать букмарклет, который при загрузке браузером в меню закладок будет генерировать HTML-документ, имеющий значок. Кажется, что рассуждения могут сработать, но мне еще предстоит увидеть что-то подобное в действии, и мои тесты вернулись к отрицательным результатам.

13 голосов
/ 05 ноября 2016

Вот как вы можете это сделать:

  1. Перетащите букмарклет на панель закладок.
  2. Рядом с ним создайте закладку сайта, который вы хотите использовать для своей закладки.
  3. Откройте Диспетчер закладок, нажмите «Организовать» и выберите «Экспорт», сохраните закладки в виде HTML-файла.
  4. Откройте этот HTML-файл в текстовом редакторе.
  5. Найдите закладку , которую вы только что создали, допустим, ее закладку Gmail, у вас должен быть html-код, который выглядит следующим образом:

<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>

  1. Скопировать весь тег ICON
  2. В том же файле найдите созданный вами букмарклет и вставьте скопированный тег ICON в тег bookmarklet :

<DT><A HREF="javascript:(function(){... bookmarklet JS code...})();" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABV0lEQVQ4jdWQzUoCYRiFnxl/0plso0IKX7mqXWCLIlq0qEW4d19Qi6BLCELwEgpvQbyAVrroCrSNUJFGAyrkEEEMNs5PCxtRHGsZneX7nedwzgd/LQngObfnykIQOj9Disd/BFxdZ3hVwtE0Mje3kuw9OJqGWSji1BtzYafeGHk0jTdzCIA8aXANA/O6hFWuzMBWuYJ5XcI1DF6MAY8fxmxAYHdnZK7WMAtFXF3H1XXMQhGrWsN2XR5WM/QGn2MmOBkQOj5CFoJhuTKe5DUzbJvW1jbWZhbqd/4BAIGDfSQhGH7XBehLMlruEGlFzEyTZy6AvL5G+PICWQja6iJaPu8L+zbw9B4MYpyeEB4MkF7782z+AZ1OD0WNkk4vA7AUi/HUav8eYNsOnW6XZCJBJLIwvieTcVQ1SrN5j2XbUwFTf9DpdkmnUlOwJ0VRyGY3UBVl7px/qi+cdYQvZvKCUwAAAABJRU5ErkJggg==">MyBookmarklet</A>

  1. Сохранить этот файл
  2. Вернитесь в Chrom Bookmarks Manager, снова нажмите «Организовать» и выберите «Импорт»
  3. Импорт HTML-файла, который вы только что отредактировали, в вашей закладке теперь есть значок .

По сути, процедура состоит в том, чтобы получить атрибут ICON тега bookmark и вставить его в тег bookmarklet

enter image description here

13 голосов
/ 25 марта 2011

Прочитав сайт 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

13 голосов
/ 17 июня 2010

Это не совсем верно: у букмарклета нет домена, но есть местоположение (которое является самим букмарклетом), и вы можете назначить ему иконку. После этого все зависит от того, как браузер сохраняет значки (Firefox постоянно сохраняет значок закладки, возможно, вам не так повезло с другими браузерами).

P.S. Безопасность даже не играет роли, значки могут прийти откуда угодно. Нет ограничений.

См. http://www.tapper -ware.net / blog /? P = 97

5 голосов
/ 13 августа 2012

Вот хорошая техника, которая почти делает то, что вы хотите.

Отлично работает на моем Mac✅, но я не могу заставить его работать на Windows 7⃣.⃣

Используйте «Emoji» ?. Это символы Юникода, которые также выглядят как красочные иконки. Вы можете выбирать только из предопределенного списка изображений, но на самом деле это неплохо - если все, что вы пытаетесь сделать, - это дать пользователю что-то посмотреть, чтобы напомнить ему о том, что делает букмарклет.

Например, я делаю несколько закладок «ключ безопасности». Поэтому я использую ? в названии моего букмарклета! ??

Итак, в основном вы видите изображение? на панели закладок ?

Используйте этот сайт, чтобы помочь вам найти Emoji, который подходит для вашей закладки: http://emojipedia.org/symbols/

3 голосов
/ 20 сентября 2015

На основании предложения Визека вы можете поместить свой код в data-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>...your html code here, including a javascript tag that will run when loaded...</html>", как предлагали другие решения. В этом случае HTML-код страницы, на которой вы находитесь , будет заменен HTML-кодом из букмарклета, но местоположение останется прежним , а сам букмарклет все еще не будет иметь местоположения поэтому Chrome не может сохранить для него значок.

Напротив, с закладкой data-uri мы переходим на другую страницу , у которой есть собственное местоположение, и браузер может сохранить для нее значок. Думайте об этом как о «размещении веб-сайта в вашем браузере», к которому вы сможете получить доступ на других компьютерах, если синхронизируете свои закладки. Вы также можете использовать изображение base64 для значка вместо URL, если хотите сохранить все локальным.

У него есть ограничения.

  • Когда вы щелкаете по ней, она покидает текущую страницу и загружает страницу в data . Поэтому вы не сможете использовать его для закладок, которые взаимодействуют с текущей страницей, только для кода, который вы можете выполнить на другой странице.

  • Не используйте // для комментариев. Поскольку все они будут сохранены в одну строку, оберните их в / ** / и не забудьте свои точки с запятой

  • В FF он сохранил значок, но я не смог настроить его всегда открывать всплывающие окна, если я хочу использовать window.open (), потому что он не позволяет мне сохранять поведение данных по умолчанию URLs


Как пример:

Используя эту технику, я создал небольшой Bookmarklet с Icon Generator. Вы можете скопировать это в адресную строку (или сохранить как закладку), чтобы использовать его

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 style='background: -webkit-linear-gradient(top, #f4f8f9 0%, #e0f8ff 95%);'>
    <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! </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(()=>{            &#13
    alert('hello world');   /*Use this format for comments*/ &#13
    window.history.back();  &#13
},200);
            </textarea></div>
  </div>
    <script type = "text/javascript">
        fav_href.onchange = ta.onchange = function(){
            bookmarkbutton.href = 'data:text/html;charset=utf-8,<html><head>'+
                '<link rel="shortcut icon" href="'+ fav_href.value +'">'+
                '<script type="text/javascript"> '+ ta.value +'<\/script>';
            };
        ta.onchange();
    </script>
</body>

Другой пример: Букмарклет для открытия мессенджера Facebook в его собственном маленьком окне (может не работать, если ваш браузер по умолчанию блокирует всплывающие окна)

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/, затем просто измените файл значков на то, что вам нужно. Недостатком этого является то, что расширения используют оперативную память (около 10 МБ для простых?), Если у вас много и мало оперативной памяти, это может не быть решением для вас. Кроме того, у вас не будет текста, как в закладке, только значок.

3 голосов
/ 11 мая 2012

Можно назначить и изменить значок избранного с помощью javascript и canvas (см. Удивительную игру favicon Защитник Фавикон ). Исходный код игры поможет вам в этом (в основном он основан на использовании функции toDataUrl () на холсте, как показано в строке 554 исходного кода).

// set favicon
if( !stupidBrowser && useIcon )
{
     var    icon=$('favicon');
     (newIcon = icon.cloneNode(true)).setAttribute('href',ctx.canvas.toDataURL());
     icon.parentNode.replaceChild(newIcon,icon);
}

Что происходит, когда букмарлет, устанавливающий этот значок, щелкается или сохраняется? Я не знаю, но было бы неплохо попробовать. Браузер может сохранить его?

1 голос
/ 28 ноября 2016

Итак, это еще не полное решение, но может быть шагом к рабочему направлению.

К моему удивлению,

data: кодирование иконки в html-кодировке data: -uri работает.

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">.

Для некоторых букмарклетов этого уже может быть более чем достаточно. Для других, которые хотели бы изменить текущую страницу или, по крайней мере, получить от нее какую-либо информацию перед открытием новой вкладки, пока не повезло Я обновлю этот ответ, если найду способ сделать это.

1 голос
/ 02 октября 2013

Я думаю, что возможный способ - использовать символ unicode в привязке букмарклета, как ваш значок:

http://unicode -table.com / о / # кириллица

просматривая все возможные символы, вы можете найти персонажа, который больше похож на значок, который вы хотите

...