Adding active class to globally cached navigation
Yes, you can!

The first thing you need to do is to add the entire cached content into a single variable:

{% set navigation %}
    {% cache globally for 3 years %}
        {# YOUR CACHED CONTENT #}
    {% endcache %}
{% endset %}


Then you need to add some dummy placeholder tags on your &lt;li&gt; tag and your &lt;a&gt; tag which then can be used by |replace filter to make the replacement.

For &lt;li&gt;

&lt;li class="{{ entry.hasDescendants() ? 'has-dropdown' : "" }} data-class-{{entry.slug}}"&gt;


For &lt;a&gt; (You need to modify this for each different entry type)

&lt;a href="{{ entry.url}}" data-url="{{ entry.url }}"&gt;{{ entry.title }}&lt;/a&gt;


After all this you'll have special "tags" in your cached content that you can run some replacement on, like this:

{{ navigation|replace({('data-url="' ~ craft.request.getUrl() ~ '"'): 'class="active"'})|replace({('data-class-' ~ craft.request.segment(1)): 'active'})|raw }}


You can run two |replace filters after each other, you could just split them up into two steps. Also, this code is untested - I just wrote it from my head so please be aware there might be some typos etc..