【问题标题】:Codeigniter - Load a specific JS library on a specific viewCodeigniter - 在特定视图上加载特定的 JS 库
【发布时间】:2011-06-21 04:20:04
【问题描述】:

我正在尝试加载谷歌地图 API,即:

<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=true">

在我的头部模板中。但是因为我只有一个带有谷歌地图的页面(我宁愿不为所有文件加载 API),我如何将消息从控制器发送到我希望加载这个特定的视图JS文件?

感谢您的帮助。

【问题讨论】:

    标签: php javascript codeigniter


    【解决方案1】:

    CodeIgniter 有一个段类。您将能够运行一些代码,例如:

    <?php if($this->uri->segment(1) == 'map') { ?>
    <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=true">
    <?php } ?>
    

    在页面http://yoursite.com/map/ 上时,它将加载脚本。

    【讨论】:

    • 这是一个很好的选择,但我想我不想陷入根据用户所在页面而出现一堆“if 语句”的情况。但是感谢您的解决方案,除非提出更好的方法,否则我会使用它。
    • 将其指定到一个页面的唯一另一种方法是将其附加到仅在该页面上加载的视图。
    【解决方案2】:

    一种解决方案是使用具有 javascript/css“注入”的模板库 - 请参阅:

    http://williamsconcepts.com/ci/codeigniter/libraries/template/reference.html#utilities

    $this->template->add_js('js/jquery.js');
    $this->template->add_js('alert("Hello!");', 'embed');
    

    了解更多信息。

    如果您不想使用模板库,请执行以下操作:

    *假设在“地图”控制器上,并且您需要默认页面上的JS文件。

    class Map extends CI_Controller {
    
        function __construct()
        {
            parent::__construct();
        }
    
        function index()
        {
            $scripts = array(
        '<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=true">' . "\n", 
        '<script>something</script>');
           /* this method lets you add multiple...*/
    
            $data['scripts'] = $scripts;
            $this->load->view('my_map/index', $data);
        }
    }
    

    在你看来:

    if(isset($scripts))
    {
        foreach($scripts as $script)
        {
            echo $script;
        }
    }
    

    基本上你构建了一个脚本文件/css文件数组(不管),然后检查它的存在并将它转储到你视图的head部分。

    我个人会选择模板选项。

    还要注意 CI2.0 有一个新的javascript driver 可能值得一读

    【讨论】:

    • +1 表示此建议。我已经为此做了类似的方法,但是通过将配置映射控制器映射到 javascript 路径包含,这样所有东西都与控制器分开配置,并且控制器不需要担心创建包含字符串的数组。让库或视图创建标记脚本标签的实际输出,而不是控制器。一个地方可以更改,而不是在脚本 api 更改版本时搜索一堆控制器文件。
    • Javascript 驱动链接好像坏了?
    【解决方案3】:

    感谢你们的回答,在我在这里找到你们的答案之前,我最终混合了 Ross 和 Leaf dev 的建议,所以我想我是在正确的轨道上。

    我的控制器有:

    $data['head'] = array('specificjs');
    $this->load->view('view',$data);`
    

    我的观点是:

    if(isset($head)){
        foreach($head as $item){
            $this->load->view('js/'.$item);
        }
    }
    

    而我的“特定js”视图具有所需的内容。

    这样我可以加载任意数量的自定义脚本,并将代码放在视图而不是控制器中。

    再次感谢,但请继续提供任何进一步的建议!

    【讨论】:

    • 我也有类似的情况。你是如何指定“specificjs”的链接的。我在一个单独的脚本文件夹中有我的 jquery 文件。
    【解决方案4】:

    为此编写一个助手。在数组中传递脚本名称,并在辅助函数内部迭代它们并打印脚本

    【讨论】:

      【解决方案5】:
      <?php
      
      /**
       * Head files loader
       * @author azhar
       **/
      
      function headscripts($path)
      {
          if(is_string($path))
          {
              echo "<script type='text/javascript' src='". base_url($path) ."'></script>\n";
          }elseif(is_array ($path)){
              foreach ($path as $p) {
                  echo "<script type='text/javascript' src='". base_url($p) ."'></script>\n";
              }
          }
      }
      
      function headlinks($path)
      {
          if(is_string($path))
          {
              echo "<link rel='stylesheet' href='". base_url($path) ."'/>\n";
          }elseif(is_array ($path)){
              foreach ($path as $p) {
                  echo "<link rel='stylesheet' href='". base_url($p) ."'/>\n";
              }
          }
      }
      ?>
      

      将此文件添加到您的 helper_directory 中,名称为 head_helper。在你的控制器里面的一个动作中使用这个代码

      $data['headscripts'] = array('js/main.js');
      

      在你的视图文件中使用这个函数

      headscripts($headscripts);
      

      样式表使用这个

      headlinks($headlinks);
      

      是的,不要忘记像这样在配置文件夹中使用 autoload.php 文件加载帮助程序

      $autoload['helper'] = array('url', 'file','head');
      

      【讨论】:

        猜你喜欢
        • 2013-07-12
        • 1970-01-01
        • 1970-01-01
        • 2017-03-22
        • 2015-06-22
        • 2021-10-07
        • 2014-04-10
        • 1970-01-01
        • 2013-11-01
        相关资源
        最近更新 更多