有谁知道如何使Magento的所有JS脚本标签(例如<script type="text/javascript" src="http://sitename.com/js/prototype/prototype.js"></script>
在结束前渲染)</body>
?
我曾经尝试过这种方法,但是我得到了一个错误,我认为这是沿着addJS方法使用的,在我使用它的地方(可能在参考页脚中)不可用。
有谁知道如何使Magento的所有JS脚本标签(例如<script type="text/javascript" src="http://sitename.com/js/prototype/prototype.js"></script>
在结束前渲染)</body>
?
我曾经尝试过这种方法,但是我得到了一个错误,我认为这是沿着addJS方法使用的,在我使用它的地方(可能在参考页脚中)不可用。
Answers:
这取决于您的要求。例如,最后,我从Homepage
Magento商店中删除了所有Prototype脚本,但我没有遇到任何问题。但是正如我所说,这取决于您的主题,扩展名等。
要移动脚本:
在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') ?>
core/text_list
有addJs()
办法吗?
移动标签有两个问题。最大的问题是,由于某种原因,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中,这是傻瓜的事。如果您从中重新放置了核心JS文件,那么Magento中遍布模板文件的内联脚本根本就太多了,它们会中断<head>
。在Magento 2中,这种情况可能会改变,但是随着Magento从Prototype迁移而来,它跨越了Prototype和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想要的。
汤姆·罗伯肖(Tom Robertshaw)创建了一个完全做到这一点的扩展,使用一个观察者使用正则表达式更改响应HTML:https : //github.com/bobbyshaw/magento-footer-js
他使用core_block_abstract_to_html_after
事件,但仅在当前块是根块时才采取措施。这意味着观察者的调用频率更高,但是它应该在某种程度上利用块缓存。
</body>
标记之前的底部。
我强烈推荐mediarox pagespeed模块,以帮助您优化javascript(和css)并改善google pagespeed洞察力排名。
它的工作原理是解析Magento的html输出,然后对代码执行剪切和粘贴操作,以将javascript移至html代码的底部。该过程速度很快,但最好与整个页面缓存结合使用,以缓存html更改。
有关此模块如何工作的更多信息,并可以在此处帮助您提高页面速度排名:
http://blog.gaiterjones.com/magento-google-pagespeed-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核心的同一文件夹中找到(即Mage / page / 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)
{...}
然后,我将其调用添加到我的自定义(主题中的那个)page / html / footer.phtml中:
<?php echo $this->getCssJsHtml() ?>
最后,我现在可以在页脚中添加JS,方法是:
<action method="addJs"><script>yourscript.js</script></action>