OctoberCMS:如何仅将 javascript 从组件添加到页面一次
Posted
技术标签:
【中文标题】OctoberCMS:如何仅将 javascript 从组件添加到页面一次【英文标题】:OctoberCMS: How can I add javascript to page from component only once 【发布时间】:2017-09-18 05:30:24 【问题描述】:我正在寻找一种将一段 javascript 代码添加到我的插件所需的页面的方法。我知道你可以通过$this->addJs()
包含一个文件,但我需要从插件设置模型中的设置动态构建 JavaScript。
我可以在我的 default.htm 中使用 % put scripts %...% endput %
块来执行此操作,但如果我在页面中多次使用该组件,则会多次注入。
有没有办法只将代码注入页面一次,无论该组件在页面上使用多少次?
【问题讨论】:
为什么不在 document.ready() 中 pyt IT? 【参考方案1】:想出了这个。在我的组件中,我添加了一个属性 $renderCount
并在 onRender()
方法中增加它。我需要做的就是在组件的默认模板中检查__SELF__.renderCount
,只有当它是1时才输出脚本。
【讨论】:
【参考方案2】:我在 Plugin.php 中的一个私有函数 (mapSettings
) 的帮助下这样做,以根据我的需要重写设置。
Event::listen('cms.page.beforeRenderPage', function($controller, $page)
if($page->hasComponent('myComponentName'))
Event::listen('cms.page.render', function($controller, $pageContents)
$this->settings = \Acme\Plugin\Models\Settings::instance();
$script = "<script>let hounddd = ". json_encode($this->mapSettings()) .";</script>";
return $pageContents . $script;
);
);
我首先关心的是如何避免浏览器缓存某些基本页面的 javascript 数据。 也许有更好的方法将“后端”编译数据注入 10 月份的 % scripts % 标签。
【讨论】:
【参考方案3】:要在使用 % put scripts %...% endput %
和 % put styles %...% endput %
时删除多重注入,您可以通过 Plugin.php 函数中处理的输出样式和脚本删除重复项:
public function boot()
Event::listen('cms.block.render', function ($name, $result)
if ($name == 'styles' || $name == 'scripts')
$array = preg_split('/\n/', $result);
$items = array_filter(array_unique(array_map('trim', $array)));
return join(PHP_EOL, $items);
);
【讨论】:
以上是关于OctoberCMS:如何仅将 javascript 从组件添加到页面一次的主要内容,如果未能解决你的问题,请参考以下文章