It is to do with with HTML/XHTML compatibility. Before HTML5 having unencoded ampersands in URLs and in some other contexts was invalid. From XHTML validator:
Entity references start with an ampersand (&) and end with a semicolon (;). If you want to use a literal ampersand in your document you must encode it as "&" (even inside URLs!). Be ...
I found the answer, thanks for the help @jamesgarrett
The tabs were using shuffle.js so I needed to edit the page builder js file.
var $container = $('.sp-simpleportfolio-items');
var $sizer = $container.find('.shuffle__sizer');
By "anchor and jquery" you mean like the way bootstrap tabs work - ie. by letting the uri's fragment hit the id of the tab. But these tabs aren't set up like that. You can of course use jquery to trigger a click on the tab you want (via the fragment if that is useful) but that will trigger the animation that goes along with it. If you don't care about that ...
With Joomla core you need to setup a menu structure that will correspond to what you want to achieve with your URLs. Menus are important in Joomla.
From the example of the URLs in your question - it seems like you have created a menu item for the article1.
If you want all articles of that category (cat1) to be reachable under the cat1/article1,art2,art3 ...
Don't use JUri for fetching local files. It returns the web address of your site. Fetching files over HTTP is extremely slow compared to fetching files locally. Use one of JPATH constants to get a local filesystem path, e.g.:
$json = JPATH_BASE . '/modules/mod_kou_stack_exchange/media/js/sites.json';
$json = file_get_contents($json);
Use the filepath:
JUri::base() . '/modules/mod_kou_stack_exchange/media/js/sites.json'
The filesystem equivalent of, eg. /public_html/yoursite/modules/... or /htdocs/yoursite/modules/... where Joomla is installed in yoursite directory.
What you should do is include &format=json in your URL. This tells Joomla that you want a JSON response rather than HTML, and it won't run (subsequently) your template to produce all your page HTML.
The usual approach is to call
in your controller code (ie in submit()). This will cause Joomla to look for a display() function in a ...
I managed to get this working by editing the (already existing Helix / Joomshaper) override.
After spending a (very!) long time trying to figure out where the /items url parameter was coming from, I gave up and modified the override.
I know this isn't a solution but it solves my problem, and possibly someone else that uses the Helix framework or a ...