I don’t believe a button for “Show results” is necessary IF:
You show the selected filter options on the results page or panel, preferably at the top, and if possible, show a total that says something like “total results (filtered)” besides the selected filtered options. And I think this is a good idea even with a “Show results” button.
The example of my fonts.com provided by the other answer here is a good example of what I’m talking about (cf. the blue bubbles that say “number of styles 1-105”, etc). This makes it very clear that results are being shown, and exactly which filters are added when, in response to user interaction.
However, these indicators should also be coupled with a numeric indicator of the (filtered) total, which would make it exceptionally clear to users of all levels and forms of accessibility that the results have in fact changed, and by what magnitude. Such a declaration can be read by screen readers, for example. (e.g. “103 filtered results. Filtered by size, where size is one to one hundred, filtered by weight, where weight is bold”).
A loading graphic + text between the filtered states can also help. If not on the whole page or results area, perhaps because it loads too quickly, you can at least make an obvious loading state or entry animation for the filter indicators themselves on the results page. For example, when a filter is changed, added, or removed, animate the updating/entry/exit of the element (the blue bubble in the myfonts.com example), making it “pop” or “slide” or appear after a spinner runs for a second in its place before showing it. It’s all about feedback.
One other thing in the myfonts.com example that is useful in conjunction with the above is changing the style of the selected filters on the filter panel itself—notice how the selected filters shown on the results panel in the blue bubbles are shown in the filters panel with blue check marks, with a kind of “active” state style. The stylistic coordination and highlighting of the selected filters works well.
I think all of these things together definitely make up for any lost usability.
As far as not having JavaScript enabled, it depends on how you’re doing everything else. If you have a fallback mode where users without JavaScript enabled can still send a POST request to the server and get back a new page, then in that mode, where you detect whether users have JavaScript enabled or not, just show button for “show results” to submit the form. If they do have JavaScript enabled, then you can hide the button and include the UX features I recommended above.
Edit: I’m new to posting here, but I’ve been doing this professionally for 25 years.