7

非常に大きなフォームがあるレジスタ ビュー ファイルがあります。したがって、jquery フォーム検証プラグインと一緒にフォーム ウィザード プラグインを使用する予定です。これらのスクリプトを特定のページにのみロードしたい。これを行うにはどうすればよいですか? これが私のコントローラーメソッドです。

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");
} 

ここでスタックオーバーフローに関する同様の投稿を見ましたが、何をすべきかわかりません。助けてください。

4

5 に答える 5

14

どの 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 -->
于 2013-07-14T14:35:00.977 に答える
1

スクリプトの実行を開始する前に HTML を完全にロードする必要があるため、フッターに .js をロードすることをお勧めします。

理由はこちらをご覧ください

ユニバーサル フッターを使用して .js ファイルを処理します

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

私のフッタービューは

<?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>

using$this->router->class;または$this->router->fetch_method();、コントローラー内のどのコントローラーまたはメソッドが使用されているかを検出します。次に、そのコントローラー/メソッドの.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ファイルをコントローラー/メソッドに関連付けることができるというボーナスが追加されました。

于 2016-06-26T01:01:02.970 に答える
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");
} 
于 2013-07-14T14:30:41.527 に答える