I am using a free extension for defer javascript Magento 2 Defer Parsing of JavaScript, which is working fine.
But when I am adding Miscellaneous Scripts in magento admin from head section which is also showing in footer but I want this script in head tag.
So how can I exclude head Miscellaneous Scripts from deferred?
I am using magento 2.3.0
Below code is used in this extension:
etc/frontend/events.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="controller_front_send_response_before">
<observer name="meetanshi_deferjs" instance="Meetanshi\DeferJS\Model\Observer" shared="false" />
</event>
</config>
Helper/Data.php
<?php
namespace Meetanshi\DeferJS\Helper;
use Magento\Framework\App\Helper\AbstractHelper;
use Magento\Framework\App\Helper\Context;
use Magento\Store\Model\ScopeInterface;
class Data extends AbstractHelper
{
public function __construct(Context $context)
{
$this->scopeConfig = $context->getScopeConfig();
parent::__construct($context);
}
public function isEnabled()
{
$active = $this->scopeConfig->getValue('deferjs/general/active', ScopeInterface::SCOPE_STORE);
if ($active) {
return true;
}
return false;
}
}
Model/Observer.php
<?php
namespace Meetanshi\DeferJS\Model;
use Magento\Framework\Event\ObserverInterface;
use Meetanshi\DeferJS\Helper\Data;
class Observer implements ObserverInterface
{
protected $_helper;
public function __construct(
Data $helper
)
{
$this->_helper = $helper;
}
public function execute(\Magento\Framework\Event\Observer $observer)
{
if (!$this->_helper->isEnabled())
return;
$response = $observer->getEvent()->getData('response');
if (!$response)
return;
$html = $response->getBody();
if ($html == '')
return;
$conditionalJsPattern = '@(?:<script type="text/javascript"|<script)(.*)</script>@msU';
preg_match_all($conditionalJsPattern, $html, $_matches);
$_js_if = implode('', $_matches[0]);
$html = preg_replace($conditionalJsPattern, '', $html);
$html .= $_js_if;
$response->setBody($html);
}
}