Google Maps v3 - prevent API from loading Roboto font

后端 未结 3 1761
忘掉有多难
忘掉有多难 2020-12-01 02:41

Google adds styles to the maps container that override my styles.
I know how to fix this. But the API (v3.8/9/exp) also loads the webfont \"Roboto\" which I don\'t reall

相关标签:
3条回答
  • 2020-12-01 03:28

    UPDATE 10/2017

    Google changed the approach of how they inject the styles on the page. Currently they inserting an empty style element and then changing the contents of this style element with Robot font. Here is a new solution:

    // Preventing the Google Maps libary from downloading an extra font
    (function() {
        var isRobotoStyle = function (element) {
    
            // roboto font download
            if (element.href
                && element.href.indexOf('https://fonts.googleapis.com/css?family=Roboto') === 0) {
                return true;
            }
            // roboto style elements
            if (element.tagName.toLowerCase() === 'style'
                && element.styleSheet
                && element.styleSheet.cssText
                && element.styleSheet.cssText.replace('\r\n', '').indexOf('.gm-style') === 0) {
                element.styleSheet.cssText = '';
                return true;
            }
            // roboto style elements for other browsers
            if (element.tagName.toLowerCase() === 'style'
                && element.innerHTML
                && element.innerHTML.replace('\r\n', '').indexOf('.gm-style') === 0) {
                element.innerHTML = '';
                return true;
            }
            // when google tries to add empty style
            if (element.tagName.toLowerCase() === 'style'
                && !element.styleSheet && !element.innerHTML) {
                return true;
            }
    
            return false;
        }
    
        // we override these methods only for one particular head element
        // default methods for other elements are not affected
        var head = $('head')[0];
    
        var insertBefore = head.insertBefore;
        head.insertBefore = function (newElement, referenceElement) {
            if (!isRobotoStyle(newElement)) {
                insertBefore.call(head, newElement, referenceElement);
            }
        };
    
        var appendChild = head.appendChild;
        head.appendChild = function (textNode) {
            if (!isRobotoStyle($(textNode)[0])) {
                appendChild.call(head, textNode);
            }
        };
    })();
    

    ORIGINAL ANSWER

    Thanks to coma for the solution! I also decided to intercept styles which override the font-family, font-size and font-weight. The complete solution for modern browsers and IE8+:

    // Preventing the Google Maps libary from downloading an extra font
    var head = $('head')[0];
    var insertBefore = head.insertBefore;
    head.insertBefore = function (newElement, referenceElement) {
        // intercept font download
        if (newElement.href
            && newElement.href.indexOf('https://fonts.googleapis.com/css?family=Roboto') === 0) {
            return;
        }
        // intercept style elements for IEs
        if (newElement.tagName.toLowerCase() === 'style'
            && newElement.styleSheet
            && newElement.styleSheet.cssText
            && newElement.styleSheet.cssText.replace('\r\n', '').indexOf('.gm-style') === 0) {
            return;
        }
        // intercept style elements for other browsers
        if (newElement.tagName.toLowerCase() === 'style'
            && newElement.innerHTML
            && newElement.innerHTML.replace('\r\n', '').indexOf('.gm-style') === 0) {
            return;
        }
        insertBefore.call(head, newElement, referenceElement);
    };
    
    0 讨论(0)
  • 2020-12-01 03:34

    You can replace the insertBefore method before the Google script invokes it:

    http://jsfiddle.net/coma/7st6d9p2/

    var head = document.getElementsByTagName('head')[0];
    
    // Save the original method
    var insertBefore = head.insertBefore;
    
    // Replace it!
    head.insertBefore = function (newElement, referenceElement) {
    
        if (newElement.href && newElement.href.indexOf('//fonts.googleapis.com/css?family=Roboto') > -1) {
    
            console.info('Prevented Roboto from loading!');
            return;
        }
    
        insertBefore.call(head, newElement, referenceElement);
    };
    
    // Check it!
    new google.maps.Map(document.getElementById('map'), {
        center           : new google.maps.LatLng(51.508742,-0.120850),
        zoom             : 16,
        mapTypeId        : google.maps.MapTypeId.ROADMAP,
        streetViewControl: false,
        zoomControl      : false,
        panControl       : false,
        mapTypeControl   : false
    });
    
    0 讨论(0)
  • 2020-12-01 03:36

    I found above solution to prevent websites with Google Maps from loading Roboto.

    If you - like I do - use Wordpress, there might be other plugins referring to Google Fonts.

    However, I struggled on some of my websites with the above code, since parts of it (1) affected also other styles to load, (2) "killed" styles, which intentionally not only contained gm-style, but other styles as well and (3) not affected other Google Fonts to load, where one or another plugin added links to fonts.googleapis.com by DOM-manipulation as well.

    The below worked for me. It simply prevents other scripts from adding any tag having https://fonts.googleapis.com in it's href-attribute.

    (function($) {
    var isGoogleFont = function (element) {
        // google font download
        if (element.href
            && element.href.indexOf('https://fonts.googleapis.com') === 0) {
            return true;
        }       
        return false;
    }
    
    // we override these methods only for one particular head element
    // default methods for other elements are not affected
    var head = $('head')[0];
    
    var insertBefore = head.insertBefore;
    head.insertBefore = function (newElement, referenceElement) {
        if (!isGoogleFont(newElement)) {
            insertBefore.call(head, newElement, referenceElement);
        }
    };
    
    var appendChild = head.appendChild;
    head.appendChild = function (textNode) {
        if (!isGoogleFont($(textNode)[0])) {
            appendChild.call(head, textNode);
        }
    };
    })(jQuery);
    
    0 讨论(0)
提交回复
热议问题