精华内容
下载资源
问答
  • 除了切换 CSS 样式文件之外,通常的网页换肤还需要通过 Cookie 来记录用户之前更换过的皮肤,这样下次用户访问的时候,就可以自动使用上次用户配置的选项。 基本流程如下: 上面是使用流程图来描述下,自从...

     网页换肤的基本原理

      使用 JS 切换对应的 CSS 样式表。例如hao123首页的右上方就有网页换肤功能。除了切换 CSS 样式表文件之外,通常的网页换肤还需要通过 Cookie 来记录用户之前更换过的皮肤,这样下次用户访问的时候,就可以自动使用上次用户配置的选项。

      基本流程如下:

                                

       上面是使用流程图来描述下,自从工作以来很小画这样的流程图 如果流程图画错了或者画的不够好 请大家原谅!

       先来看看效果图吧!

      

      我只是做个demo 来实现这样一个效果!假如页面上一进来的时候 有这么四个按钮 分别代表不同的样式 当我鼠标点击不同的按钮时候 切换不同的css文件 且切换时候记录cookie里面去,当我们刷新页面或者关闭网页 重新打开 由于cookie的存在 所以还是关闭前的css样式 这样就实现了简单的网页换肤功能效果 基本的原理就是这些!

     了解cookie及HTML5中sessionStorage和localStorage

      首先我们来了解下cookie是干什么用的?简单讲 cookie作用是客户端存储数据。也就是本地存储。具体的了解可以看我之前的一篇关于cookie的博客。深入了解cookie

      讲到cookie,我们再来简单的来了解下HTML5中新增了2个本地存储sessionStorage和localStorage. sessionStorage、 localStorage、cookie都是在浏览器端存储的数据,   其中sessionStorage的概念很特别,引入了一个“浏览器窗口”的概念。 sessionStorage是在同源的同窗口(或tab)中,始终存在的数据。也就是说只要这个浏览器窗口没有关闭,即使刷新页面或进入同源另一页面, 数据仍然存在。 关闭窗口后,sessionStorage即被销毁。同时“独立”打开的不同窗口,即使是同一页面,sessionStorage对象也是不同的。
    Web  Storage 带来的好处: 减少网络流量:一旦数据保存在本地后,就可以避免再向服务器请求数据,因此减少不必要的数据请求,减少 数据在浏览器和服务器间不必要地来回传递。 快速显示数据:性能好,从本地读数据比通过网络从服务器获得数据快得多,本地数据可以即时获得。再加上网页本身也可以有缓存,因此整个页面和数据都在本地的话,可以立即显示。 临时存储:很多时候数据只需要在用户浏览一组页面期间使用,关闭窗口后数据就可以丢弃了,这种情况使用 sessionStorage非常方便。

     cookie sessionStorage及localStorage共同点及区别是什么?

     共同点:

       都是在浏览器端存储的数据,且同源的。

     区别:

         1. 存储大小不一样: cookie存储数据有限制 做多只能是4KB 而sessionStorage和localStorage可以存储5MB 甚至更多数据。

         2. cookie 数据始终在同源的http请求中携带,即cookie在浏览器和服务器间来回传递。而sessionStorage和 localStorage不会自动把数据发给服务器,仅在本地保存。

         3. 数据有效期不同: sessionStorage:仅在当前浏览器窗口关闭前有效,自然也就不可能持久保持; localStorage:始终有效,窗口或浏览器关闭也一直保存,因此用作持久数据; cookie只在设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭。

        4. 作用域不同, sessionStorage 不在 不同的浏览器窗口中共享,即使是同一个页面; localStorage 在所有同源窗口中都是共享的;cookie也是在 所有同源窗口中都是共享的。

     使用cookie碰到那些问题?

        首先来讲讲我在本地做demo 因为没有放到任何服务器下面 所以我直接放在桌面上 点击页面打开,突然发现 "谷歌游览器不支持cookie在本地存储"。所以针对这个问题在谷歌游览器下没有用cookie存储,而是用了上面介绍的HTML5中的localStorage作本地存储功能。通过setItem 设置key名 然后通过getItem获取key名 进而获取值。

    HTML代码如下:

    <p>前端开发是我的一个职业目标,我喜欢前端开发,热爱前端开发,喜欢制作各种各样的页面效果</p>
    <input type="button" data-value="default" class="targetElem" value="default"/>
    <input type="button" data-value="green" class="targetElem" value="green"/>
    <input type="button" data-value="red" class="targetElem" value="red"/>
    <input type="button" data-value="orange" class="targetElem" value="orange"/>

    CSS代码

     default.css 代码如下:

    @charset "utf-8";
    /* CSS Document */
    *{padding:0;margin:0;}
    h2{color:#00C;}
    p{color:#006;}

    orange.css代码如下:

    @charset "utf-8";
    /* CSS Document */
    *{padding:0;margin:0;}
    h2{color:#C60;}
    p{color:#C33;}

    green.css代码如下:

    @charset "utf-8";
    /* CSS Document */
    *{padding:0;margin:0;}
    h2{color:#060;}
    p{color:#060;}

    red.css代码如下:

    @charset "utf-8";
    /* CSS Document */
    *{padding:0;margin:0;}
    h2{color:#F00;}
    p{color:#F00;}

    JS代码如下:

    /**
     * JS实现换肤功能
     */
    // Google Chrome只支持在线网站的cookie的读写操作,对本地html的cookie操作是禁止的。
    // name1=value1;name2=value2;name3=value3;name4=value4
     function Skin(options) {
     
        this.config = {
            targetElem                :  '.targetElem',
            link                      :  '#link'
        };
        this.cache = {
            defaultList        : ['default','green','red','orange']
        };
    
        this.init(options);
     }
    
     Skin.prototype = {
        
        constructor: Skin,
        init: function(options) {
            this.config = $.extend(this.config,options || {});
            var self = this,
                _config = self.config;
            
            $(_config.targetElem).each(function(index,item) {
                
                $(item).unbind('click');
                $(item).bind('click',function(){
                    var attr = $(this).attr('data-value');
                    self._doSthing(attr);
                });
            });
            // 判断是否是谷歌游览器 谷歌游览器因为不支持cookie在本地上存储 所以引入了HTML5
            if(window.navigator.userAgent.indexOf("Chrome") !== -1) {
                var tempCookeie = self._loadStorage("skinName"),
                    t;
                if(tempCookeie != "null") {
                    t = tempCookeie;
                }else {
                    t = 'default';
                }
                self._setSkin(t);
    
            }else {
                var tempCookeie = self._getCookie("skinName");
                self._setSkin(tempCookeie);
            }
            
        },
        /*
         * 进行判断 来设置css样式
         */
        _doSthing: function(attr) {
            var self = this,
                _config = self.config,
                _cache = self.cache;
            if(window.navigator.userAgent.indexOf("Chrome") !== -1) {
                self._doStorage(attr);
                var istrue = localStorage.getItem(attr);
                self._setSkin(attr);
            }else {
                var istrue = self._getCookie(attr);
                if(istrue) {
                    for(var i = 0; i < _cache.defaultList.length; i++) {
                        if(istrue == _cache.defaultList[i]) {
                            self._setSkin(_cache.defaultList[i]);
                        }
                    }
                }
            }
            
        },
        /*
         * 改变样式
         */
        _setSkin: function(skinValue){
            
            var self = this,
                _config = self.config;
            
            if(skinValue) {
                $(_config.link).attr('href',"style/"+skinValue+".css");
            }
            if(window.navigator.userAgent.indexOf("Chrome") !== -1) {
                self._saveStorage(skinValue);
            }else {
                self._setCookie("skinName",skinValue,7);
            }
            
        },
        /*
         * 重新
         */
        _doStorage: function(attr) {
            var self = this;
            self._saveStorage(attr);
        },
        /*
         * html5获取本地存储
         */
        _loadStorage: function(attr) {
            var str = localStorage.getItem(attr);
            return str;
        },
        /*
         * HTML5本地存储 
         */
        _saveStorage:function(skinValue) {
            var self = this;
            localStorage.setItem("skinName",skinValue);
        },
        /*
         * getCookie
         */
        _getCookie: function(name) {
            var self = this,
                _config = self.config;
            var arr = document.cookie.split("; ");
            for(var i = 0; i < arr.length; i+=1) {
                var prefix = arr[i].split('=');
                if(prefix[0] == name) {
                    return prefix[1];
                }
            }
            return name;
        },
        /*
         * _setCookie
         */
        _setCookie: function(name,value,days) {
            var self = this;
    
            if (days){
                var date = new Date();
                date.setTime(date.getTime()+(days*24*60*60*1000));
                var expires = "; expires="+date.toGMTString();
            }else {
                var expires = "";
            }
            document.cookie = name+"="+value+expires+"; path=/";
        },
        /*
         * removeCookie
         */
        _removeCookie: function(name) {
            var self = this;
    
            //调用_setCookie()函数,设置为1天过期,计算机自动删除过期cookie
            self._setCookie(name,1,1);
        }
     };
    
    // 初始化
    $(function(){
        new Skin({});
    });
     
    View Code

     DEMO下载

    转载于:https://www.cnblogs.com/tugenhua0707/p/3491580.html

    展开全文
  • 通过自定义样式或者组策略解决IE11浏览网页双击放大的问题,禁用IE双击放大的功能,避免玩游戏时的烦恼。 其中自定义样式方式有一键配置bat,用起来很简单,将DisableIEScaleOnDClick.bat复制到合适的用于保存...
  • 一、项目介绍 基于Vue2.5.6+Vuex+vue-cli+vue-router+vue-gemini-scrollbar+swiper+elementUI等技术混合架构开发的仿微信web端聊天室——vueWebChat,实现了发送消息、表情(动图),图片、视频预览,...•环境配置:node
  • 简介:用户只需在前端简单配置下指标,系统即可自动生成大宽,让用户查询到他所需要的实时数据,数据源支持跨库并支持多种目标介质。这样的数据全局实时可视化如何实现?本文从需求分析开始,分享自动生成SQL功能...

    fc32554f5a01542a50c8aec42e374f03.png
    简介:用户只需在前端简单配置下指标,系统即可自动生成大宽表,让用户查询到他所需要的实时数据,数据源支持跨库并支持多种目标介质。这样的数据全局实时可视化如何实现?本文从需求分析开始,分享自动生成SQL功能开发中运用到的设计模式和数据结构算法设计。

    ab512ed33455f02c1b8fe120884ad6f2.png

    一 概述

    ADC(Alibaba DChain Data Converger)项目的主要目的是做一套工具,用户在前端简单配置下指标后,就能在系统自动生成的大宽表里面查询到他所需要的实时数据,数据源支持跨库并支持多种目标介质。说的更高层次一点, 数据的全局实时可视化这个事情本身就是解决供应链数据“神龙效应”的有效措施(参考施云老师的《供应链架构师》[1]一书)。做ADC也是为了这个目标,整个ADC系统架构如下图所示:

    564be31dcf92fa8b80b453533b74ac08.png

    架构解析:

    • 初始数据来自于元数据中心。
    • 经过元数据适配层后转换为内部格式数据。
    • 调度中心把内部格式的数据传到计划中心,计划中心分析数据需求并建模,通过SQL生成器生成资源和SQL,分别通过告警中心、对账中心设定监控标准和对账标准。
      • 对账中心定时对账,查看数据的对齐情况。
      • 告警中心可以针对任务错误、延迟高等情况发送报警。
    • 资源的生命周期管控在资源管理中心下,view删除时资源管理中心负责回收资源。
    • 基础资源适配层主要借助集团基础资源管理能力串联阿里各类数据服务, 比如阿里云MaxComputer、Flink、阿里云AnalyticDB等。

    其中,SQL生成器的上游和下游主要涉及:

    • 上游计划中心
      • 配置指标:用户在前端配置他想看的数据有哪些。
      • 生产原始数据:根据用户输入得到哪些表作为数据源, 以及它们之间的连接关系。
    • 下游Metric适配器
    • 把SQL发布到Flink, 根据建表数据建物理表。

    本文主要从技术角度介绍下SQL生成器相关的内容。

    二 技术实现

    在项目实施阶段,需要从需求分析、技术方案设计、测试联调几个步骤展开工作。本文重点不放在软件开发流程上, 而是就设计模式选择和数据结构算法设计做下重点讲解。

    需求分析

    在需求分析阶段, 我们明确了自动生成SQL模块所需要考虑的需求点, 主要包含如下几点:

    • 需要支持多个事实表(流表)、多个维度表连表,其中一个事实表是主表,其他的均为辅助表。
    • 维表变动也应当引起最终数据库更新。
    • 主表对辅助表为1:1或N1,也就是说主表的粒度是最细的, 辅表通过唯一键来和主表连接。
    • 流表中可能存在唯一键一致的多张流表, 需要通过全连接关联。唯一键不同的表之间通过左连接关联。
    • 只有连表和UDF,没有groupby操作。
    • 要求同步延时较小,支持多种源和目标介质。由于查询压力在目标介质,所以查询qps没有要求。

    系统流程图

    明确需求后, 我们把SQL生成器总体功能分为两块:

    • 同步生成SQL和建表数据
    • 异步发布SQL和建表

    之所以把生成SQL阶段做成同步是因为同步阶段内存操作为主,如果发现数据有问题无法生成SQL能做到快速失败。发布阶段调用Metrics需要同步等待较长时间, 每个发布步骤要做到有状态记录, 可回滚或者重试。所以异步实现。SQL生成器同步阶段的整体功能细化到小模块,如下图所示:

    9f99333a23b8a83219538cda9e384ec4.png

    检查阶段

    检查原始数据是否有问题, 无法生成SQL则快速失败。

    • 参数检查:检查上游是否提供了基本的参数, 比如事实表信息(可以没有维表, 但是必须有事实表)。
    • 表类型检查:检查数据来源类型是否支持。
    • 分区字段检查:是否提供了大宽表分区字段。
    • 连接约束:检查流表,维表连接信息是否正确。
    • 主表唯一性约束:检查主表是否含连接信息,唯一键是否有ETL信息。
    • 元数据检查:检查是否包含HBase配置信息。
    • 主键修正:修正维表连接键, 必须是维表的唯一键。

    数据同步

    • 同步所有原始表和原始表的连接数据(比如源表同步进来, 生成1:1的HBase表)。
    • 生成优先级队列:生成连接和发布等任务的执行优先级。
    • 同步填充:填充源表对应的同步阶段HBase表数据,和对应的配置项, 类型转换(比如源表是MySQL表,字段类型要转换为HBase的类型), ETL填充, 添加消息队列(通过发送消息的方式通知下游节点运行)。
    • 重复列修剪:删除重复的列。
    • 空白列打标:对于满足一定条件(比如不需要在大宽表展示, 不是唯一键列, 连接键列, 保序列)的列打上空白列标识。
    • 保序字段填充:如果上游提供了表示数据创建时间的字段, 则用该字段作为数据保序字段, 没有则填充系统接收到数据的时间作为保序字段。

    计算阶段

    生成大宽表,填充SQL。

    • 中间表填充:填充全连接产生的中间表。
    • 连接关系升级:会在本文后面说明。
    • 反向索引填充:填充“反向索引”信息。
    • 消息填充:中间表添加消息队列(中间表更新可以触发下游节点)。
    • 大宽表填充:填充大宽表数据。
    • 连接链对齐:中间表和大宽表连接键对齐。
    • ETL填充:填充大宽表列的ETL信息。
    • 分区字段填充:填充大宽表分区字段。
    • SQL填充:填充Flink同步表映射SQL语句, Flink计算SQL语句, Flink结果表映射SQL语句。
    • 保存:把SQL和建表数据存入数据库, 之后的请求可以复用已有的数据, 避免重复建表。

    异步发布阶段会把SQL语句发布到Flink。

    添加反向索引的原因

    假如有A、B两表连接,那么连接方式为A表的非主键连接B表主键。从时序上来说可能有以下三种情况:

    • B表数据先于A表数据多天产生
    • B表数据后于A表数据多天产生
    • B表数据和A表数据同时产生

    下面我们就这三种情况逐一分析。

    场景1:B表数据先于A表数据多天产生

    我们假如B表数据存储于某个支持高qps的数据库内,我们可以直接让A表数据到来时直接连接此表(维表)来实现连表。

    场景2:B表数据后于A表数据多天产生

    这种场景比较麻烦。A表数据先行产生,因此过早的落库,导致B表数据到来时即使连接B维表也拿不到数据。这种场景还有一个类似的场景:如果AB连接完成后B发生了更新,如何让B的更新体现在宽表中?

    为了解决这种问题,我们增加了一个“反向索引表”。假如A的主键是id,连接键是ext_id,那么我们可以将ext_id和id的值存储在一张表内,当B的数据更新时,用B的主键连接这种表的ext_id字段,拉取到所有的A表id字段,并将A表id字段重新流入Flink。

    三 设计模式

    对系统整体流程有了解以后, 我们再来看看系统的设计模式选择,选择设计模式时,我们考虑到数据处理相关的开发工作存在一些共性:

    • 拆解后小功能多
    • 小功能存在复用情况
    • 小功能执行有严格的先后顺序
    • 需要记录小功能运行状态, 流程执行可回滚或者中断可恢复执行

    由于数据处理任务的步奏比较冗长,而且由于每个阶段的结果与下阶段的执行有关系,又不能分开。

    参考 PipeLine(流水线)设计模式[2],综合考虑后我们系统的整体设计如下图所示:

    abcf11b5d83defb8b534748255917c66.png

    首先有一个全局的PipeLineContainer管理多个pipeLine和pipeline context, 每个pipeline可独立执行一个任务, 比如pipeline1执行同步生成sql任务。pipeline2执行异步发布任务。发布必须在生成SQL结束后执行, pipeline有状态并且按一定顺序串联。每个pipeline包含多个可重用的valve(功能)。valve可以重用, 任意组合,方便完成更多的数据处理任务(比如以后如果要支持Tisplus dump平台接入, 则简单拼接现有的valve就可以)。

    四 数据结构和算法

    问题说明

    SQL生成器关键点, 就是把各个表(Meta节点)之间的关系表示出来。Meta之间的关系分为两类,分别是全连接关联和左连接关联(因为左连接关联涉及到数据的时序问题, 需要添加反向索引较为复杂, 所以和全连接区分了一下, 为了简化问题我们先执行全连接, 再执行左连接)。

    我们要解决的问题是, 多个数据源同步数据进来之后, 按一定的优先级关联, 最终得到一个大宽表并需要自动发布。抽象到数据结构层面就是:

    • 每个同步进来的数据源对应一个叶子节点
    • 节点之间有关联关系,关联关系有多类并有执行优先级
    • 所有节点和关联关系组成一棵树
    • 最终得到一个根节点(大宽表)并发布

    算法思路

    下面说明下解决该问题的算法思路。

    优先级队列

    因为叶子节点之间连接执行优先级不同,先放入优先级队列。之后每次取出高优先级任务执行。相同优先级任务可以复用, 连续执行多次。优先级队列示意图如下:

    945390a32fc807348a120d2098497148.png

    构建树

    有了优先级队列的概念, 我们来构建树。构建主要分以下步骤:

    1.首先得到四种优先级的任务, 优先级从高到低分别为:

    • 优先级1, 六个节点的同步任务
    • 优先级2,节点1、2、3和节点4、5的Full Join任务
    • 优先级3,节点1、4和节点6的Left Join任务
    • 优先级4, 发布任务

    2.取优先级1的任务执行,同步进来六个数据源对应六个叶子。

    3.取优先级2的任务并执行得到中间表1,2。

    4.取优先级3的任务并执行,发现节点1、4有父节点, 则执行中间节点1、2分别和节点6 Left Join得到根节点。

    5.取优先级4的任务并执行,发布根节点。

    5ecf0841361b5eb20d5c1f49bb056fb2.png

    可以看到最终的数据结构是一棵树, 通过这种方式我们能支持复杂sql的自动构建。进一步抽象, 这种“一个队列驱动一棵树生成”的模式可以解决一类问题:

    • 问题的解决由一系列不同优先级的任务组成, 任务需要复用。
    • 通过从队列取优先级高的任务的方式构建任务关系树。
    • 最后遍历树完成各个节点任务。

    五 总结

    限于篇幅, 本文重点在于介绍自动生成sql功能开发中运用到的主要数据结构和设计模式思想。

    目前我们实现了任意张表关联sql自动生成并发布, 整体延迟控制在2s以内。之后SQL生成器主要会针对方便接入更多第三方实时计算平台(比如Tisplus), 降低整体系统延迟工作展开。方便接入主要考验的是架构的设计, 也是本文着重写的点(包括数据结构和算法设计、设计模式的选择)。降低系统延迟则包括消息中间件优化,代码执行效率提升等。

    最后

    阿里巴巴供应链国际化团队欢迎广大有识之士加入,共同打造东半球零售业首选的国际化供应链平台。有意请联系:pengcheng.wang@alibaba-inc.com

    相关链接

    [1]https://book.douban.com/subject/26995807/
    [2]https://blog.csdn.net/buyoufa/article/details/51912262

    版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
    展开全文
  • 网页换肤基本原理

    2018-03-13 09:54:00
    除了切换 CSS 样式文件之外,通常的网页换肤还需要通过 Cookie 来记录用户之前更换过的皮肤,这样下次用户访问的时候,就可以自动使用上次用户配置的选项。 基本流程如下: 上面是使用流程图来描述下,自从...

     网页换肤的基本原理

      使用 JS 切换对应的 CSS 样式表。例如hao123首页的右上方就有网页换肤功能。除了切换 CSS 样式表文件之外,通常的网页换肤还需要通过 Cookie 来记录用户之前更换过的皮肤,这样下次用户访问的时候,就可以自动使用上次用户配置的选项。

      基本流程如下:

                                 

       上面是使用流程图来描述下,自从工作以来很小画这样的流程图 如果流程图画错了或者画的不够好 请大家原谅!

       先来看看效果图吧!

       

      我只是做个demo 来实现这样一个效果!假如页面上一进来的时候 有这么四个按钮 分别代表不同的样式 当我鼠标点击不同的按钮时候 切换不同的css文件 且切换时候记录cookie里面去,当我们刷新页面或者关闭网页 重新打开 由于cookie的存在 所以还是关闭前的css样式 这样就实现了简单的网页换肤功能效果 基本的原理就是这些!

     了解cookie及HTML5中sessionStorage和localStorage

      首先我们来了解下cookie是干什么用的?简单讲 cookie作用是客户端存储数据。也就是本地存储。具体的了解可以看我之前的一篇关于cookie的博客。深入了解cookie

      讲到cookie,我们再来简单的来了解下HTML5中新增了2个本地存储sessionStorage和localStorage. sessionStorage、 localStorage、cookie都是在浏览器端存储的数据,   其中sessionStorage的概念很特别,引入了一个“浏览器窗口”的概念。 sessionStorage是在同源的同窗口(或tab)中,始终存在的数据。也就是说只要这个浏览器窗口没有关闭,即使刷新页面或进入同源另一页面, 数据仍然存在。 关闭窗口后,sessionStorage即被销毁。同时“独立”打开的不同窗口,即使是同一页面,sessionStorage对象也是不同的。 
    Web  Storage 带来的好处: 减少网络流量:一旦数据保存在本地后,就可以避免再向服务器请求数据,因此减少不必要的数据请求,减少 数据在浏览器和服务器间不必要地来回传递。 快速显示数据:性能好,从本地读数据比通过网络从服务器获得数据快得多,本地数据可以即时获得。再加上网页本身也可以有缓存,因此整个页面和数据都在本地的话,可以立即显示。 临时存储:很多时候数据只需要在用户浏览一组页面期间使用,关闭窗口后数据就可以丢弃了,这种情况使用 sessionStorage非常方便。

     cookie sessionStorage及localStorage共同点及区别是什么?

     共同点:

       都是在浏览器端存储的数据,且同源的。

     区别:

         1. 存储大小不一样: cookie存储数据有限制 做多只能是4KB 而sessionStorage和localStorage可以存储5MB 甚至更多数据。

         2. cookie 数据始终在同源的http请求中携带,即cookie在浏览器和服务器间来回传递。而sessionStorage和 localStorage不会自动把数据发给服务器,仅在本地保存。

         3. 数据有效期不同: sessionStorage:仅在当前浏览器窗口关闭前有效,自然也就不可能持久保持; localStorage:始终有效,窗口或浏览器关闭也一直保存,因此用作持久数据; cookie只在设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭。

        4. 作用域不同, sessionStorage 不在 不同的浏览器窗口中共享,即使是同一个页面; localStorage 在所有同源窗口中都是共享的;cookie也是在 所有同源窗口中都是共享的。

     使用cookie碰到那些问题?

        首先来讲讲我在本地做demo 因为没有放到任何服务器下面 所以我直接放在桌面上 点击页面打开,突然发现 "谷歌游览器不支持cookie在本地存储"。所以针对这个问题在谷歌游览器下没有用cookie存储,而是用了上面介绍的HTML5中的localStorage作本地存储功能。通过setItem 设置key名 然后通过getItem获取key名 进而获取值。

    HTML代码如下:

    <p>前端开发是我的一个职业目标,我喜欢前端开发,热爱前端开发,喜欢制作各种各样的页面效果</p>
    <input type="button" data-value="default" class="targetElem" value="default"/>
    <input type="button" data-value="green" class="targetElem" value="green"/>
    <input type="button" data-value="red" class="targetElem" value="red"/>
    <input type="button" data-value="orange" class="targetElem" value="orange"/>

    CSS代码

     default.css 代码如下:

    @charset "utf-8";
    /* CSS Document */
    *{padding:0;margin:0;}
    h2{color:#00C;}
    p{color:#006;}

    orange.css代码如下:

    @charset "utf-8";
    /* CSS Document */
    *{padding:0;margin:0;}
    h2{color:#C60;}
    p{color:#C33;}

    green.css代码如下:

    @charset "utf-8";
    /* CSS Document */
    *{padding:0;margin:0;}
    h2{color:#060;}
    p{color:#060;}

    red.css代码如下:

    @charset "utf-8";
    /* CSS Document */
    *{padding:0;margin:0;}
    h2{color:#F00;}
    p{color:#F00;}
    js代码如下:
    /**
     * JS实现换肤功能
     */
    // Google Chrome只支持在线网站的cookie的读写操作,对本地html的cookie操作是禁止的。
    // name1=value1;name2=value2;name3=value3;name4=value4
     function Skin(options) {
     
        this.config = {
            targetElem                :  '.targetElem',
            link                      :  '#link'
        };
        this.cache = {
            defaultList        : ['default','green','red','orange']
        };
    
        this.init(options);
     }
    
     Skin.prototype = {
        
        constructor: Skin,
        init: function(options) {
            this.config = $.extend(this.config,options || {});
            var self = this,
                _config = self.config;
            
            $(_config.targetElem).each(function(index,item) {
                
                $(item).unbind('click');
                $(item).bind('click',function(){
                    var attr = $(this).attr('data-value');
                    self._doSthing(attr);
                });
            });
            // 判断是否是谷歌游览器 谷歌游览器因为不支持cookie在本地上存储 所以引入了HTML5
            if(window.navigator.userAgent.indexOf("Chrome") !== -1) {
                var tempCookeie = self._loadStorage("skinName"),
                    t;
                if(tempCookeie != "null") {
                    t = tempCookeie;
                }else {
                    t = 'default';
                }
                self._setSkin(t);
    
            }else {
                var tempCookeie = self._getCookie("skinName");
                self._setSkin(tempCookeie);
            }
            
        },
        /*
         * 进行判断 来设置css样式
         */
        _doSthing: function(attr) {
            var self = this,
                _config = self.config,
                _cache = self.cache;
            if(window.navigator.userAgent.indexOf("Chrome") !== -1) {
                self._doStorage(attr);
                var istrue = localStorage.getItem(attr);
                self._setSkin(attr);
            }else {
                var istrue = self._getCookie(attr);
                if(istrue) {
                    for(var i = 0; i < _cache.defaultList.length; i++) {
                        if(istrue == _cache.defaultList[i]) {
                            self._setSkin(_cache.defaultList[i]);
                        }
                    }
                }
            }
            
        },
        /*
         * 改变样式
         */
        _setSkin: function(skinValue){
            
            var self = this,
                _config = self.config;
            
            if(skinValue) {
                $(_config.link).attr('href',"style/"+skinValue+".css");
            }
            if(window.navigator.userAgent.indexOf("Chrome") !== -1) {
                self._saveStorage(skinValue);
            }else {
                self._setCookie("skinName",skinValue,7);
            }
            
        },
        /*
         * 重新
         */
        _doStorage: function(attr) {
            var self = this;
            self._saveStorage(attr);
        },
        /*
         * html5获取本地存储
         */
        _loadStorage: function(attr) {
            var str = localStorage.getItem(attr);
            return str;
        },
        /*
         * HTML5本地存储 
         */
        _saveStorage:function(skinValue) {
            var self = this;
            localStorage.setItem("skinName",skinValue);
        },
        /*
         * getCookie
         */
        _getCookie: function(name) {
            var self = this,
                _config = self.config;
            var arr = document.cookie.split("; ");
            for(var i = 0; i < arr.length; i+=1) {
                var prefix = arr[i].split('=');
                if(prefix[0] == name) {
                    return prefix[1];
                }
            }
            return name;
        },
        /*
         * _setCookie
         */
        _setCookie: function(name,value,days) {
            var self = this;
    
            if (days){
                var date = new Date();
                date.setTime(date.getTime()+(days*24*60*60*1000));
                var expires = "; expires="+date.toGMTString();
            }else {
                var expires = "";
            }
            document.cookie = name+"="+value+expires+"; path=/";
        },
        /*
         * removeCookie
         */
        _removeCookie: function(name) {
            var self = this;
    
            //调用_setCookie()函数,设置为1天过期,计算机自动删除过期cookie
            self._setCookie(name,1,1);
        }
     };
    
    // 初始化
    $(function(){
        new Skin({});
    });

     

    转载于:https://www.cnblogs.com/yang6120yang/p/8553888.html

    展开全文
  • 首先我们要先配置好web制作所需要的软件,在mysql数据库当中建立,建立用户名和密码在java ee上编写连接mysql数据库的代码String num = request.getParameter("num");session.setAttribute("username",num);String...

    登陆网页的简单功能的实现

    输入用户名和密码与数据库当中的用户名和密码匹配上,则登陆成功。

    首先我们要先配置好web制作所需要的软件,在mysql数据库当中建立表,建立用户名和密码

    6999ed886f8bf666d398c1a29b1470e5.png

    在java ee上编写连接mysql数据库的代码

    String num = request.getParameter("num");

    session.setAttribute("username",num);

    String userpassword = request.getParameter("userpassword");

    Class.forName("com.mysql.jdbc.Driver");

    Connection connect = DriverManager.getConnection(

    "jdbc:mysql://localhost:3306/test","root","20153126");

    Statement stmt = connect.createStatement();

    String sql = "select * from user where name='"+num+"'and userpassword='"+userpassword+"'";

    ResultSet i = stmt.executeQuery(sql);

    if(i.next())

    {

    response.setHeader("refresh","1;url = index1.html");

    }

    else

    {

    out.println("");

    response.setHeader("refresh","1;url = login.html");

    }

    stmt.close();

    connect.close();

    %>

    ml>

    连接上数据库之后,在dreamwearver中画出网页的登录界面,转化成代码,复制粘贴进去到java ee 中,

    代码:

    Insert title here无标题文档
    用户名 
    密码 

    在网页中输入用户名和密码

    dc2fa09b2a4575d4c886377ceb02b476.png

    输入正确的用户名和密码后:

    ecfb05f9f83ef1caf367a001776c1085.png

    代码:

    无标题文档

    登录成功!

    输入错误后:

    8950e8aeeb718a18a45e241d1f67015c.png

    具体方法:从数据库中查找登录界面中输入的用户名的密码,如果有,则返回正确的密码,否则 ,返回null;然后重写doget方法,对登录进行响应,如果输入的密码与从数据库中返回的密码相同,那么转到登录成功后的界面,如果登录失败,那么则提示用户重新登录。

    展开全文
  • web网页登陆

    2017-02-23 20:00:00
    登陆网页的简单功能的实现 输入用户名和密码与数据库当中的用户名和密码匹配上,则登陆成功。 首先我们要先配置好web制作所需要的软件,在mysql数据库当中建立,建立用户名和密码 在java ee上编写连接mysql...
  • 网页自动点击软件

    千次阅读 2013-02-04 20:31:42
    网页自动点击软件目录下有一个webapp.xml,使用时可以修改该配置来模拟网页自动点击功能 autoclick 的属性 enable表示启用还是禁用自动点击 autoclick 的属性 timeout 每...
  • Web网页登录设计

    2017-02-24 19:01:00
    首先我们要先配置好web制作所需要的软件,在mysql数据库当中建立,建立用户名和密码 在java ee上编写连接mysql数据库的代码 <%@ page contentType = "text/html; charset=utf-8" i...
  • 特征:为Twitter Bootstrap创建(支持所有版本)响应式网页设计具有固定标题的可滚动完全可配置通过数据属性显示/隐藏列显示/隐藏标题显示/隐藏页脚使用AJAX获取JSON格式的数据单击即可进行简单的列排序格式栏单行...
  • JavaScript实现换肤功能

    2021-01-19 18:28:13
    除了切换 CSS 样式文件之外,通常的网页换肤还需要通过 Cookie 来记录用户之前更换过的皮肤,这样下次用户访问的时候,就可以自动使用上次用户配置的选项。 那么基本工作流程就出来了:访问网页——JS 读取 Cookie...
  • 2.网页的基本元素 2rules属性值 none 无格线 groups 仅在行组和列组间有格线 rows 仅有行间格线 cols 仅有列间格线 all 有行和列格线 3border=像素 设定... 表格修饰 HTML提供了配置表格元素背景色的功能并可以设定
  • PHP动态网页设计与制作案例教程

    热门讨论 2012-12-12 10:53:30
    详细地介绍动态网页设计和制作的技术和相关理论,全书共分为8章,主要内容包括:动态网站设计概述、动态网站编程环境、网站主页设计与PHP基础、网站计数器设计与PHP文件访问、会员注册和管理设计与数据获取、网上...
  • Discuz网页斗地主插件

    2013-05-05 20:16:26
    Discuz网页斗地主插件V2SP3正式稳定版,消耗会员积分,支持多人联机和X2.5版本! 这是一款能集成到论坛的社交游戏 。 插件特点: 1.可与社区积分数据共享-消耗用户积分(站长可在启动.exe里控制积分消耗数量) 2....
  • 2方法 uploadify 插件的常用方法及说明如 9-3 所示 9-3 uploadify 插件的常用方法及说明 3事件 ...zTree 插件是一款基于 jQuery 实现的多功能树插件优异的性能灵活的配置多种功能的组合是zTree最大的优
  • 采用html模板生成静态网页

    千次阅读 2011-08-29 08:37:52
    利用自己已有的XML配置读取和格式化数据的功能,采用自定义标签实现网站页面html模板生成静态网页。 自定义标签如下: #表名.记录索引.字段名# 例如:#t.0.id#表示t的第一行的id字段的值 #REPEAT-ROW-表名#行...
  • 除了切换 CSS 样式文件之外,通常的网页换肤还需要通过 Cookie 来记录用户之前更换过的皮肤,这样下次用户访问的时候,就可以自动使用上次用户配置的选项。 那么基本工作流程就出来了:访问网页——JS 读取 Cookie...
  • Nginx ("engine x")安装与配置

    千次阅读 2016-05-17 21:04:18
    1Nginx ("engine x") 1.1简介 ...由IgorSysoev为俄罗斯访问量第二的Rambler.ru站点开发。...Nginx因它的稳定性、丰富的功能集、...其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中
  • ajax实现网页的局部刷新

    千次阅读 2015-05-17 18:22:45
    通过web.xml的配置的servlet-mapping,url所附带的参数会被处理的servlet类接收,此类中可进行数据库的查询,并将查询结果以xml文件的格式保存下来,页面会以解析xml文件将值传到前台,完成了局部刷新的功能。...
  • 作为一个node 初学者,最近在做一个聊天软件,支持注册、登录、在线单人、多人聊天、表情发送、各种文件上传下载、增删好友、聊天记录保存、通知声开关、背景图片切换、游戏等功能...,终于成功实现单个文件上传功能...
  • 当我们使用nginx-rtmp时并希望同时使用http功能,这里我们使用nginx的配置文件,开启ssi使nginx支持静态网页时,我们遇到页面无法正常加载css的问题。寻找原因我们发现配置文件中缺少#文件扩展名与文件类型映射 ...
  • 2、配置Tomcat-设置项目启动路径,默认浏览器,默认启动端口 3、测试项目能否正常跑起来 4、导入相应的依赖-jsp-Servlet-mysql驱动-jstl-standard-Junit 5、构建项目相应的包结构 dao数据库操作包 filter过滤器...
  • ASP.NET的网页代码模型及生命周期

    热门讨论 2009-07-28 14:22:11
    第4章 ASP.NET的网页代码模型及生命周期 从本章开始,就进入了ASP.NET应用程序开发的世界。在了解了C#的结构,以及面向对象的概念后,就可以从面向对象的思想开发ASP.NET应用程序。在ASP.NET中,能够使用面向对象的...
  • 【自然框架】稳定版beta1——源码下载,Demo说明 下载地址:还是老地方,自然框架的源代码、Demo、数据库、配置信息管理程序下载(2010.01.25更新) (补充了一个元数据的 数据库结构说明文档,在上面的网页里下载...
  • 界面改进:种子清单工具列增加按钮显示设定功能表 界面改进:种子清单设置功能表增加整理资料库命令 界面改进:DHT种子清单增加选项:仅显示带有元数据的种子 界面改进:RSS种子列表增加RSS源名称 界面改进:种子...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 413
精华内容 165
关键字:

网页功能配置表