我正在尝试使用symfony 2将一些java脚本编码到控制器中。 此代码有效:
public function indexAction() {
echo "<script type=\"text/javascript\">"
. "alert(\" test message! \");"
. "</script>";
return $this->render('TestBundle:Default:GuiLogin.html.twig');
}
但不是这一个:
echo "<script type=\"text/javascript\">"
. "document.getElementById(\"DivInfo\").style.display = 'block';"
. "</script>";
有人有想法吗?
答案 0 :(得分:1)
您可以在控制器中定义字符串,然后在Twig模板中显示它:
public function indexAction() {
$js = '<script type="text/javascript">'.
'document.getElementById("DivInfo").style.display = "block";'.
'</script>';
return $this->render(
'TestBundle:Default:GuiLogin.html.twig',
array(
'js' => $js
)
);
}
将此代码放在</html>
标记之前:
<div id="DivInfo" style="display:none;">
DivInfo
</div>
{% if (js is defined) %}{{ js|raw }}{% endif %}
<div id="DivInfo">
默认隐藏,并在启用Javascript时显示。
我不明白你问题背后的逻辑是什么。有几种方法只能在某些条件下显示代码。在Controller中定义Javascript函数是一个坏主意,因为它将Javascript代码放在.js
文件或Twig HTML文件中的逻辑更多。
根据您的评论,您正在检查用户凭据,因此您可以在控制器中执行测试:
public function indexAction() {
$message = null;
if (check credentials)
{
$message = 'whatever';
}
return $this->render(
'TestBundle:Default:GuiLogin.html.twig',
array(
'message' => $message
)
);
}
<div id="DivInfo" style="display:none;">
DivInfo
</div>
{% if ((message is defined) and (message is not null)) %}
<div>{{ message }}</div>
{% endif %}
答案 1 :(得分:0)
好。首先。你永远不应该做这样的事情。除非您正在测试某些内容,否则您的控制器操作不应回显/转储任何内容。
我的猜测是,第一个例子有效,因为alert函数不会尝试在dom中找到任何元素,浏览器仍然可以执行它。我还相信在渲染方法输出模板之前,您的脚本已经输出。这意味着你的脚本在html之前输出,这在第一时间是无效的。第二个示例需要已经加载的html(dom),以便按ID查找元素。还要考虑使用jQuery来获取id的元素。 jQuery可以用选择器做到这一点,并且有#34; load&#34;和&#34;准备好&#34;方法,当你需要等待加载的东西。
jQuery - What are differences between $(document).ready and $(window).load?
你应该至少将javascript移动到模板中。如果必须,将javascript放在php变量中并将其传递给模板。然后使用模板引擎(如twig),尝试将该变量输出为html,也许尝试使用原始过滤器或其他一些可以做到这一点。