问题
Currently, I have a big CakePHP application with a layout and a lot of views. In the layout, I load Javascript files in the head which are needed by most views. In the views themself, I either load additional Javascript files (e.g., load a library file that is only needed there), or I add some Javascript code that is only relevant for this view in a script tag, for example if I need a click handler.
Since it is a known fact that loading Javascript files in the HTML head blocks loading the page, I wanted to put them at the bottom before closing the body Tag. But if I do so, the Javascript in my views that load the content breaks because it does not know about my loaded Javascript files. I understand that the Javascript code in the loaded views is executed before my files are loaded. But how can I prevent that?
I'm currently using the HTML Helper in the Layout (and everywhere else) to load my JS files like this:
<?php echo $this->Html->script('//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js'); ?>
And I use the JS Helper to "output" JS at the end of the page with
<?php echo $this->Js->writeBuffer(); ?>
Is there a way I can append my JS code in the views, so that it is executed when I call writeBuffer? Can that help me out?
回答1:
This is what I do in my view:
echo $this->Html->script('filename', array('inline' => false));
And this is what I do at the bottom of my layout:
echo $this->fetch('script');
回答2:
Since CakePHP version 2.1 you can use script blocks:
// in your view
$this->Html->script('filename', array('block' => 'scriptBottom'));
// in your layout
echo $this->fetch('scriptBottom');
This approach lets you keep echo $this->fetch('script')
in the <head>
of your layout in case you need any scripts at the top.
来源:https://stackoverflow.com/questions/14084123/load-javascript-files-in-cakephp-layout-at-bottom