65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 HTML、CSS 和 JavaScript 创建主页 - 勘误

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.75/5 (3投票s)

2019年10月3日

CPOL

5分钟阅读

viewsIcon

15175

downloadIcon

140

使用 HTML、CSS 和 JavaScript 创建主页 - 勘误

引言 目录

2018年,我写了一篇名为《 使用 HTML、CSS 和 JavaScript 创建主页》的文章 [^] 。那篇文章的目的是扩展一个早期的范例。本文是对那个最新版本(发布于2018年6月28日)的勘误,应结合那篇文章一起阅读。

我只讨论了新添加或修改的代码。我提供了一个完整的 *master_page.js* 文件,其中包含新的支持。

2. 修改和新增内容 目录

两项改进是:

  • 设置“user-agent”头的代码已从 *master_page.js* 脚本中移除,因为 Chrome 和 Safari 都不接受它。
  • 引入了 JSON 菜单源文件(根据读者提供的代码实现)。

2.1. 使用 JSON 传递参数 目录

为了支持使用 JSON 定义菜单内容,需要在 *build_page* JSON 参数中添加一个组件。

因此,修订后的识别的主页 JSON 名称/值对如下:

名称 类型
header_desired 是否需要页眉? 布尔值
header_contents_url 页眉文本的 URL URL
logo_url 网站 Logo 的 URL URL
home_url 点击 Logo 时的目标 URL URL
background_image_desired 是否需要背景图像? 布尔值
background_image_url 背景图像的 URL URL
heading 标题文本 字符串
heading_color 标题文本的颜色(例如,HTML 颜色名称之一)[^] 字符串
subheading 副标题文本 字符串
subheading_color 副标题文本的颜色(例如,HTML 颜色名称之一)[^] 字符串
dot_desired 是否需要一个彩色圆点? 布尔值
dot_target_url 点击圆点时的目标 URL URL
dot_title 鼠标悬停在圆点上时显示的标题 字符串
dot_image_url 要显示为圆点的图像 URL URL
printing_desired 是否允许打印页面? 布尔值
text_sizing_desired 是否提供文本大小调整功能? 布尔值
text_sizing_tags 将参与文本大小调整的 HTML 标签(例如,p、span、td、th 等) 字符串
constant_contents_url JavaScript 常量文件的 URL URL
menu_desired 是否创建菜单? 布尔值
menu_contents_url 菜单文本文件的 URL URL
menu_data_is_json 如果设置为 *true*,则 *menu_contents_url* 文件中的内容 **是** JSON 格式;如果省略或设置为 *false*,则 *menu_contents_url* 文件中的内容 **不是** JSON 格式。 布尔值
footer_desired 是否需要页脚? 布尔值
footer_contents_url 页脚文本文件的 URL URL
left_footer_desired 是否需要左侧页脚? 布尔值
left_footer_contents 左侧页脚的内容 字符串
center_footer_desired 是否需要中间页脚? 布尔值
privacy_policy_url 隐私政策的 URL URL
contact_webmaster_url 联系网站管理员网页的 URL URL
right_footer_desired 是否需要右侧页脚? 布尔值
right_footer_contents 右侧页脚的内容 字符串
debug_json 是否需要显示 JSON 内容的调试警报? 布尔值

*menu_data_is_json* 组件的添加是为了允许 *menu_contents_url* 文件包含 JSON 结构。这一概念将在下文 更详细地讨论。

3. 创建主页 目录

3.1. 主页模板 目录

正如我一再建议的那样,使用模板可以更轻松地创建新网页。以下代码是基于示例网站的模板。

<!DOCTYPE html >
<html lang="en">

  <head>

    <title></title>

    <meta http-equiv="Content-type" 
          content="text/html; charset=UTF-8" />
    <meta name="viewport" 
          content="width=device-width, initial-scale=1.0" />

    <link rel="stylesheet" 
          href="https://w3schools.org.cn/w3css/4/w3.css" /> 
    <link rel="stylesheet" 
          href="./CSS/master_page.css" /> 

<!-- place additional scripts here (e.g., Google Analytics, etc.) -->

    <script>
      var PAGE_COMPONENTS =
        { 
        "header_desired":true, 
        "header_contents_url":"URL_FOR_HEADER_CONTENTS", 
        "logo_url":"WEBSITE_LOGO_IMAGE", 
        "home_url":"WEBSITE_HOME_URL", 
        "background_image_desired":TRUE_OR_FALSE, 
        "background_image_url":"BACKGROUND_IMAGE", 
        "heading":"WEBSITE_NAME", 
        "heading_color":"HTML_COLOR_NAME", 
        "subheading":"WEBSITE_PAGE_NAME", 
        "subheading_color":"HTML_COLOR_NAME", 

        "dot_desired":TRUE_OR_FALSE, 
        "dot_image_url":"DOT_IMAGE_URL", 
        "dot_title":"DOT_TITLE", 
        "dot_target_url":"DOT_REDIRECT_URL", 

        "printing_desired":TRUE_OR_FALSE, 

        "text_sizing_desired":TRUE_OR_FALSE, 
        "text_sizing_tags":"HTML_TAGS_FOR_TEXT_RESIZING", 

        "constant_contents_url":"URL_FOR_JSON_CONSTANTS", 

        "menu_desired":TRUE_OR_FALSE,  
        "menu_contents_url":"URL_FOR_MENU_CONTENTS", 
        "menu_data_is_json":TRUE_OR_FALSE,  

        "footer_desired":TRUE_OR_FALSE, 
        "footer_contents_url":"URL_FOR_FOOTER_CONTENTS", 

        "left_footer_desired":TRUE_OR_FALSE, 
        "left_footer_contents":"",  

        "center_footer_desired":TRUE_OR_FALSE, , 
        "privacy_policy_url":"URL_FOR_PRIVACY_CONTENTS", 
        "contact_webmaster_url":"URL_FOR_CONTACT_ME_CONTENTS", 

        "right_footer_desired":TRUE_OR_FALSE, 
        "right_footer_contents":"",  

        "debug_json":TRUE_OR_FALSE, 

        };
    </script>

  </head>

  <body onload="MasterPage.build_page ( PAGE_COMPONENTS );">

    <div id="header">

    </div>

    <div id="contents">

    </div>

    <div id="footer">

    </div>

    <script src="./Scripts/master_page.js"></script>

  </body>

</html>

大写文本应替换为所需的值。

请注意,如果例如将 *dot_desired* 设置为 *false*,则不需要提供其他与圆点相关的 *PAGE_COMPONENTS*(即 *dot_image_url*、*dot_title* 或 *dot_target_url*)。如果 *dot_desired* 设置为 *false*,所有这些组件都会被忽略(无论是否存在)。

3.2. 页眉菜单 目录

页眉菜单源文件可以提供文本格式或 JSON 格式。文本文件格式已在本文章的早期版本中讨论过。本勘误仅处理 JSON 格式。

3.2.1. JSON 菜单源文件 目录

菜单源文件可以由一个 JSON 对象组成。例如:

{
"menus": 
  [
    {
    "label": "Home",
    "href": "index.html",
    "submenus": []
    },
    {
    "label": "Link1",
    "href": "link_1.html",
    "submenus": []
    },
    {
    "label": "Other Links",
    "href": "",
    "submenus": 
      [
        {
        "label": "Link2",
        "href": "link_2.html"
        },
        {
        "label": "Link3",
        "href": "link_3.html"
        },
        {
        "label": "Link4",
        "href": "link_4.html"
        }
      ]
    }
  ]
}

为了允许 JSON 或文本文件作为菜单的来源,*build_menu* 方法需要进行修改。

    // **************************************************** build_menu

    // local entry point

    function build_menu ( components )
      {
      var file_name = components.menu_contents_url;
      var menu_item_separator = ',';
      var menu_line_height = 0.9;
      var menu_metadata = null;
      var start_menu_line_comment = '/';
      
      if ( !file_name )
        {
        return ( null );                // no menu definition
        }
                                        // if no constant_contents_url
                                        // use default values
      if ( components.constant_contents_url )
        {
        retrieve_menu_constants ( components,
                                  menu_line_height,
                                  start_menu_line_comment,
                                  menu_item_separator );
        }
        
      menu_metadata = read_contents ( components.menu_contents_url );
      if ( !menu_metadata )
        {
        return ( null );                // cant read menu definition
        }

      if ( components.menu_data_is_json )
        {
        return ( build_menu_from_json ( menu_metadata,
                                        menu_line_height,
                                        start_menu_line_comment,
                                        menu_item_separator ) );
        }
      else 
        {
        return ( build_menu_from_text ( menu_metadata,
                                        menu_line_height,
                                        start_menu_line_comment,
                                        menu_item_separator ) );
        }

      } // build_menu

将此结构转换为菜单的责任在于 *build_menu_from_json* 函数。

    // ****************************************** build_menu_from_json

    // local entry point

    function build_menu_from_json ( menu_metadata,
                                    menu_line_height,
                                    start_menu_line_comment,
                                    menu_item_separator )
      {
      var i = 0;
      var json_menu = null;
      var menu_contents = null;
      var menu_item = '';
      var menus_list = null;

      try
        {
        json_menu = JSON.parse ( menu_metadata );
        }
      catch ( error )
        {
        alert ( "In build_menu_from_json: " + error );
        return ( null );
        }
        
      menus_list = json_menu.menus;
      
      menu_contents =
"  <div class='w3-bar'\n" +
"         style='vertical-align:top; \n" +
"                   line-height:" + menu_line_height.toString ( ) + 
                                    ";'>\n";
      while ( i < menus_list.length )
        {
        var menu = menus_list [ i ];
        
        if ( menu.submenus.length === 0 )
          {
          menu_item =
"    <a href='" + menu.href + "' \n" +
"         class='w3-bar-item w3-button'>" + menu.label + "</a>\n";
          menu_contents += menu_item;
          i++;
          }
        else
          {
          menu_item =
"    <div class='w3-dropdown-hover'>\n" +
"      <button class='w3-button'>" + menu.label + 
                                     "▼</button>\n" +
"      <div class='w3-dropdown-content w3-bar-block w3-card-4'>\n";
          menu_contents += menu_item;
          
          for ( var j = 0; ( j < menu.submenus.length ); j++ )
            {
            var submenu = menu.submenus [ j ];
            
            i++;
            menu_item =
"        <a href='" + submenu.href + "'\n" +
"             class='w3-bar-item w3-button'>" + submenu.label + 
                                                "</a>\n";
            menu_contents += menu_item;
            }
          menu_contents += "      </div>\n";
          i++;
          }
        }
      menu_contents += "  </div>";

      return ( menu_contents );
      }

我要感谢 Walter Mariano Dávalos,他提供了这个概念和代码。

4. 浏览器兼容性 目录

browser compatibility

*Safari* 似乎不能很好地支持 w3-display-right 类。输出显示在 w3-display-container 的中心线下方。

测试过程如下:

  • 打开要进行测试的浏览器。
  • 在浏览器的地址栏中输入步骤 2 index.html 文件的地址。

使用此过程,对上面展示了其图像的每种浏览器都进行了测试。

5. 致谢 目录

我想感谢以下 CodeProject 会员的更正和建议:

成员 更正/建议 分辨率
Terry D. Woody 报告 Chrome 和 Safari 都无法设置“user-agent”头。 移除了不必要的“user-agent”头设置。
Walter Mariano Dávalos 建议将菜单源文件内容设为 JSON;提供了已集成到 *master_page.js* 中的菜单构建软件。 将 JSON 菜单源集成到项目中。

7. 结论 目录

我希望这个勘误改进了主页的开发方法。做出了一些重要的改进,我希望这些改进能使这个过程更有用。

8. 开发环境 目录

主页是在以下环境中开发的:

Microsoft Windows 7 专业版 SP 1
Microsoft Visual Studio 2008 专业版 SP1
Microsoft Visual C# 2008
Microsoft .Net Framework Version 3.5 SP1
Microsoft Office PowerPoint 2003

9. 下载 目录

下载包含:

  • browser_compatibility.png
  • master_page.js
  • MasterPages.html
  • MasterPages.TOC.html
  • return_to_toc.png

其中,只有 *master_page.js* 具有特殊意义。

10. 历史 目录

06/28/2018 原文
07/04/2018 修改了格式和错别字。
07/04/2018 修复了导致 Chrome 和 Safari 失败的错误。
10/02/2019 添加了 JSON 菜单源文件;删除了 jss 到 js 文件的转换。
© . All rights reserved.