【问题标题】:how to convert jquery ajax if else statement to switch statement如何将jquery ajax if else语句转换为switch语句
【发布时间】:2015-07-11 15:56:53
【问题描述】:

我编写了一个 jquery ajax 脚本来通过 ajax 动态加载页面,而无需重新加载页面。下面是我的导航菜单,里面有 5 个链接。

 <nav>
 <ul id='menu' class="menu-items">
 <li><a href="#Browse_Page1" class="albums active" id="page1-link"><i class="arcd-archive"></i></br>Browse</a></li>
 <li><a href="#Top_albums_Page1" class="pages" id="page2-link"><i class="arcd-music97"></i></br>Top albums</a></li>
 <li><a href="#Top_artists_Page1" class="albums" id="page3-link"><i class="arcd-microphone52"></i></br>Top artists</a></li>
 <li><a href="#Top_lists_Page1" class="pages" id="page4-link"><i class="arcd-numbered8"></i></br>Top lists</a></li>
 <li><a href="#Charts_Page1" class="pages" id="page4-link"><i class="arcd-rising9"></i></br>Charts</a></li>
 </ul>
 </nav>

这是分别加载导航菜单“#Browse_Page1”“#Top_albums_Page1”的前两页的jquery ajax。

 <script>
 $(function() {
 $('header nav a').on('click', function() {
 var linkClicked = $(this).attr('href');
 if(linkClicked.indexOf('Browse_Page') == true)
 {
     var $Browse_PageRoot = linkClicked.replace('#Browse_Page', '');
     if (!$(this).hasClass("active")) {
 $("header nav a").removeClass("active");
 $(this).addClass("active");}
 $('#loading').css('visibility','visible');
     $.ajax({
        type: "POST",
        url: "load.php",
        data: 'Browse_Page='+$Browse_PageRoot,

        dataType: "html",
        success: function(msg){

            if(parseInt(msg)!=0)
            {
                $('#main-content').html(msg);
                $('#loading').css('visibility','hidden');
                $('#main-content section').hide().fadeIn();
            }
        }

      });
     }
    else
    {
   var $Top_albums_PageRoot = linkClicked.replace('#Top_albums_Page',  ''); 
     if (!$(this).hasClass("active")) {
    $("header nav a").removeClass("active");
    $(this).addClass("active");} 
    $('#loading').css('visibility','visible');      
     $.ajax({
            type: "POST",
            url: "load2.php",
            data: 'Top_albums_Page='+$Top_albums_PageRoot,

            dataType: "html",
            success: function(msg){

                if(parseInt(msg)!=0)
                {
                    $('#main-content').html(msg);
                    $('#loading').css('visibility','hidden');
                    $('#main-content section').hide().fadeIn();
                }
            }            
          });
       }

     });

   });
  </script>

最后是上面jquery ajax函数“load.php”和“load2.php”使用的两个php文件

  <!--load.php-->
  <?php
  if(!$_POST['Browse_Page']) ;
  $page = (int)$_POST['Browse_Page'];
  if(file_exists('Browse/Browse_Page'.$page.'.html'))
  echo file_get_contents('Browse/Browse_Page'.$page.'.html');
  else echo 'There is no such page!';
  ?>

  <!--load2.php-->
  <?php
  if(!$_POST['Top_albums_Page']) die("0");
  $page = (int)$_POST['Top_albums_Page'];
  if(file_exists('Top-albums/Top_albums_Page'.$page.'.html'))
  echo file_get_contents('Top-albums/Top_albums_Page'.$page.'.html');
  else echo 'There is no such page!';
  ?>

我的站点文件夹结构如下。

  • 浏览
  • 热门专辑
  • *艺术家
  • 热门列表
  • 图表

所以我的问题是,正如我上面所说,jquery ajax 函数从两个不同的目录加载两个不同的页面,它工作正常,但我在导航菜单中有 5 个页面链接,所有页面都在不同的目录中,5 个不同的目录!但是这个功能只支持两个目录。 我尝试添加更多 if else 语句来满足我的愿望,但它没有用。因为我是 jquery 的新手,所以我可能做错了! 或者有什么方法可以将其转换为 switch 语句? 任何帮助将不胜感激。谢谢

【问题讨论】:

    标签: javascript php jquery html ajax


    【解决方案1】:

    这实际上是相当可怕的,你应该努力发送可以在服务器端轻松读取和计算的数据,而不需要为每个数据集重复代码。

    换句话说,将 javascript 重写为这样的东西

    $(function () {
        $('header nav a').on('click', function () {
            var linkClicked = $(this).attr('href');
            var data = {
                page      : linkClicked.replace(/\D/g, ''),
                directory : linkClicked.replace(/(_Page(.*)|#)/g,'')
            }
    
            $("header nav a").removeClass("active");
            $(this).addClass("active");
            $('#loading').css('visibility', 'visible');
    
            $.post('load.php', data, function(msg) {
                $('#main-content').html(msg);
                $('#loading').css('visibility', 'hidden');
                $('#main-content section').hide().fadeIn();
            }, 'html');
        });
    });
    

    现在您发送的数据类似于

    {
        page      : "1",
        directory : "Browse"
    }
    

    在服务器端,您需要进行切换以将内容放在一个 PHP 文件中

    <?php
    
        $page = filter_var( $_POST['page'], FILTER_VALIDATE_INT);
        $dir  = filter_var( $_POST['directory'], FILTER_SANITIZE_STRING);
    
        if ( $page !== false && $dir !== false ) {
    
            $link = $dir . '/' . $dir . '_Page' . $page . '.html';
    
            if ( file_exists( $link ) ) {
                echo file_get_contents( $link );
            } else {
                echo 'There is no such page!';
            }
        }
    ?>
    

    【讨论】:

    • 感谢您的支持!你能帮我描述一下吗,因为我真的不明白其中的逻辑。 page : linkClicked.replace(/\D/g, ''), directory : linkClicked.replace(/(_Page(.*)|#)/g,'') 是指(/\D/g, ''),(_Page(.*)|#)/g,,我应该在哪里添加我的页面链接?
    • 它是一个对象,包含键和值,值是从href创建的字符串。为什么不只是 console.log data 看看它包含什么。
    • 好的,谢谢您的回复!最后一件事把这段代码放在哪里?在脚本或php文件中? { page : "1", directory : "Browse" }
    • 你不要把它放在任何地方,它只是你现在发送的数据的一个例子。
    • 你能告诉我为什么会出现这个错误吗? Parse error: syntax error, unexpected ',' in Z:\AMR\load.php on line 4 并且没有加载页面!如何纠正它?请我等待你的指导。谢谢
    【解决方案2】:

    好的,到此为止,我对代码cmets中的解释做了一些更改。

    为页面添加一个data 属性,为目录添加另一个属性,例如。 'data-page' 和 'data-dir' 到每个 a 元素,就像这样

    <nav>
    <ul id='menu' class="menu-items">
    <li><a href="#Browse_Page1" data-page="1" data-dir="Browse" class="albums active" id="page1-link"><i class="arcd-archive"></i></br>Browse</a></li>
    <li><a href="#Top_albums_Page1" data-page="2" data-dir="Top-albums" class="pages" id="page2-link"><i class="arcd-music97"></i></br>Top albums</a></li>
    <li><a href="#Top_artists_Page1" data-page="3" data-dir="Top-artists" class="albums" id="page3-link"><i class="arcd-microphone52"></i></br>Top artists</a></li>
    <li><a href="#Top_lists_Page1" data-page="4" data-dir="Top-lists" class="pages" id="page4-link"><i class="arcd-numbered8"></i></br>Top lists</a></li>
    <li><a href="#Charts_Page1" data-page="5" data-dir="Charts" class="pages" id="page4-link"><i class="arcd-rising9"></i></br>Charts</a></li>
    </ul>
    </nav>
    

    更改onclick 函数,使其从data 属性中获取页面并将ajax 请求仅发送到一个php 脚​​本。 我还将“激活”逻辑移到了一个函数中。

    <script>
    $(function() {
        $('nav ul#menu a').on('click', function(event) {
            event.preventDefault();
            // var linkClicked = $(this).data('page'); not using this anymore
            var pagevar = $(this).data('page');
            var dirvar = $(this).data('dir');
            // make the clicked link active, the rest of them inactive, show the loading element
            makeActive($(this));
    
            $.ajax({
                type: "POST",
                url: "load.php",
                data: {page:pagevar,dir:dirvar},
                success: function(msg){
                    if(parseInt(msg)!=0) {
                        $('#main-content').html(msg);
                        $('#loading').css('visibility','hidden');
                        $('#main-content section').hide().fadeIn();
                    }
                }
            });
        });
    
    function makeActive(link){
        var ul = $(link).parent().parent();
        $('a',ul).removeClass("active");
        $(link).addClass("active");
        $('#loading').css('visibility','visible');
    }
    
    });
    </script>
    

    最后让您的 php 脚本处理任何页面请求,我想强调定义可接受值的白名单的重要性,否则您将面临大量本地文件包含漏洞。

    加载.php

    // define your acceptable values for pages to avoid pains
    $pages = array(1,2,3,4,5);
    $directories = array("Browse","Top-albums","Top-artists","Top-lists","Charts");
    
    if ((isset($_POST['page']) and in_array($_POST['page'],$pages)) and (isset($_POST['dir']) and in_array($_POST['dir'],$directories))  ){
        if(file_exists($_POST['dir'] . '/Browse_Page'.$_POST['page'].'.html'))
            echo file_get_contents('Browse/Browse_Page'.$_POST['page'].'.html');
    }
    else echo 'There is no such page!';
    

    【讨论】:

    • 是否需要在 load.php 中为其他页面添加更多 if else 语句?
    • 不,if 子句是通用的,它将检查任何文件
    • 感谢您的回复!但正如我在问题中所说,所有这些页面都在不同的目录中,这有关系还是仍然有效?
    • 我错过了那部分,但您可以使用@adeneo 的解决方案,它适用于不同的目录
    • 您能否重新编辑它,使其能够与不同的目录一起使用!我真的很感激,因为我是 javascript 新手,所以我自己做不到
    【解决方案3】:

    查看您的 PHP 代码后,除了从静态 HTML 文件中读取内容外,它似乎并没有做太多事情。如果您只想加载 HTML 内容,jQuery 有一个有用的“加载”功能。

    此外,您可以利用 HTML5 数据属性来存储您想要拉入页面的 HTML 内容文件的路径。我看到您的问题的答案之一也是使用这种方法。也就是说,我建议通过简单地包含 HTML 内容的整个相对文件路径来解决问题。这样一来,您就可以更灵活地设置和维护内容文件结构。

    我假设您没有任何特殊的安全要求。您的问题没有提及,您的代码也没有暗示这种需要。

    示例如下:

    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8">
        <title></title>
        <script type="text/javascript" src="//code.jquery.com/jquery-1.11.3.min.js"></script>
        <script type="text/javascript">
    
        (function($) {
    
          $(function() {
            $("header nav a").click(function() {
              var $this = $(this),
                  loadFrom = $this.data("navigate-to"),
                  fadeSpeed = 1000;
    
              $("header nav a").removeClass("active");
              $this.addClass("active");
    
              $("#loading").fadeIn(fadeSpeed, function() {
                $("#main-content").load(loadFrom, function(res, status, xhr) {
                    if(status=="error") {
                      $("#main-content").html("Content couldn't be loaded.");
                    }
                });
                $(this).fadeOut(fadeSpeed);
              });
    
            });
          });
    
        })(jQuery);
    
        </script>
    
      </head>
      <body>
        <header>
          <nav>
            <li><a href="#browse-page-1" data-navigate-to="/browse/page1.html" class="albums active">Browse</a></li>
            <li><a href="#top-albums-page-1" data-navigate-to="/top_albums/page1.html"  class="albums">Top Albums</a></li>
            <li><a href="#top-artists-page-1" data-navigate-to="/top_artists/page1.html" class="albums">Top Artists</a></li>
            <li><a href="#charts-page-1" data-navigate-to="/charts/page1.html" class="albums">Charts</a></li>
          </nav>
        </header>
        <div id="loading" style="display:none;">
          <p>
            Loading...
          </p>
        </div>
        <div id="main-content">
    
        </div>
    
      </body>
    </html>
    

    【讨论】:

    • 首先感谢您的支持和ans,但很抱歉我尝试了这个,但它不起作用!请检查以确保一切正常?第二,正如你提到的安全性,你能告诉我这段代码有多脆弱吗?这段代码是否会显示我的文件夹结构或任何严重的事情请告诉我关于它以及最后如何让它变得更好?我的意思是安全友好。谢谢。
    • 我在发布之前测试了这个例子。您配置站点的方式可能存在一些差异,这是您遇到问题的根源。如果您通过本地 Web 服务器运行我的示例,只要您的 HTML 文件位于反映导航中锚标记的 data-navigate-to 属性中的内容的目录路径中,它就应该为您工作。
    • 在安全性方面,我看到您使用 PHP 来提供页面内容。因此,我不确定您是否要为最终用户实施某种形式的身份验证以查看页面内容。如果没有,那么使用 PHP 就不是必需的了,除非你要为你的页面内容实现某种形式的模板系统。但是,从您的示例中,我的印象是您也没有这样做。也就是说,从您的示例代码中,使用 PHP 似乎只是一个您似乎不需要的额外层。