【问题标题】:Optimizing conditional statements (PHP and JavaScript)优化条件语句(PHP 和 JavaScript)
【发布时间】:2013-03-04 07:12:33
【问题描述】:

我一直在我的网站上使用我自己创建的两种条件语句。我使用这些语句来检测浏览器并输出不同的样式表。 (我知道有更好和更复杂的方法可以做到这一点,但这不是重点。)如您所见,MSIE 8、9、10 等使用相同的样式表,但我不太确定如何对语句进行分组:

<?php
if (strStr(getEnv('HTTP_USER_AGENT'), 'Opera')) 
{ 
  echo '<link rel="stylesheet" href="http://www.example.com/nn_styles.css" type="text/css" media="screen">' . "\n" . '<style type="text/css">@import url("http://www.example.com/op11_styles.css");</style>' . "\n"; 
} 
else if (strStr(getEnv('HTTP_USER_AGENT'), 'Gecko')) 
{ 
  echo '<link rel="stylesheet" href="http://www.example.com/nn_styles.css" type="text/css" media="screen">' . "\n" . '<style type="text/css">@import url("http://www.example.com/ch_styles.css");</style>' . "\n"; 
}
else if (strStr(getEnv('HTTP_USER_AGENT'), 'MSIE 6.0')) 
{ 
  echo '<link rel="stylesheet" href="http://www.example.com/ie_styles.css" type="text/css" media="screen">' . "\n" . '<style type="text/css">@import url("http://www.example.com/ie6_styles.css");</style>' . "\n"; 
}
else if (strStr(getEnv('HTTP_USER_AGENT'), 'MSIE 7.0')) 
{ 
  echo '<link rel="stylesheet" href="http://www.example.com/ie7_styles.css" type="text/css" media="screen">' . "\n" . '<style type="text/css">@import url("http://www.example.com/ie7_9_styles.css");</style>' . "\n"; 
}
else if (strStr(getEnv('HTTP_USER_AGENT'), 'MSIE 8.0')) 
{ 
  echo '<style type="text/css">@import url("http://www.example.com/ie7_styles.css");</style>' . "\n" . '<style type="text/css">@import url("http://www.example.com/ie7_9_styles.css");</style>' . "\n"; 
}
else if (strStr(getEnv('HTTP_USER_AGENT'), 'MSIE 9.0')) 
{ 
  echo '<style type="text/css">@import url("http://www.example.com/ie7_styles.css");</style>' . "\n" . '<style type="text/css">@import url("http://www.example.com/ie7_9_styles.css");</style>' . "\n"; 
}
else if (strStr(getEnv('HTTP_USER_AGENT'), 'MSIE 10.0')) 
{ 
  echo '<style type="text/css">@import url("http://www.example.com/ie7_styles.css");</style>' . "\n" . '<style type="text/css">@import url("http://www.example.com/ie7_9_styles.css");</style>' . "\n"; 
}
?>

这是同一个脚本的JS版本:

var MSIE10=navigator.userAgent.indexOf("MSIE 10.0");
var MSIE9=navigator.userAgent.indexOf("MSIE 9.0");
var MSIE8=navigator.userAgent.indexOf("MSIE 8.0");
var MSIE7=navigator.userAgent.indexOf("MSIE 7.0");
var MSIE6=navigator.userAgent.indexOf("MSIE 6.0");
var NETS=navigator.userAgent.indexOf("Gecko");
var OPER=navigator.userAgent.indexOf("Opera");
if(OPER>-1) {
document.write('<link rel="stylesheet" href="http://www.example.com/op_styles.css" type="text/css">');
document.write('<style type="text/css">@import url("http://www.example.com/op11_styles.css");</style>');
}
else if(MSIE6>-1){
document.write('<link rel="stylesheet" href="http://www.example.com/ie_styles.css" type="text/css">');
document.write('<style type="text/css">@import url("http://www.example.com/ie6_styles.css");</style>');
}
else if(MSIE7>-1){
document.write('<link rel="stylesheet" href="http://www.example.com/ie7_styles.css" type="text/css">');
document.write('<style type="text/css">@import url("http://www.example.com/ie7_9_styles.css");</style>');
}
else if(MSIE8>-1){
document.write('<style type="text/css">@import url("http://www.example.com/ie7_styles.css");</style>');
document.write('<style type="text/css">@import url("http://www.example.com/ie7_9_styles.css");</style>');
}
else if(MSIE9>-1){
document.write('<style type="text/css">@import url("http://www.example.com/ie7_styles.css");</style>');
document.write('<style type="text/css">@import url("http://www.example.com/ie7_9_styles.css");</style>');
}
else if(MSIE10>-1){
document.write('<style type="text/css">@import url("http://www.example.com/ie7_styles.css");</style>');
document.write('<style type="text/css">@import url("http://www.example.com/ie7_9_styles.css");</style>');
}
else {
document.write('<link rel="stylesheet" href="http://www.example.com/nn_styles.css" type="text/css">');
document.write('<style type="text/css">@import url("http://www.example.com/ch_styles.css");</style>');
}

【问题讨论】:

    标签: php javascript stylesheet conditional-statements


    【解决方案1】:

    避开代码组织问题,考虑在服务器上使用内置的浏览器检测功能。 Code to parse user agent string?

    对于客户端,避免在 JS 中执行任何特定于浏览器的操作通常是一个好主意,而是使用一个框架(如 jQuery)来隐藏这些差异。在这种情况下,您似乎可以根据服务器的浏览器检测有条件地链接到正确的样式表。

    【讨论】:

      【解决方案2】:

      如果您确实需要每个浏览器的样式表,您可能需要检查您的 HTML 标记。但要回答你的问题,我会这样做。可能有一些错误,我没有测试。

      PHP

      $user_agents = array(
          'Opera' => 'nn',
          'Gecko' => 'nn',
          'MSIE 6.0' => 'ie'
      );
      
      $style_sheet = 'ie7'; // default
      foreach ($user_agents as $agent => $sheet) {
          if (strStr(getEnv('HTTP_USER_AGENT'), $agent)) {
              $style_sheet = $sheet;
              break;
          }
      }
      
      echo '<link rel="stylesheet" href="http://www.example.com/'.$style_sheet.'_style.css" type="text/css" media="screen">';
      

      Javascript

      您的样式表应该有一个一致的命名约定,以使其更容易。

      var user_agents = ['MSIE 9.0', 'MSIE 6.0', 'MSIE', 'Gecko', 'Opera'],
          style_sheets = ['ie7_9', 'ie', 'ie7', 'nn', 'op'], // indexs correspond with user_agents array
          inserted = false;
      
      user_agents.forEach(function(item, index) {
          if (!inserted && navigator.userAgent.indexOf(item) > -1) {
              document.write('<link rel="stylesheet" href="http://www.example.com/'+style_sheets[index]+'_styles.css" type="text/css">');
              document.write('<style type="text/css">@import url("http://www.example.com/'+style_sheets[index]+'_styles.css");</style>');
              inserted = true;
          }
      });
      

      【讨论】:

        【解决方案3】:

        试试这个

        if (strStr(getEnv('HTTP_USER_AGENT'), 'MSIE 7.0') || strStr(getEnv('HTTP_USER_AGENT'), 'MSIE 8.0') || strStr(getEnv('HTTP_USER_AGENT'), 'MSIE 9.0')) 
        

        【讨论】:

        • 听起来棒极了!但是,我对JS知之甚少。你能简要解释一下这些双管的工作原理吗?像“或”吗? :)
        • 尝试搜索条件运算符,如'&&'和'||'在网络中,你会得到更好的想法。
        【解决方案4】:

        更好地使用html条件语句:

        <!--[if IE 6]>
        <link rel="stylesheet" href="http://www.example.com/ie_styles.css" type="text/css">
        <style type="text/css">@import url("http://www.example.com/ie6_styles.css");</style>
        <![endif]-->
        

        switch替换ifs

        switch (strtolower(getEnv('HTTP_USER_AGENT'))) {
           case 'opera':
           ...
           break;
        }
        

        对于 JS 部分,您可以使用 switch (true) 并检查各种条件作为 case 语句

        【讨论】:

          猜你喜欢
          • 2010-09-07
          • 2017-12-24
          • 2019-03-10
          • 1970-01-01
          • 2011-05-18
          • 2016-04-14
          • 1970-01-01
          • 2015-07-27
          • 2013-03-30
          相关资源
          最近更新 更多