2013-07-14 56 views
4

我有一个注册视图文件,其中有一个非常大的形式。因此,我打算使用表单向导插件和jQuery表单验证插件一起使用。我只想在特定页面上加载这些脚本。我该怎么做呢 ?这是我的控制器方法。codeigniter加载视图特定的javascript

public function index(){ 
    $data['title'] = "Register";   
    $this->load->view("site_header", $data); 
    $this->load->view("site_nav"); 
    $this->load->view("content_register"); 
    $this->load->view("site_footer"); 
} 

我看到计算器here类似的职位,但我不明白该怎么做。请帮忙。

+0

[This gist](https://gist.github.com/qolami/5994689)可能会有所帮助。通过使用它,您可以嵌入外部JavaScript文件,并将内部JavaScript语句添加到自定义视图中。 –

回答

9

您可以发送哪个js加载为变量。例子就在这里;

样品控制器

class mypage extends CI_Controller{ 
    public function index(){ 
    $data['js_to_load']="index.js"; 
    $this->load->view('header',$data); 
    $this->load->view('my_html_page'); 
    } 

    public function second_page(){ 
    $data['js_to_load']='second.js'; 
    $this->load->view('header',$data); 
    $this->load->view('my_second_html_page'); 

    } 
} 

的header.php - 查看文件

<!-- Needed html code here --> 

<? if ($js_to_load != '') : ?> 

<script type="text/javascript" src="assets/js/<?=$js_to_load;?>"> 

<? endif;?> 

<!-- Other html code here --> 

请告诉我发生了什么?

我们将js文件设置为$ data变量,并将$ data变量传递给标题。 在头文件中,我们将检查是否设置了js_to_load?如果是,我们将包含js文件。

此外,您可以通过使用数组传递多个js文件。

样品控制器

class mypage extends CI_Controller{ 
    public function index(){ 
    $data['js_to_load']=array("index.js","index1.js","index2.js"); 
    $this->load->view('header',$data); 
    $this->load->view('my_html_page'); 
    } 

    public function second_page(){ 
    $data['js_to_load']=array("second.js","second2.js","second2.js"); 
    $this->load->view('header',$data); 
    $this->load->view('my_second_html_page'); 

    } 
} 

的header.php - 查看文件

<!-- Needed html code here --> 

<? if (is_array($js_to_load)) : ?> 
<? foreach ($js_to_load as $row): 
    <script type="text/javascript" src="assets/js/<?=$row;?>"> 
<?endforeach;?> 
<? endif;?> 

<!-- Other html code here --> 
+0

我用[isset();](http://www.php.net/isset)来检查$ js_to_load是否在给定的控制器方法中定义,否则我得到一个错误。 '<? if(isset($ js_to_load)):?> \t

1

通过一个你想添加到数据头中的js数组,并在视图中添加,可能还有其他的方法来做到这一点(这种类型的涂抹控制器/视图行,所以它有点脏,但它的工作原理)。

public function index(){ 
    $data['title'] = "Register";  
    $data['js'] = array('link', 'link', etc); 
    $this->load->view("site_header", $data); 
    $this->load->view("site_nav"); 
    $this->load->view("content_register"); 
    $this->load->view("site_footer"); 
} 
0

我不明白你的问题。我想你加载你的JS文件在视图site_header或查看site_footer,为什么你不加载这些页面的另一个视图?例如:

public function index(){ 
    $data['title'] = "Register";   
    $this->load->view("site_header_extra_js", $data); 
    $this->load->view("site_nav"); 
    $this->load->view("content_register"); 
    $this->load->view("site_footer_extra_js"); 
} 

另一种解决方案是把一个如果您的视图来加载额外的js文件检查的路径,你可以使用$this->uri->segment()这一点。

+1

这将有几个不同的头文件。然而,你的建议是合乎逻辑的,对于如此简单的事情来说,微观管理太多了。感谢您的帮助。 – Binaryrespawn

0

最好是在你的页脚加载您的.js为你的HTML应该充分在开始之前加载运行脚本。

看到here原因

我使用通用页脚来处理。js文件

public function index() 
    { 
     $this->load->view('template/header'); 
     $this->load->view('template/nav'); 
     $this->load->view('thing/landing'); 
     $this->load->view('template/footer'); 
    } 

使用$this->router->class;$this->router->fetch_method();检测正在使用的控制器或方法在控制我的页脚视图是

<?php 
defined('BASEPATH') OR exit('No direct script access allowed'); 

$caller_class = $this->router->class; 
$caller_method = $this->router->fetch_method(); 
?> 

<script type="text/javascript" src="<?php echo base_url(); ?>public/js/jquery.min.js"></script> 

<?php 
//look for JS for the class/controller 
    $class_js = "public/js/custom-".$caller_class.".js"; 
    if(file_exists(getcwd()."/".$class_js)){ 
     ?><script type="text/javascript" src="<?php echo base_url().$class_js; ?>"></script> 
     <?php 
    } 

    //look for JS for the class/controller/method 
    $class_method_js = "public/js/custom-".$caller_class."-".$caller_method.".js"; 
    if(file_exists(getcwd()."/".$class_method_js)){ 
     ?><script type="text/javascript" src="<?php echo base_url().$class_method_js; ?>"></script> 
     <?php 
    } 
?> 
</body> 
</html> 

。然后检测该控制器/方法是否存在.js文件。

几乎没有管理,您可以使用控制器和/或特定于方法的脚本,而不用隐藏页脚。

在文件pub/js/custom-mycontrollername-mymethod.js中,然后使用(jquery);

$(document).ready(function() { 
    if ($("#mydivthing").length) { 
     $('#mydivthing').html("fetching.."); 
     $.ajax({ 
       ........ 
       }); 
    } else { 
     console.log("skipped js segment"); 
    } 
}); 

这里jQuery的文档时ready(如jQuery的建议) ,你也可以使用if ($("#mydivthing").length) {检查您的DIV实际上是在页面上只运行。所以你没有在没有加载的情况下发射事件(为了速度)。但由于jquery可能会进行一些检查 - 这可能只对更大量的代码有用,而不仅仅是单个按钮点击事件。

虽然问题是观点,这个答案得到一个控制器/方法的水平。所以虽然方法可以有多个视图 - 这仍然是用户看到的视图/屏幕。

增加了额外的好处,您可以将.js文件与其控制器/方法关联,只需通过其文件名即可。