将所有Javascript包括以前 </body>
-
16-10-2019 - |
题
任何人都不会知道如何有所有的Magento的JS脚本,例如标签 <script type="text/javascript" src="http://sitename.com/js/prototype/prototype.js"></script>
呈现出前关闭 </body>
?
我已经尝试过这一次,但我得到了一个错误我认为这是沿线的addJS方法不是提供我在哪里使用,在可能的参考脚注。
解决方案
这取决于您的要求。例如,最后,我被删除了所有原型脚本 Homepage
我没有遇到任何问题的Magento商店。但是正如我所说,这取决于您的主题,扩展等。
移动脚本:
在 page.xml
你的主题
<block type="core/text_list" name="before_body_end" as="before_body_end" translate="label">
并在以前插入以下内容:
<block type="page/html_head" name="jsfooter" as="jsfooter" template="page/html/jsfooter.phtml">
<action method="addJs"><script>your_script.js</script></action>
</block>
对于Magento 1.9,请使用以下方式:
<block type="page/html_head" name="jsfooter" as="jsfooter" template="page/html/jsfooter.phtml">
<action method="addItem"><type>skin_js</type><name>js/yourskinfile.js</name><params/></action>
</block>
在app/design/frontend/[package]/[theme]/template/page/html/jsfooter.phtml中创建模板文件
<?php echo $this->getCssJsHtml() ?>
关闭之前,请在模板中添加下面 </body>
标签。
<?php echo $this->getChildHtml('jsfooter') ?>
其他提示
移动标签有两个问题。最大的问题是,出于某种原因,Magento注入了许多依赖原型的JS <body/>
标签。将脚本移至文档的末尾(尽管适用于加载时间),但会打破Magento中的许多页面。
另一个问题实际上是这样做。似乎没有 <move />
标签或类似功能。我为创建的自定义脚本所做的就是添加这样的脚本。它更多余,但有效:
<block type="page/html_head" name="foot.scripts" template="page/template/foot-scripts.phtml">
<action method="addJs"><script>jmax/global-min.js</script></action>
</block>
在Magento 1.x中,这是一个傻瓜的事。在Magento中的整个模板文件中乱扔了太多的内联脚本,如果您将Core JS文件转移到 <head>
. 。在Magento 2中,这种情况可能会发生变化,但是随着Magento从原型迁移而跨越原型和JQuery。
对于其他脚本,您应该将它们放在 </body>
元素。我发现忽略Magento的 <action method="addJS|addItem">
XML并简单地为每个脚本创建一个新的模板文件,其中包括一个普通的HTML脚本参考,例如:
<script src="<?php echo $this->getSkinUrl('js/hobbiton.js'); ?>"></script>
然后,您可以在任何地方嵌入此模板文件(并且在控制订单之前/之后仍在使用)这样的文件:
<block type="core/template name="jquery.hobbiton" after="-" template="custom/jquery/hobbiton.phtml" />
移动外部JavaScript到底是不够的,在大多数情况下。如果你使用任何模板与联JavaScript,就像默认的主题,将需要推迟执行这些直到所有依赖性(prototype.js,varien.js,...)都载入。
一个方法是,提取的所有内嵌的 <script>
元素从呈现的街区使用一个观察员 http_response_send_before
并将它们移动到结束的权利之后的外部脚本。而你在这,你可以将所有剧本的元素,不仅内联。这样可以节省你的麻烦移动它们通过的布局模式,这是明显不是旨在通过Magento.
汤姆罗伯特肖创建了一个扩展,不正是这一点,与一个单一的观察员,改变了响应HTML using regular expressions:https://github.com/bobbyshaw/magento-footer-js
他使用 core_block_abstract_to_html_after
事件,但只有采取行动如果目前的块根块。这意味着,观察员被称为更频繁,但它应利用框缓存在一定程度上。
我强烈建议使用MediaRox PagesPeed模块来帮助您优化JavaScript(和CSS)并改进Google PagesPagesPeed Insight排名。
它通过通过Magento解析HTML输出来进行起作用,然后在代码上执行剪切和粘贴操作,以将JavaScript移至HTML代码的底部。该过程很快,但最好与整页缓存结合使用以缓存HTML更改。
有关该模块如何工作的更多信息,并可以帮助您在此处提高PagesPeed等级:
http://blog.gaiterjones.com/magento-google-pages-pages-pages-jscsshtmlminify-optimisation/
对于Magento v1.6+(需要在较旧版本中进行测试);
1-在 page/html/footer/extras.phtml
使用此内容:
<?php echo $this->getCssJsHtml() ?>
2-将此HTML节点添加到您的布局XML:
<reference name="before_body_end">
<block type="page/html_head" name="extra_js" as="extraJs" after="-" template="page/html/footer/extras.phtml">
<action method="addItem"><type>skin_js</type><name>js/jquery.min.js</name></action>
</block>
3-就是这样!
由于此其他脚本的问题(在product/list.phtml中) <script type="text/javascript"> decorateList('category-list', 'none-recursive') </script>
我必须在页面末端移动一些JS。
我无法制作上述工作的工作,因此我找到了另一种实现方法:
我覆盖了 Mage/page/Block/Html/Footer.php controller
通过在相同的路径中重新创建它 app/local folder
.
如果不存在,这是要创建的完整途径:
app/local/Mage/page/Block/Html/Footer.php
在此文件中,我添加了head.php的函数,可以在Magento Core(即Mage/Page/Block/Block/HTML/Head.php)的同一文件夹中找到。
您需要使其有效的功能是(显然是完整的功能,在这里我只是指出要保持简洁的名称):
public function addItem($type, $name, $params=null, $if=null, $cond=null)
{...}
public function addJs($name, $params = "")
{...}
public function getCssJsHtml()
{...}
protected function &_prepareStaticAndSkinElements($format, array $staticItems, array $skinItems, $mergeCallback = null)
{...}
protected function _separateOtherHtmlHeadElements(&$lines, $itemIf, $itemType, $itemParams, $itemName, $itemThe)
{...}
protected function _prepareOtherHtmlHeadElements($items)
{...}
然后,我添加到我的自定义(主题中的一个)页面/html/footer.phtml呼叫:
<?php echo $this->getCssJsHtml() ?>
最后,我现在可以通过在任何布局中添加JS
<action method="addJs"><script>yourscript.js</script></action>