不再犹豫
分享是一种美德

一般动态创建元素可以通过两种方式

mrnaas阅读(1057)

1、Dom HTml

 var select = document_createElement_x_x_x("select");
     select.options[0] = new Option("加载项1", "value1");
     select.options[1] = new Option("加载项2", "value2");
     select.size = "2";
     testDiv.a(select);
     });

通过document的createElement_x_x_x方法创建,然后通过a方法添加到指定的对象中即可

2、JQuery函数创建

 $("动态创建的div")


    通过append,appendto,prepend,prependto等方法添加到指定的对象中,具体可以查看

3、页面加载的时候最好在页面加载完后执行创建

   可以使用window.onload,但是在添加新的元素, 但是不幸的是浏览器执行window.onload函数不仅仅是在构建完DOM树之后, 也是在所有图像和其他外部资源完整的加载并且在浏览器窗口显示完毕之后. 所以如果某个图片或者其他资源加载很长时间, 访问者就会看到一个不完整的页面, 甚至在图片加载之前就执行了需要依赖动态添加的元素的脚本而导致脚本错误.

解决办法就是等DOM被解析后, 在图像和外部资源加载之前执行我们的函数.在jQuery中让这一实现变得可行

$(document).ready(
        function() { testDiv.innerHTML = "

使用动态创建的$(document).ready(function)方法
"; }
);

或者使用简便语法:

//jQuery 使用$(function)方法
$(
        function() { testDiv.innerHTML += "
使用$(function)方法
"; } );

使用$()将我们的函数包装起来即可. 而且可以在一个页面绑定多个函数, 如果使用传统的window.onload则只能调用一个函数.

所以请大家将修改DOM的函数使用此方法调用. 另外还要注意document_createElement_x_x_x和innerHTML的区别. 如果可以请尽量使用document_createElement_x_x_x和$(“”)的形式创建对象.

JS闭包学习

mrnaas阅读(980)

闭包

  能够访问另一个函数作用域的变量的函数。清晰的讲:闭包就是一个函数,这个函数能够访问其他函数的作用域中的变量。

下面inner 就是一个闭包函数,因为他能够访问到outer函数的作用域

function outer() {
      var  a = '变量1'
      var  inner = function () {
             console.info(a)
      }
     return inner;
 }

闭包是站在作用域的角度上来定义的,因为inner访问到outer作用域的变量,所以inner就是一个闭包函数。虽然定义很简单,但是有很多坑点,比如this指向、变量的作用域,稍微不注意可能就造成内存泄露。

坑点一,引用的变量可能发生变化

 function outer() {
       var result = [];
       for (var i = 0; i<10; i++){
         result.[i] = function () {
             console.info(i)
         }
      }
      return result
 }

看样子result每个闭包函数对打印对应数字,1,2,3,4,…,10, 实际不是,因为每个闭包函数访问变量i是outer执行环境下的变量i,随着循环的结束,i已经变成10了,所以执行每个闭包函数,结果打印10, 10, …, 10。这时,可以使用闭包保存临时数据:

 function outer() {
       var result = [];
       for (var i = 0; i<10; i++){
         result.[i] = function (num) {
              return function() {
                    console.info(num);    
              }
         }(i)
      }
      return result
 }

此时访问的num,是上层函数执行环境的num,数组有10个函数对象,每个对象的执行环境下的number都不一样。

坑点二,this指向问题

 var object = {
      name: ''object",
      getName: function() {
         return function() {
              console.info(this.name)
         }
     }
 }
 object.getName()()    // underfined

因为里面的闭包函数是在window作用域下执行的,也就是说,this指向windows

坑点三,内存泄露问题

 function  showId() {
     var el = document.getElementById("app")
     el.onclick = function(){
       aler(el.id) 
     }
 }

这样会导致闭包引用外层的el,当执行完showId后,el无法释放,因此需要手动置空

 function  showId() {
     var el = document.getElementById("app")
     var id  = el.id
     el.onclick = function(){
       aler(id)
     }
     el = null  // 主动释放el
 }

技巧1,用闭包解决递归调用问题

function  factorial(num) {
   if(num<= 1) {
       return 1;
   } else {
      return num * factorial(num-1)
   }
}
var anotherFactorial = factorial
factorial = null
anotherFactorial(4)

报错 ,因为最好是return num* arguments.callee(num-1),arguments.callee指向当前执行函数,但是在严格模式下不能使用该属性也会报错,所以借助闭包来实现。

 function newFactorial = (function f(num){
     if(num<1) {return 1}
     else {
        return num* f(num-1)
     }
 })

这样就没有问题了,实际上起作用的是闭包函数f,而不是外面的函数newFactorial。

技巧2,用闭包模仿块级作用域

es6没出来之前,用var定义变量存在变量提升问题,当然现在大多用es6的let 和const 定义。

 for(var i=0; i<10; i++){
     console.info(i)
 }
 alert(i)  // 变量提升,弹出10
 
 //为了避免i的提升可以这样做
 (function () {
     for(var i=0; i<10; i++){
          console.info(i)
     }
 })()
 alert(i)  // underfined   因为i随着闭包函数的退出,执行环境销毁,变量回收

红绿灯下

CN、古哥阅读(1569)

在城市,当你走到十字街头时,往往会与红绿灯相遇。

  说来好笑,我最初来到城市时,最怕的就是过街。在西安和北京求学期间,只要是有天桥和地下通道,我绝不走十字街。我对红绿灯不信任,它们闪来闪去的,像是两只鬼眼,变幻太快,常常是绿灯一亮,我起步走,却遭逢侧向驶来的一串汽车,它们占据了半边路,阻断你。等它们过去后,你再前行,绿灯的心房就颤动了,红灯随之亮起,你被隔在马路中央,身前身后是川流不息的车辆,有被钢铁夹击的感觉。此时我总会联想起卓别林的《摩登时代》中,那个被卡在机器中的工人,觉得自己是工业化时代的一个可怜虫。

  我喜欢回到故乡,其中的一个缘由是,在乡间路上,我不会为红绿灯左右。能够阻断我脚步的,有时是一群黄昏中归家的羊,有时是几只正午时通过堤坝,要下河戏耍的鸭子。

  据说在交通事故中,死于红绿灯下的行人占了很大比例。闯红灯,是肇事的元凶。有时是汽车闯红灯殃及行人,有时是行人闯红灯自蹈黄泉,这样的行人无疑就是举着阎王爷掷来的招魂牌在过街。不管责任在哪一方,倒霉的总归是人。所以家长送孩子上学的路上,在过十字街时,如临虎口,总要拉起孩子的手。在幼儿教育中,学会通过红绿灯下的街口,也成了必修课。走到红绿灯下,人的心就会紧张起来,你要眼观六路,耳听八方,稍有不慎,就会酿下惨祸。在我眼中,十字街就像匍匐在大地的十字架,它主宰着人的生死。

  我在哈尔滨生活以后,习惯了走红绿灯。前些年,每当过十字街时,看见绿灯闪烁了,我会一路飞奔,分秒必争,抢在红灯敲响警钟时到达街对面。由于年轻,体力充沛,我与绿灯的赛跑很少有输的时候。当街口的行人集体闯红灯时,我也尾随其后,大摇大摆地招摇过市。汽车像一支支飞来的箭,刷刷地在我们身旁呼啸而过,可是大家对它们毫无惧色,我也心底泰然。

  二○○二年初春,爱人离开哈尔滨时,带我去花店买花。我们到了海城街的鲜花批发市场,我选了一束红色康乃馨,几枝黄玫瑰。当我把玫瑰拿在手中的时候,爱人说,别老买黄色的,换点鲜艳的颜色吧。于是,我挑了两枝娇艳的粉色玫瑰。他捧着康乃馨,我拿着玫瑰,散步回家。经由红军街桥下的十字路口时,恰好赶上绿灯眨眼了,我说等下一个绿灯再过吧。爱人说,你跟着我,能抢过去的!他个子高,步伐大,很快就跑到街对面了。我呢,一见红灯亮了,腿立刻就软了,向回撤。这样,我站在街这头,他站在对面,我们中间,是一台连着一台的疾驰的车辆。车辆就像汪洋大海,把我们分开了。三天后,爱人在回故乡的山间的公路上出了车祸。故乡的路没有红绿灯,可是他为了早点回到工作的地方,急于赶路,还是出了事故。他的心中,看来一直亮着一盏颤动的绿灯啊。他是一个疯狂的旅人,只知道一刻不停地向前赶,赶,赶。这种“赶”,这种热情的“奔命”,使我们一个在此岸,一个在彼岸,永隔着万水千山。他像流星,以为自己生命的光华还很漫长,却不知道当他飞速掠过天际的时候,迎接他的却是永恒的寂静。

  爱人离去后,我身边没了陪伴的人,可是路还是要走下去的。我曾在十字街头为他焚烧纸钱,都说那是灵魂聚集的地方。再经过那样的路口时,我感觉有无数的灵魂在幽幽地歌唱。远远地看到绿灯要变幻了,我便会放慢脚步,在路边静心等待;人们蜂拥着闯红灯时,我也会原地不动,气定神凝地候着。红绿灯下那些步履匆匆、神色慌张的路人,在我眼里是那么的可怜可笑。

  我想,人生是可以慢半拍,再慢半拍的。生命的钟表,不能一味地往前拨,要习惯自己是生活的迟到者。人是弱的,累了,就要休息;高兴了,就要开怀大笑。郁闷的时候,何苦要掩饰自己,对着青山绿水呼喊吧。我们可以与友人畅饮,一醉方休;也可以对那些邪恶的人当面示以唾弃。我们可以在月夜下多几分缠绵,也可以在旅途中因着美好的风景而多几日的停留。随遇而安,随缘而行。随风而舞,随雨而歌!

  是的,我们要给自己多亮几盏红灯,让生命有所停顿,有所沉吟。这样的红灯,就是我们生命中不息的火焰!只有这样,弱的生命才会变成强的生命,暗淡的生命才会变成有光华的生命!当生命的时针有张有弛、疾徐有致地行走的时候,我们的日子,才会随着日升月落,发出流水一样清脆的足音。

来源:https://www.lz13.cn/meiwen/183890.html

CSS样式规范

wangtong阅读(1616)

页面制作思想原则
始终保证HTML、CSS的轻量化,把复杂的事情简单化,把简单的事情模块化,用尽可能简洁的代码实现所需的页面。

页面制作布局规范
1.页面title格式
以下划线()分割,格式:内容标题栏目标题

2.页面分为Layout和Block两大类 Layout部分负责限定总体尺寸及构建页面基本轮廓。 Block部份依实际内容分别定制最外层以div标签包裹,尺寸一般不做限定,模块尽量设置overflow样式以控制出错成本。

3.关于重用 当页面中相似模块较多时,可考虑将其结构制作成公用模块,以方便重用。 重用模块主要以结构重用为目的,对于模块中的文字、链接等细节等的处理,可以通过给其附加额外的class进行扩展。

样式命名及参数规范
1.一律采用px为数值单位
2.按钮以btn开头命名
3.图标以ico开头命名
4.Layout模块的样式以la为前缀命名。
5.重用模块的命名以前缀re开头以方便识别,重用样式建立修改必需慎重。
6.样式继承的起始为点为该标签所在的Block,继承层级尽量控制在4个以内。
7.样式套用顺序:重用样式 预置样式 私有样式。
8.样式名以前缀+Camel风格命名,例:la_showDemo
9.大型项目时可考虑给body设置class以提供额外的全局判断,利于细节扩展。

图片文件命名整合规范
1.临时文件以下划线开头(_)开头,应确保在任何情况下该文件被删除时都不会影响到网页的设计需求。例:photo.jpg
2.背景图片以bg开头来命名
a.大图独立命名,体积以控制在70KB以内为宜。
b.有固定宽高之一的平铺图片根据轴向以bg_x.jpg或bgy.jpg命名整合在一起,以1px不同色块间隔,存储成质量为100的jpg。
(考虑到平铺图片的特性,若有尺寸上的修改,原则上以删除旧图,在图片末尾处添加新图为准,不要试图在原处修改,以免出现管理混乱。)
c.有延伸要求的平铺图片务必独立命名,不可贪图方便整合进其他图片。格式为:前缀轴向_实例名。例:bg_xpage.jpg
3.网站常规的样式图片可根据需求选择jpg或gif格式,以img.jpg或img.gif命名。
4.gif动画文件需同类整合,以m为前缀,注意控制图片体积。
5.现阶段尽量不用png。

常用hack
注意:良好的结构比任何hack都好,尽量少用。
width:1px;*width:1px;_width:1px; ff,ie7,ie6

附表
复制内容到剪贴板
代码:
样式命名规范表
类型 前缀 命名示例
网页结构 la_ lashowDemo
普通模块 无 showDemo
重用模块 re re showDemo
图标 ico ico showDemo
按钮 btn btn showDemo
复制内容到剪贴板
代码:
图片命名规范表
类型 规范 命名示例
普通图片 无 photo.jpg
整合图片 img+数字(可选) img.gif | img1.gif
gif动画 m前缀 mico.gif
大尺寸背景图 bg命名 bgtop.jpg
平铺图片(限定) bg轴向 bgx.jpg
平铺图片(延伸) bg轴向_命名 bg_xpage.jpg
临时图片 _photo.jpg

火狐CSS hack -moz

mrnaas阅读(1019)

-moz火狐CSS hack

Mozilla浏览器支持一些扩展的CSS是以-moz开头的。这些措施包括了一些功能,包括圆形边界,并能够指定不同的方块的宽度和高度的计算,在非标准方式下,这种css在Mozilla浏览器下执行计算更容易得到支持。

有些特性在后来被提议列入的CSS规范,但标准的属性与-moz属性还是有些不同。

其中一些非标准属性只适用于Mozilla浏览器。

At-rules

@-moz-document
Pseudo-elements and pseudo-classes

:-moz-list-bullet控制list-style的大小。
:-moz-first-node伪对象:第一个节点。
:-moz-last-node 伪对象:最后一个节点。
:-moz-only-whitespace伪对象:空白内容。
:-moz-bound-element
:-moz-any-link (matches :link and :visited)
:-moz-drag-over
:-moz-tree-row
:-moz-tree-row(hover) New in Firefox 3
:-moz-tree-cell
:-moz-tree-checkbox
:-moz-tree-column
:-moz-tree-cell-text
:-moz-tree-cell-text(hover) New in Firefox 3
:-moz-tree-twisty
:-moz-tree-indentation
:-moz-tree-line
:-moz-tree-image
:-moz-tree-separator
:-moz-tree-drop-feedback
:-moz-tree-progressmeter
:-moz-system-metric(windows-default-theme) New in Firefox 3
:-moz-system-metric(mac-graphite-theme) New in Firefox 3.1 bug 448767
:-moz-system-metric(images-in-menus) New in Firefox 3
:-moz-system-metric(scrollbar-start-backward) New in Firefox 3
:-moz-system-metric(scrollbar-start-forward) New in Firefox 3
:-moz-system-metric(scrollbar-end-backward) New in Firefox 3
:-moz-system-metric(scrollbar-end-forward) New in Firefox 3
:-moz-system-metric(scrollbar-thumb-proportional) New in Firefox 3
:-moz-alt-text New in Firefox 3
:-moz-placeholder New in Firefox 3
:-moz-broken New in Firefox 3
::-moz-svg-foreign-content
::-moz-scrolled-page-sequence
::-moz-scrolled-content
::-moz-anonymous-block
::-moz-cell-content
::-moz-anonymous-positioned-block
::-moz-pagecontent
::-moz-page
::-moz-page-sequence
::-moz-pagebreak
::-moz-viewport
::-moz-viewport-scroll
::-moz-canvas
::-moz-scrolled-canvas
::-moz-xul-anonymous-block
::-moz-table
::-moz-table-cell
::-moz-table-row-group
::-moz-table-column-group
::-moz-table-column
::-moz-table-row
::-moz-table-outer
::-moz-inline-table
Properties

-moz-appearance
-moz-binding
-moz-background-clip
-moz-background-inline-policy
-moz-background-origin
-moz-border-image New in Firefox 3.1 bug 378217
-moz-border-top-colors
-moz-border-right-colors
-moz-border-bottom-colors
-moz-border-left-colors
-moz-border-radius
-moz-border-radius-topleft
-moz-border-radius-topright
-moz-border-radius-bottomleft
-moz-border-radius-bottomright
-moz-box-align
-moz-box-direction
-moz-box-flex
-moz-box-ordinal-group
-moz-box-orient
-moz-box-pack
-moz-box-shadow New in Firefox 3.1 bug 212633
-moz-box-sizing
-moz-image-region
-moz-box-flexgroup
-moz-opacity Obsolete
-moz-outline Deprecated
-moz-outline-color Deprecated
-moz-outline-offset
-moz-outline-radius
-moz-outline-radius-topleft
-moz-outline-radius-topright
-moz-outline-radius-bottomleft
-moz-outline-radius-bottomright
-moz-outline-style Deprecated
-moz-outline-width Deprecated
-moz-user-focus
-moz-user-input
-moz-user-modify
-moz-user-select
-moz-window-shadow New in Firefox 3.1 bug 450939

CSS3 Box
o overflow-x
o overflow-y

CSS3 Columns
o -moz-column-count
o -moz-column-gap
o -moz-column-width
o -moz-column-rule New in Firefox 3.1 bug 271586
o -moz-column-rule-width New in Firefox 3.1 bug 271586
o -moz-column-rule-style New in Firefox 3.1 bug 271586
o -moz-column-rule-color New in Firefox 3.1 bug 271586

CSS transforms
o -moz-transform New in Firefox 3.1
o -moz-transform-origin New in Firefox 3.1

-moz-float-edge

-moz-border-end
-moz-border-end-color
-moz-border-end-style
-moz-border-end-width
-moz-border-start bug 74880
-moz-border-start-color
-moz-border-start-style
-moz-border-start-width
-moz-margin-end
-moz-margin-start
-moz-padding-start
-moz-padding-end
-moz-force-broken-image-icon
-moz-stack-sizing New in Firefox 3.1
Values

cursor
o -moz-alias
o -moz-cell
o -moz-context-menu
o -moz-copy
o -moz-grab
o -moz-grabbing
o -moz-spinning
o -moz-zoom-in
o -moz-zoom-out

display
o -moz-box
o -moz-inline-block
o -moz-inline-box
o -moz-inline-grid
o -moz-inline-stack
o -moz-inline-table
o -moz-grid
o -moz-grid-group
o -moz-grid-line
o -moz-groupbox
o -moz-deck
o -moz-popup
o -moz-stack
o -moz-run-in
o -moz-compact
o -moz-marker

overflow
o -moz-scrollbars-horizontal
o -moz-scrollbars-none
o -moz-scrollbars-vertical
o -moz-hidden-unscrollable

Note: All of these values should be considered deprecated. Use of the overflow-x and overflow-y is preferred, although it does not replace the last of these.

border-style and outline-style
o -moz-bg-inset - Makes the inset border to blend with then current background (scheduled for removal bug 84307 )
o -moz-bg-outset - Makes the outset border to blend with then current background (scheduled for removal bug 84307 )
o -moz-bg-solid - Makes the solid border to blend with then current background (scheduled for removal bug 84307 )

border-color
o -moz-use-text-color

For all properties accepting color keywords
o -moz-activehyperlinktext
o -moz-hyperlinktext
o -moz-visitedhyperlinktext
o -moz-buttondefault
o -moz-buttonhoverface
o -moz-buttonhovertext
o -moz-cellhighlight
o -moz-cellhighlighttext
o -moz-field
o -moz-fieldtext
o -moz-dialog
o -moz-dialogtext
o -moz-dragtargetzone
o -moz-mac-accentdarkestshadow
o -moz-mac-accentdarkshadow
o -moz-mac-accentface
o -moz-mac-accentlightesthighlight
o -moz-mac-accentlightshadow
o -moz-mac-accentregularhighlight
o -moz-mac-accentregularshadow
o -moz-mac-chrome-active New in Firefox 3.1 bug 449833
o -moz-mac-chrome-inactive New in Firefox 3.1 bug 449833
o -moz-mac-focusring
o -moz-mac-menuselect
o -moz-mac-menushadow
o -moz-mac-menutextselect
o -moz-menuhover
o -moz-menuhovertext
o -moz-win-communicationstext New in Firefox 3
o -moz-win-mediatext New in Firefox 3
o -moz-nativehyperlinktext New in Firefox 3.1 bug 426732

empty-cells
o -moz-show-background (default value in quirks mode)

font-family
o -moz-fixed

font
o -moz-button
o -moz-info
o -moz-desktop
o -moz-dialog (also a color)
o -moz-document
o -moz-workspace
o -moz-window
o -moz-list
o -moz-pull-down-menu
o -moz-field (also a color)

text-align
o -moz-center
o -moz-left
o -moz-right

text-decoration
o -moz-anchor-decoration

-moz-user-select
o -moz-all
o -moz-none

list-style-type
o -moz-arabic-indic
o -moz-bengali
o -moz-cjk-earthly-branch
o -moz-cjk-heavenly-stem
o -moz-devanagari
o -moz-ethiopic-halehame
o -moz-ethiopic-halehame-am
o -moz-ethiopic-halehame-ti-er
o -moz-ethiopic-halehame-ti-et
o -moz-ethiopic-numeric
o -moz-gujarati
o -moz-gurmukhi
o -moz-hangul
o -moz-hangul-consonant
o -moz-japanese-formal
o -moz-japanese-informal
o -moz-kannada
o -moz-khmer
o -moz-lao
o -moz-malayalam
o -moz-myanmar
o -moz-oriya
o -moz-persian
o -moz-simp-chinese-formal
o -moz-simp-chinese-informal
o -moz-tamil
o -moz-telugu
o -moz-thai
o -moz-trad-chinese-formal
o -moz-trad-chinese-informal
o -moz-urdu

width , min-width , max-width (see bug 311415 )
o -moz-min-content New in Firefox 3
o -moz-fit-content New in Firefox 3
o -moz-max-content New in Firefox 3
o -moz-available New in Firefox 3

-moz-appearance
o -moz-win-browsertabbar-toolbox New in Firefox 3
o -moz-win-communications-toolbox New in Firefox 3
o -moz-win-media-toolbox New in Firefox 3
o -moz-mac-unified-toolbar New in Firefox 3.1

Others

color ‘functions’
o -moz-hsla (hue, saturation, lightness, opacity)
o -moz-rgba

-moz-initial - The value -moz-initial is a partial implementation of css3’s initial used to apply the CSS specification’s initial value of a property to an element.

-moz-math-columnline

-moz-math-firstcolumn
-moz-math-firstrow
-moz-math-font-size
-moz-math-font-style
-moz-math-lastcolumn
-moz-math-lastrow
-moz-math-rowline
CSS Transforms

From CSS Transforms spec (Webkit)

-moz-transform CSS Transforms introduction New in Firefox 3.1 bug 435293
-moz-transform-origin New in Firefox 3.1 bug 435293

跨浏览器兼容实现首段首字下沉效果的CSS代码

mrnaas阅读(1116)

之前有朋友问过类似的问题,找了找相关的资料,找到了,分享一下,希望能帮助大家!
CSS代码如下:

.parent_class>p:first-child:first-letter{ 
font-size:2.5em; 
padding:5px 5px 0 0; 
float:left; 
font-family:楷体,楷体_GB2312; 
font-weight:bold; 
color:#E6192C; 
line-height:1.2em; 
}

其中.parent_class为p标签的父级元素,最后一行指定行高为了兼容IE,否则ie显示会错位。字体的话,好像在xp下,用“楷体”不能识别,必须用“楷体_GB2312”,而win7下正常。其它内容可按需要更改为你想要的效果。

网页设计:色彩搭配原则及方法

wangtong阅读(1161)

在这一篇中将介绍色彩搭配原则和方法!
一、色彩搭配原则
在选择网页色彩时,除了考虑网站本身的特点外还要遵循一定的艺术规律,从而设计出精美的网页。
1.色彩的鲜明性:
如果一个网站的色彩鲜明,很容易引人注意,会给浏览者耳目一新的感觉。
2.色彩的独特性:
要有与众不同色彩,网页的用色必须要有自己独特的风格,这样才能给人浏览者留下深刻的印象。
3.色彩的艺术性:
网站设计是一种艺术活动,因此必须遵循艺术规律。按照内容决定形式的原则,在考虑网站本身特点的同时,大胆进行艺术创新,设计出既符合网站要求,又具有一定艺术特色的网站。
4.色彩搭配的合理性:
色彩要根据主题来确定,不同的主题选用不同的色彩。例如,用蓝色体现科技型网站的专业,用粉红色体现女性的柔情等。
二、网页色彩搭配方法
网页配色很重要,网页颜色搭配的是否合理会直接影响到访问者的情绪。好的色彩搭配会给访问者带来很强的视觉冲击力,不恰当的色彩搭配则会让访问者浮躁不安。
1.同种色彩搭配:
同种色彩搭配是指首先选定一种色彩,然后调整其透明度和饱和度,将色彩变淡或加深,而产生新的色彩,这样的页面看起来色彩统一,具有层次感。
2.邻近色彩搭配:
邻近色是指在色环上相邻的颜色,如绿色和蓝色、红色和黄色即互为邻近色。采用邻近色搭配可以里是网页避免色彩杂乱,易于达到页面和谐统一的效果。
3.对比色彩搭配:
一般来说,色彩的三原色(红、黄、蓝)最能体现色彩间的差异。色彩的强烈对比具有视觉诱惑力,能够起到几种实现的作用。对比色可以突出重点,产生强烈的视觉效果。通过合理使用对比色,能够使网站特色鲜明、重点突出。在设计时,通常以一种颜色为主色调,其对比色作为点缀,以起到画龙点睛的作用。
4.暖色色彩搭配:
暖色色彩搭配是指使用红色橙色黄色集合色等色彩的搭配。这种色调的运用可为网页营造出稳性、和谐和热情的氛围。
5.冷色色彩搭配:
冷色色彩搭配是指使用绿色、蓝色及紫色等色彩的搭配,这种色彩搭配可为网页营造出宁静、清凉和高雅的氛围。冷色点色彩与白色搭配一般会获得较好的视觉效果。
6.有主色的混合色彩搭配:
有主色的混合色彩搭配是指以一种颜色作为主要颜色,同色辅以其他色彩混合搭配,形成缤纷而不杂乱的搭配效果。
7.文字与网页的背景色对比要突出:
文字内容的颜色与网页的背景色对比要突出,底色深,文字的颜色就应浅,以深色的背景衬托浅色的内容(文字或图片);反之,底色淡,文字的颜色就要深些,以浅色的背景衬托深色的内容(文字或图片)。

微信6.0之后,分享到朋友圈新方法

mrnaas阅读(1130)

微信6.0之后,原有的WeixinJSBridge.on(‘menu:share:timeline’, function (argv) {}不再可以使用,但是微信提供的新的方法 JS-SDK, 官方接口请参见 微信JSSDK说明文档 ,具体的方法官方文档都说的比较清楚了,本文只是记录下开发过程中遇到的问题以及解决方式。

  1. 虽然微信提供了JSSDK,但是这不意味着你可以用自定义的按钮来直接打开微信的分享界面,这套JSSDK只是把微信分享接口的内容定义好了,实际还是需要用户点击右上角的菜单按钮进行主动的分享,用户点开分享界面之后,出现的内容就会是你定义的分享标题、图片和链接。
  2. wx.config()注入配置成功之后,会触发wx.ready()函数(同样失败的时候会触发wx.error()函数),所以之后的有必要的接口调用,比如定义分享到朋友圈、分享给好友的内容,还是放在wx.ready()中进行调用以保证正确性。
    3.wx.checkJsApi无需wx.config即可调用,用来判断当前客户端是否能支持微信JSSDK的接口。
    4.分享出去的链接,会被微信在链接后面追加参数。这个问题十分重要,本人在开发过程中,第一次分享出去,成功没有任何问题,但是再次打开链接,会提示invalid signature,也就是签名错误,这个问题出现的原因,就是因为原来链接的被追加了参数,传递到自己服务器后台的页面原地址和提交给微信的页面原地址不匹配,解决方法如下:
<font color="#000"><font face="Arial">var pageUrl = window.location.href.split('#')[0];
pageUrl = pageUrl.replace(/\&/g, '%26');</span>
initJsApiTicket(pageUrl, function (data) {
    if (data.errcode == '0') {
        wx.config({
            debug: false,
            appId: data.appId,
            timestamp: data.timestamp,
            nonceStr: data.nonceStr,
            signature: data.signature,
            jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage']
        });
    }
});</font></font>

注意如果你是用这种方式将页面原地址作为参数传递到后台的话,需要将参数中的&全部替换为%26,否则后台接收到的地址会丢失参数,导致最后签名不一致。另外,在你分享出去的URL中,必须将微信附加的参数去掉,否则会导致第二次分享成功,但是第三次、第四次以及后续的分享都失败。

wx.ready(function () {
    pageUrl = pageUrl.substr(0, pageUrl.indexOf('%26'));
    wx.onMenuShareTimeline({
        title: '胶囊内镜检查图片', // 分享标题
        link: pageUrl, // 分享链接
        imgUrl: 'http://escloud-media.oss-cn-hangzhou.aliyuncs.com/escloud/newsmsg-small.png', // 分享图标
        success: function () {
            // 用户确认分享后执行的回调函数
     },
     cancel: function () {
         // 用户取消分享后执行的回调函数
     },
     fail: function (res) {
         alert("分享失败,请重新尝试");
        }
    });
    wx.onMenuShareAppMessage({
        title: '胶囊内镜检查图片', // 分享标题
        desc: '胶囊内镜检查图片', // 分享描述
        link: pageUrl, // 分享链接
        imgUrl: 'http://escloud-media.oss-cn-hangzhou.aliyuncs.com/escloud/newsmsg-small.png', // 分享图标
        type: 'link', // 分享类型,music、video或link,不填默认为link
        dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
        success: function () {
            // 用户确认分享后执行的回调函数
        },
        cancel: function () {
            // 用户取消分享后执行的回调函数
        }
   });
});

JavaScript 的性能优化:加载和执行

wangtong阅读(1017)

随着 Web2.0 技术的不断推广,越来越多的应用使用 JavaScript 技术在客户端进行处理,从而使 JavaScript 在浏览器中的性能成为开发者所面临的最重要的可用性问题。而这个问题又因 JavaScript 的阻塞特性变的复杂,也就是说当浏览器在执行 JavaScript 代码时,不能同时做其他任何事情。本文详细介绍了如何正确的加载和执行 JavaScript 代码,从而提高其在浏览器中的性能。
概览
无论当前 JavaScript 代码是内嵌还是在外链文件中,页面的下载和渲染都必须停下来等待脚本执行完成。JavaScript 执行过程耗时越久,浏览器等待响应用户输入的时间就越长。浏览器在下载和执行脚本时出现阻塞的原因在于,脚本可能会改变页面或 JavaScript 的命名空间,它们对后面页面内容造成影响。一个典型的例子就是在页面中使用document.write()。例如清单 1
清单 1 JavaScript 代码内嵌示例

<html>
<head>
    <title>Source Example</title>
</head>
<body>
    <p>
    <script type="text/javascript">
        document.write("Today is " + (new Date()).toDateString());
    </script>
    </p>
</body>
</html>

当浏览器遇到script标签时,当前 HTML 页面无从获知 JavaScript 是否会向p 标签添加内容,或引入其他元素,或甚至移除该标签。因此,这时浏览器会停止处理页面,先执行 JavaScript代码,然后再继续解析和渲染页面。同样的情况也发生在使用 src 属性加载 JavaScript的过程中,浏览器必须先花时间下载外链文件中的代码,然后解析并执行它。在这个过程中,页面渲染和用户交互完全被阻塞了。

脚本位置
HTML 4 规范指出 script 标签可以放在 HTML 文档的head或body中,并允许出现多次。Web 开发人员一般习惯在 head 中加载外链的 JavaScript,接着用 link 标签用来加载外链的 CSS 文件或者其他页面信息。例如清单 2
清单 2 低效率脚本位置示例

<html>
<head>
    <title>Source Example</title>
    <script type="text/javascript" src="script1.js"></script>
    <script type="text/javascript" src="script2.js"></script>
    <script type="text/javascript" src="script3.js"></script>
    <link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body>
    <p>Hello world!</p>
</body>
</html>

然而这种常规的做法却隐藏着严重的性能问题。在清单 2 的示例中,当浏览器解析到 script标签(第 4 行)时,浏览器会停止解析其后的内容,而优先下载脚本文件,并执行其中的代码,这意味着,其后的 styles.css 样式文件和body标签都无法被加载,由于body标签无法被加载,那么页面自然就无法渲染了。因此在该 JavaScript 代码完全执行完之前,页面都是一片空白。图 1 描述了页面加载过程中脚本和样式文件的下载过程。
图 1 JavaScript 文件的加载和执行阻塞其他文件的下载

我们可以发现一个有趣的现象:第一个 JavaScript 文件开始下载,与此同时阻塞了页面其他文件的下载。此外,从 script1.js 下载完成到 script2.js 开始下载前存在一个延时,这段时间正好是 script1.js 文件的执行过程。每个文件必须等到前一个文件下载并执行完成才会开始下载。在这些文件逐个下载过程中,用户看到的是一片空白的页面。
从 IE 8、Firefox 3.5、Safari 4 和 Chrome 2 开始都允许并行下载 JavaScript 文件。这是个好消息,因为script标签在下载外部资源时不会阻塞其他script标签。遗憾的是,JavaScript 下载过程仍然会阻塞其他资源的下载,比如样式文件和图片。尽管脚本的下载过程不会互相影响,但页面仍然必须等待所有 JavaScript 代码下载并执行完成才能继续。因此,尽管最新的浏览器通过允许并行下载提高了性能,但问题尚未完全解决,脚本阻塞仍然是一个问题。
由于脚本会阻塞页面其他资源的下载,因此推荐将所有script标签尽可能放到body标签的底部,以尽量减少对整个页面下载的影响。例如清单 3
清单 3 推荐的代码放置位置示例

<html>
<head>
    <title>Source Example</title>
    <link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body>
    <p>Hello world!</p>
  
    <!-- Example of efficient script positioning -->
    <script type="text/javascript" src="script1.js"></script>
    <script type="text/javascript" src="script2.js"></script>
    <script type="text/javascript" src="script3.js"></script>
</body>
</html>

这段代码展示了在 HTML 文档中放置script标签的推荐位置。尽管脚本下载会阻塞另一个脚本,但是页面的大部分内容都已经下载完成并显示给了用户,因此页面下载不会显得太慢。这是优化 JavaScript 的首要规则:将脚本放在底部。

组织脚本
由于每个script标签初始下载时都会阻塞页面渲染,所以减少页面包含的script标签数量有助于改善这一情况。这不仅针对外链脚本,内嵌脚本的数量同样也要限制。浏览器在解析 HTML 页面的过程中每遇到一个script标签,都会因执行脚本而导致一定的延时,因此最小化延迟时间将会明显改善页面的总体性能。
这个问题在处理外链 JavaScript 文件时略有不同。考虑到 HTTP 请求会带来额外的性能开销,因此下载单个 100Kb 的文件将比下载 5 个 20Kb 的文件更快。也就是说,减少页面中外链脚本的数量将会改善性能。
通常一个大型网站或应用需要依赖数个 JavaScript 文件。您可以把多个文件合并成一个,这样只需要引用一个script标签,就可以减少性能消耗。文件合并的工作可通过离线的打包工具或者一些实时的在线服务来实现。
需要特别提醒的是,把一段内嵌脚本放在引用外链样式表的link之后会导致页面阻塞去等待样式表的下载。这样做是为了确保内嵌脚本在执行时能获得最精确的样式信息。因此,建议不要把内嵌脚本紧跟在link标签后面。

无阻塞的脚本
减少 JavaScript 文件大小并限制 HTTP 请求数在功能丰富的 Web 应用或大型网站上并不总是可行。Web 应用的功能越丰富,所需要的 JavaScript 代码就越多,尽管下载单个较大的 JavaScript 文件只产生一次 HTTP 请求,却会锁死浏览器的一大段时间。为避免这种情况,需要通过一些特定的技术向页面中逐步加载 JavaScript 文件,这样做在某种程度上来说不会阻塞浏览器。
无阻塞脚本的秘诀在于,在页面加载完成后才加载 JavaScript 代码。这就意味着在 window 对象的 onload事件触发后再下载脚本。有多种方式可以实现这一效果。
延迟加载脚本
HTML 4 为script标签定义了一个扩展属性:defer。Defer 属性指明本元素所含的脚本不会修改 DOM,因此代码能安全地延迟执行。defer 属性只被 IE 4 和 Firefox 3.5 更高版本的浏览器所支持,所以它不是一个理想的跨浏览器解决方案。在其他浏览器中,defer 属性会被直接忽略,因此script标签会以默认的方式处理,也就是说会造成阻塞。然而,如果您的目标浏览器支持的话,这仍然是个有用的解决方案。清单 4 是一个例子
清单 4 defer 属性使用方法示例

<script type="text/javascript" src="script1.js" defer></script>

带有 defer 属性的script标签可以放置在文档的任何位置。对应的 JavaScript 文件将在页面解析到script标签时开始下载,但不会执行,直到 DOM 加载完成,即onload事件触发前才会被执行。当一个带有 defer 属性的 JavaScript 文件下载时,它不会阻塞浏览器的其他进程,因此这类文件可以与其他资源文件一起并行下载。
任何带有 defer 属性的script元素在 DOM 完成加载之前都不会被执行,无论内嵌或者是外链脚本都是如此。清单 5 的例子展示了defer属性如何影响脚本行为:
清单 5 defer 属性对脚本行为的影响

<html>
<head>
    <title>Script Defer Example</title>
</head>
<body>
    <script type="text/javascript" defer>
        alert("defer");
    </script>
    <script type="text/javascript">
        alert("script");
    </script>
    <script type="text/javascript">
        window.onload = function(){
            alert("load");
        };
    </script>
</body>
</html>

这段代码在页面处理过程中弹出三次对话框。不支持 defer 属性的浏览器的弹出顺序是:“defer”、“script”、“load”。而在支持 defer 属性的浏览器上,弹出的顺序则是:“script”、“defer”、“load”。请注意,带有 defer 属性的script元素不是跟在第二个后面执行,而是在 onload 事件被触发前被调用。
如果您的目标浏览器只包括 Internet Explorer 和 Firefox 3.5,那么 defer 脚本确实有用。如果您需要支持跨领域的多种浏览器,那么还有更一致的实现方式。
HTML 5 为script标签定义了一个新的扩展属性:async。它的作用和 defer 一样,能够异步地加载和执行脚本,不因为加载脚本而阻塞页面的加载。但是有一点需要注意,在有 async 的情况下,JavaScript 脚本一旦下载好了就会执行,所以很有可能不是按照原本的顺序来执行的。如果 JavaScript 脚本前后有依赖性,使用 async 就很有可能出现错误。
动态脚本元素
文档对象模型(DOM)允许您使用 JavaScript 动态创建 HTML 的几乎全部文档内容。script元素与页面其他元素一样,可以非常容易地通过标准 DOM 函数创建:
清单 6 通过标准 DOM 函数创建script元素

var script = document.createElement ("script");
   script.type = "text/javascript";
   script.src = "script1.js";
   document.getElementsByTagName("head")[0].appendChild(script);

新的script元素加载 script1.js 源文件。此文件当元素添加到页面之后立刻开始下载。此技术的重点在于:无论在何处启动下载,文件的下载和运行都不会阻塞其他页面处理过程。您甚至可以将这些代码放在head部分而不会对其余部分的页面代码造成影响(除了用于下载文件的 HTTP 连接)。
当文件使用动态脚本节点下载时,返回的代码通常立即执行(除了 Firefox 和 Opera,他们将等待此前的所有动态脚本节点执行完毕)。当脚本是“自运行”类型时,这一机制运行正常,但是如果脚本只包含供页面其他脚本调用调用的接口,则会带来问题。这种情况下,您需要跟踪脚本下载完成并是否准备妥善。可以使用动态 script 节点发出事件得到相关信息。
Firefox、Opera, Chorme 和 Safari 3+会在script节点接收完成之后发出一个 onload 事件。您可以监听这一事件,以得到脚本准备好的通知:
清单 7 通过监听 onload 事件加载 JavaScript 脚本

var script = document.createElement ("script")
script.type = "text/javascript";
  
//Firefox, Opera, Chrome, Safari 3+
script.onload = function(){
    alert("Script loaded!");
};
  
script.src = "script1.js";
document.getElementsByTagName("head")[0].appendChild(script);

Internet Explorer 支持另一种实现方式,它发出一个 readystatechange 事件。script元素有一个 readyState 属性,它的值随着下载外部文件的过程而改变。readyState 有五种取值:
“uninitialized”:默认状态
“loading”:下载开始
“loaded”:下载完成
“interactive”:下载完成但尚不可用
“complete”:所有数据已经准备好

微软文档上说,在script元素的生命周期中,readyState 的这些取值不一定全部出现,但并没有指出哪些取值总会被用到。实践中,我们最感兴趣的是“loaded”和“complete”状态。Internet Explorer 对这两个 readyState 值所表示的最终状态并不一致,有时script元素会得到“loader”却从不出现“complete”,但另外一些情况下出现“complete”而用不到“loaded”。最安全的办法就是在 readystatechange 事件中检查这两种状态,并且当其中一种状态出现时,删除 readystatechange 事件句柄(保证事件不会被处理两次):
清单 8 通过检查 readyState 状态加载 JavaScript 脚本

var script = document.createElement("script")
script.type = "text/javascript";
  
//Internet Explorer
script.onreadystatechange = function(){
     if (script.readyState == "loaded" || script.readyState == "complete"){
           script.onreadystatechange = null;
           alert("Script loaded.");
     }
};
  
script.src = "script1.js";
document.getElementsByTagName("head")[0].appendChild(script);

大多数情况下,您希望调用一个函数就可以实现 JavaScript 文件的动态加载。下面的函数封装了标准实现和 IE 实现所需的功能:
清单 9 通过函数进行封装

function loadScript(url, callback){
    var script = document.createElement ("script")
    script.type = "text/javascript";
    if (script.readyState){ //IE
        script.onreadystatechange = function(){
            if (script.readyState == "loaded" || script.readyState == "complete"){
                script.onreadystatechange = null;
                callback();
            }
        };
    } else { //Others
        script.onload = function(){
            callback();
        };
    }
    script.src = url;
    document.getElementsByTagName("head")[0].appendChild(script);
}

此函数接收两个参数:JavaScript 文件的 URL,和一个当 JavaScript 接收完成时触发的回调函数。属性检查用于决定监视哪种事件。最后一步,设置 src 属性,并将script元素添加至页面。此 loadScript() 函数使用方法如下:
清单 10 loadScript()函数使用方法

loadScript("script1.js", function(){
    alert("File is loaded!");
});

您可以在页面中动态加载很多 JavaScript 文件,但要注意,浏览器不保证文件加载的顺序。所有主流浏览器之中,只有 Firefox 和 Opera 保证脚本按照您指定的顺序执行。其他浏览器将按照服务器返回它们的次序下载并运行不同的代码文件。您可以将下载操作串联在一起以保证他们的次序,如下:
清单 11 通过 loadScript()函数加载多个 JavaScript 脚本

loadScript("script1.js", function(){
    loadScript("script2.js", function(){
        loadScript("script3.js", function(){
            alert("All files are loaded!");
        });
    });
});

此代码等待 script1.js 可用之后才开始加载 script2.js,等 script2.js 可用之后才开始加载 script3.js。虽然此方法可行,但如果要下载和执行的文件很多,还是有些麻烦。如果多个文件的次序十分重要,更好的办法是将这些文件按照正确的次序连接成一个文件。独立文件可以一次性下载所有代码(由于这是异步进行的,使用一个大文件并没有什么损失)。
[size=1.166em]动态脚本加载是非阻塞 JavaScript 下载中最常用的模式,因为它可以跨浏览器,而且简单易用。
使用 XMLHttpRequest(XHR)对象
此技术首先创建一个 XHR 对象,然后下载 JavaScript 文件,接着用一个动态 script 元素将 JavaScript 代码注入页面。清单 12 是一个简单的例子:
清单 12 通过 XHR 对象加载 JavaScript 脚本

var xhr = new XMLHttpRequest();
xhr.open("get", "script1.js", true);
xhr.onreadystatechange = function(){
    if (xhr.readyState == 4){
        if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){
            var script = document.createElement ("script");
            script.type = "text/javascript";
            script.text = xhr.responseText;
            document.body.appendChild(script);
        }
    }
};
xhr.send(null);

此代码向服务器发送一个获取 script1.js 文件的 GET 请求。onreadystatechange 事件处理函数检查 readyState 是不是 4,然后检查 HTTP 状态码是不是有效(2XX 表示有效的回应,304 表示一个缓存响应)。如果收到了一个有效的响应,那么就创建一个新的script元素,将它的文本属性设置为从服务器接收到的 responseText 字符串。这样做实际上会创建一个带有内联代码的script元素。一旦新script元素被添加到文档,代码将被执行,并准备使用。
这种方法的主要优点是,您可以下载不立即执行的 JavaScript 代码。由于代码返回在script标签之外(换句话说不受script标签约束),它下载后不会自动执行,这使得您可以推迟执行,直到一切都准备好了。另一个优点是,同样的代码在所有现代浏览器中都不会引发异常。
[size=1.166em]此方法最主要的限制是:JavaScript 文件必须与页面放置在同一个域内,不能从 CDN 下载(CDN 指”内容投递网络(Content Delivery Network)”,所以大型网页通常不采用 XHR 脚本注入技术。
总结
减少 JavaScript 对性能的影响有以下几种方法:
将所有的script标签放到页面底部,也就是闭合标签之前,这能确保在脚本执行前页面已经完成了渲染。
尽可能地合并脚本。页面中的script标签越少,加载也就越快,响应也越迅速。无论是外链脚本还是内嵌脚本都是如此。
采用无阻塞下载 JavaScript 脚本的方法:

使用script标签的 defer 属性(仅适用于 IE 和 Firefox 3.5 以上版本);
使用动态创建的script元素来下载并执行代码;
使用 XHR 对象下载 JavaScript 代码并注入页面中。

通过以上策略,可以在很大程度上提高那些需要使用大量 JavaScript 的 Web 网站和应用的实际性能。

根据验证邮箱的域名跳转到相应的登录页面

wangtong阅读(1720)

之前由于公司项目要求,需要根据邮箱跳转到对应的邮箱,百度了半天才找到一个,不多说直接帖代码

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>js邮箱地址跳转</title>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
var hash={
'qq.com': 'http://mail.qq.com',
'gmail.com': 'http://mail.google.com',
'sina.com': 'http://mail.sina.com.cn',
'163.com': 'http://mail.163.com',
'126.com': 'http://mail.126.com',
'yeah.net': 'http://www.yeah.net/',
'sohu.com': 'http://mail.sohu.com/',
'tom.com': 'http://mail.tom.com/',
'sogou.com': 'http://mail.sogou.com/',
'139.com': 'http://mail.10086.cn/',
'hotmail.com': 'http://www.hotmail.com',
'live.com': 'http://login.live.com/',
'live.cn': 'http://login.live.cn/',
'live.com.cn': 'http://login.live.com.cn',
'189.com': 'http://webmail16.189.cn/webmail/',
'yahoo.com.cn': 'http://mail.cn.yahoo.com/',
'yahoo.cn': 'http://mail.cn.yahoo.com/',
'eyou.com': 'http://www.eyou.com/',
'21cn.com': 'http://mail.21cn.com/',
'188.com': 'http://www.188.com/',
'foxmail.coom': 'http://www.foxmail.com'
};
  
$(function(){
$(".mail").each(function() {
var url = $(this).text().split('@')[1];
for (var j in hash){
$(this).attr("href", hash[url]);
}
});
})
</script>
</head>
  
<body>
<a href="#" target="_blank" class="mail"><a href="mailto:laike@qq.com">laike@qq.com</a></a> <br>
<a href="#" target="_blank" class="mail"><a href="mailto:laike@gmail.com">laike@gmail.com</a></a> <br>
<a href="#" target="_blank" class="mail"><a href="mailto:laike@sina.com">laike@sina.com</a></a> <br>
<a href="#" target="_blank" class="mail"><a href="mailto:laike@163.com">laike@163.com</a></a> <br>
<a href="#" target="_blank" class="mail"><a href="mailto:laike@souhu.com">laike@souhu.com</a></a> <br>
<a href="#" target="_blank" class="mail"><a href="mailto:laike@hotmail.com">laike@hotmail.com</a></a>
</body>
</html>

之后,有大神帮忙优化调整了一下,还是那句话,直接上代码

<input type="text" class="txt" />
<a href="javascript:" class="submit">立即前往邮箱</a>
<script src="http://libs.useso.com/js/jquery/1.10.0/jquery.min.js"></script>
<script>
var hash = {
        'qq.com': 'http://mail.qq.com',
        'gmail.com': 'http://mail.google.com',
        'sina.com': 'http://mail.sina.com.cn',
        '163.com': 'http://mail.163.com',
        '126.com': 'http://mail.126.com',
        'yeah.net': 'http://www.yeah.net/',
        'sohu.com': 'http://mail.sohu.com/',
        'tom.com': 'http://mail.tom.com/',
        'sogou.com': 'http://mail.sogou.com/',
        '139.com': 'http://mail.10086.cn/',
        'hotmail.com': 'http://www.hotmail.com',
        'live.com': 'http://login.live.com/',
        'live.cn': 'http://login.live.cn/',
        'live.com.cn': 'http://login.live.com.cn',
        '189.com': 'http://webmail16.189.cn/webmail/',
        'yahoo.com.cn': 'http://mail.cn.yahoo.com/',
        'yahoo.cn': 'http://mail.cn.yahoo.com/',
        'eyou.com': 'http://www.eyou.com/',
        '21cn.com': 'http://mail.21cn.com/',
        '188.com': 'http://www.188.com/',
        'foxmail.coom': 'http://www.foxmail.com'
};
$('.txt').on('blur',function (){
        var url = $(this).val().split('@')[1];
        for (var j in hash) {
                $('.submit').attr("href", hash[url]);
        }
});
 
</script>