Разный favicon.ico для разных страниц

Есть задача сделать разный значек сайта для разных страниц приложения (конкретно для страницы входа)

Не нашел нигде как можно манипулировать этим файлом (favicon.ico)
Подскажите пожалуйста способ, как это можно сделать.

Здравствуйте,

Для решения данной проблемы можно добавить JavaScript, который будет менять значок в нужный момент.

Для этого нужно написать JavaScript расширение (Vaadin документация):

package com.company.changefavicon.web.extension;

import com.vaadin.annotations.JavaScript;
import com.vaadin.server.AbstractJavaScriptExtension;
import com.vaadin.ui.AbstractOrderedLayout;

@JavaScript("change-favicon.js")
public class ChangeFaviconExtension extends AbstractJavaScriptExtension {

    public void extend(AbstractOrderedLayout layout, String href) {
        super.extend(layout);

        callFunction("changeFavicon", href);
    }
}

И добавить JavaScript, который меняет favicon, например:

change-favicon.js

window.com_company_changefavicon_web_extension_ChangeFaviconExtension = function() {
    var self = this;

    self.changeFavicon = function (href) {
        var links = document.querySelectorAll("link[rel*='icon']");
        for (var i = 0; i < links.length; i++) {
            links[i].href = href;
        }
    }
}

Далее в экранах можно добавлять расширение с нужной ссылкой на favicon. Пример для логин экрана:

@Inject
private VBoxLayout loginWrapper;

@Subscribe
private void onInit(InitEvent event) {
    ChangeFaviconExtension extension = new ChangeFaviconExtension();
    extension.extend(loginWrapper.unwrap(AbstractOrderedLayout.class),
            "./VAADIN/themes/hover/myfavicon/favicon.ico");
}

Полный пример можно найти здесь: change-favicon-dynamically.

4 симпатии

способ отлично сработал, спасибо

Подскажите, пожалуйста, но если мне надо иконки и изображения надо подгрузить из файлового хранилища, то как будет выглядеть

‘’‘extension.extend(loginWrapper.unwrap(AbstractOrderedLayout.class), “./VAADIN/themes/hover/myfavicon/favicon.ico”);’’’

если я должен передать не относительный путь, а FileDescriptor в метод?

Добрый день!

Что-то похожее реализовано здесь: Как пробросить до UI URL к изображению, хранящемуся в FileStorage? - #2 - Вопросы и проблемы - Jmix

Только для CUBA нужно использовать FileDescriptorResource вместо FileStorageResource.