相同: 它们都能让元素不可见
区别:
原理:利用不同浏览器对 CSS 的支持和解析结果不一样编写针对特定浏览器样式。常见的 hack 有 :1)属性 hack,2)选择器 hack,3)IE 条件注释。
IE 条件注释,适用于[IE5, IE9]常见格式如下:
选择器 hack,不同浏览器对选择器的支持不一样:
/***** Selector Hacks ******/
/* IE6 and below */
* html #uno { color: red }
/* IE7 */
*:first-child+html #dos { color: red }
/* IE7, FF, Saf, Opera */
html>body #tres { color: red }
/* IE8, FF, Saf, Opera (Everything but IE 6,7) */
html>/**/body #cuatro { color: red }
/* Opera 9.27 and below, safari 2 */
html:first-child #cinco { color: red }
/* Safari 2-3 */
html[xmlns*=""] body:last-child #seis { color: red }
/* safari 3+, chrome 1+, opera9+, ff 3.5+ */
body:nth-of-type(1) #siete { color: red }
/* safari 3+, chrome 1+, opera9+, ff 3.5+ */
body:first-of-type #ocho { color: red }
/* saf3+, chrome1+ */
@media screen and (-webkit-min-device-pixel-ratio:0) {
#diez { color: red }
}
/* iPhone / mobile webkit */
@media screen and (max-device-width: 480px) {
#veintiseis { color: red }
}
/* Safari 2 - 3.1 */
html[xmlns*=""]:root #trece { color: red }
/* Safari 2 - 3.1, Opera 9.25 */
*|html[xmlns*=""] #catorce { color: red }
/* Everything but IE6-8 */
:root *> #quince { color: red }
/* IE7 */
*+html #dieciocho { color: red }
/* Firefox only. 1+ */
#veinticuatro, x:-moz-any-link { color: red }
/* Firefox 3.0+ */
#veinticinco, x:-moz-any-link, x:default { color: red }
属性 hack:不同浏览器解析 bug 或方法:
/* IE6 */
#once { _color: blue }
/* IE6, IE7 */
#doce { *color: blue; /* or #color: blue */ }
/* Everything but IE6 */
#diecisiete { color/**/: blue }
/* IE6, IE7, IE8 */
#diecinueve { color: blue\9; }
/* IE7, IE8 */
#veinte { color/*\**/: blue\9; }
/* IE6, IE7 -- acts as an !important */
#veintesiete { color: blue !ie; } /* string after ! can be anything */
外边距重叠就是 margin-collapse,相邻的两个盒子(可能是兄弟关系也可能是祖先关系)的外边距可以结合成一个单独的外边距。 这种合并外边距的方式被称为折叠,结合而成的外边距称为折叠外边距。
折叠结果遵循下列计算规则:
box-sizing: content-box; // 默认的标准(W3C)盒模型元素效果
box-sizing: border-box; // 触发怪异(IE)盒模型元素的效果
box-sizing: inherit; // 继承父元素 box-sizing 属性的值
如果需要居中的元素为常规流中 inline 元素,为父元素设置 text-align: center,即可实现。
如果需要居中的元素为常规流中 block 元素,1)为元素设置宽度,2)设置左右 margin 为 auto,3)IE6 下需在父元素上设置 text-align: center,再给子元素恢复需要的值。
<body>
<div class="content">aaaaaadiv>
body>
<style>
body {
background: #DDD;
text-align: center; /* 3 */
}
.content {
width: 500px; /* 1 */
text-align: left; /* 3 */
margin: 0 auto; /* 2 */
background: purple;
}
style>
如果需要居中的元素为浮动元素,1)为元素设置宽度,2)position: relative,3)浮动方向偏移量(left 或者 right)设置为 50%,4)浮动方向上的 margin 设置为元素宽度一半乘以-1。
<body>
<div class="content">aaaaaadiv>
body>
<style>
body {
background: #DDD;
}
.content {
width: 500px; /* 1 */
float: left;
position: relative; /* 2 */
left: 50%; /* 3 */
margin-left: -250px; /* 4 */
background-color: purple;
}
style>
如果需要居中的元素为绝对定位元素,1)为元素设置宽度,2)偏移量设置为 50%,3)偏移方向外边距设置为元素宽度一半乘以-1。
<body>
<div class="content">aaaaaadiv>
body>
<style>
body {
background: #DDD;
position: relative;
}
.content {
width: 800px;
position: absolute;
left: 50%;
margin-left: -400px;
background-color: purple;
}
style>
如果需要居中的元素为绝对定位元素,1)为元素设置宽度,2)设置左右偏移量都为 0,3)设置左右外边距都为 auto。
<body>
<div class="content">aaaaaadiv>
body>
<style>
body {
background: #DDD;
position: relative;
}
.content {
width: 800px;
position: absolute;
margin: 0 auto;
left: 0;
right: 0;
background-color: purple;
}
style>
/* 把上、左、右三条边隐藏掉(颜色设为 transparent)*/
#demo {
width: 0;
height: 0;
border-width: 20px;
border-style: solid;
border-color: transparent transparent red transparent;
}
简单的方式:
行框的排列会受到中间空白(回车\空格)等的影响,因为空格也属于字符,这些空白也会被应用样式,占据空间,所以会有间隔,把字符大小设为 0,就没有空格了。
移除空格、使用 margin 负值、使用 font-size:0、letter-spacing、word-spacing。
权重:
1.从0开始,一个行内style属性+1000;
2.一个id选择器+100;
3.一个属性选择器、class或者伪类+10;
4.一个元素选择器,或者伪元素+1,通配符+0。
浮动的框可以向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止。由于浮动框不在文档的普通流中,所以文档的普通流的块框表现得就像浮动框不存在一样,浮动的块框会漂浮在文档普通流的块框上。
解决方法:
.clearfloat:after{
display:block;
clear:both;
content:"";
visibility:hidden;
height:0
}
.clearfloat{zoom:1}
<div class="parent">
<div class="left">Leftdiv>
<div class="right">Rightdiv>
<div class="clearfloat">div>
div>
<style>
.left {float:left}
.clearfloat{clear:both}
style>
参考链接几种常用的清除浮动方法
content 属性专门应用在 before/after 伪元素上,用于插入额外内容或样式。
Flexbox 用于不同尺寸屏幕中创建可自动扩展和收缩布局。
要求:三列布局;中间主体内容前置,且宽度自适应;两边内容定宽。
好处:重要的内容放在文档流前面可以优先渲染。
原理:利用相对定位、浮动、负边距布局,而不添加额外标签。
.container {
padding-left: 150px;
padding-right: 190px;
}
.main {
float: left;
width: 100%;
}
.left {
float: left;
width: 190px;
margin-left: -100%;
position: relative;
left: -150px;
}
.right {
float: left;
width: 190px;
margin-left: -190px;
position: relative;
right: -190px;
}
双飞翼布局:对圣杯布局(使用相对定位,对以后布局有局限性)的改进,消除相对定位布局。
原理:主体元素上设置左右边距,预留两翼位置。左右两栏使用浮动和负边距归位,消除相对定位。
.container {
/*padding-left:150px;*/
/*padding-right:190px;*/
}
.main-wrap {
width: 100%;
float: left;
}
.main {
margin-left: 150px;
margin-right: 190px;
}
.left {
float: left;
width: 150px;
margin-left: -100%;
/*position: relative;*/
/*left:-150px;*/
}
.right {
float: left;
width: 190px;
margin-left: -190px;
/*position:relative;*/
/*right:-190px;*/
}
reset.css 意为重置默认样式。HTML 中绝大部分标签元素在网页显示中都有一个默认属性值,通常为了避免重复定义元素样式,需要进行重置默认样式
Eric Meyer(CSS Reset)推荐
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td {
margin: 0;
padding: 0;
border: 0;
outline: 0;
font-size: 100%;
vertical-align: baseline;
background: transparent;
}
body {
line-height: 1;
}
ol, ul {
list-style: none;
}
blockquote, q {
quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
content: '';
content: none;
}
/* remember to define focus styles! */
:focus {
outline: 0;
}
/* remember to highlight inserts somehow! */
ins {
text-decoration: none;
}
del {
text-decoration: line-through;
}
/* tables still need ‘cellspacing=”0″‘ in the markup */
table {
border-collapse: collapse;
border-spacing: 0;
}
Normalize.css 只是一个很小的 css 文件,但它在默认的 HTML 元素样式上提供了跨浏览器的高度一致性。相比于传统的 css reset,Normalize.css 是一种现代的,为 HTML5 准备的优质替代方案。
Normalize.css 是一种 CSS reset 的替代方案。经过@necolas 和@jon neal 花了几百个小时来努力研究不同浏览器的默认样式的差异,这个项目终于变成了现在这样。
我们创造 normalize.css 有下几个目的:
浏览器解析 CSS 选择器的方式是从右到左。
在网页中的应该使用“偶数”字体:
CSS 可以拆分成 2 部分:公共 CSS 和 业务 CSS:
元素竖向的百分比设定是相对于容器的宽度,而不是高度(这句话说的有问题),
正确说法:如果是height的话,是相对于容器高度,如果是padding-height,margin-height则是相对于容器的宽度。
响应式设计就是网站能够兼容多个终端,而不是为每个终端做一个特定的版本。基本原理是利用 CSS3 媒体查询,为不同尺寸的设备适配不同样式。
对于低版本的 IE,可采用 JS 获取屏幕宽度,然后通过 resize 方法来实现兼容:
$(window).resize(function () {
screenRespond();
});
screenRespond();
function screenRespond(){
var screenWidth = $(window).width();
if(screenWidth <= 1800){
$("body").attr("class", "w1800");
}
if(screenWidth <= 1400){
$("body").attr("class", "w1400");
}
if(screenWidth > 1800){
$("body").attr("class", "");
}
}
link > visited > hover > active
伪元素:在内容元素的前后插入额外的元素或样式,但是这些元素实际上并不在文档中生成。它们只在外部显示可见,但不会在文档的源代码中找到它们,因此,称为“伪”元素。例如:
p::before {content:"第一章:";}
p::after {content:"Hot!";}
p::first-line {background:red;}
p::first-letter {font-size:30px;}
伪类: 将特殊的效果添加到特定选择器上。它是已有元素上添加类别的,不会产生新的元素。例如:
a:hover {color: #FF00FF}
p:first-child {color: red}
产生原因:由于 Chrome 默认会给自动填充的 input 表单加上 input:-webkit-autofill 私有属性造成的。
解决方案 1:在 form 标签上直接关闭了表单的自动填充:autocomplete=“off”。
解决方案 2:input:-webkit-autofill { background-color: transparent; }。
input [type=search] 搜索框右侧小图标如何美化:
input[type="search"]::-webkit-search-cancel-button{
-webkit-appearance: none;
height: 15px;
width: 15px;
border-radius: 8px;
background:url("images/searchicon.png") no-repeat 0 0;
background-size: 15px 15px;
}
<a href="logo.jpg" download>下载a> <a href="logo.jpg" download="网站LOGO" >下载a>
$(document).ready(function(){
var stopScrolling = function(event) {
event.preventDefault();
}
document.addEventListener('touchstart', stopScrolling, false);
document.addEventListener('touchmove', stopScrolling, false);
});
设置元素浮动后,该元素的 display 值自动变成 block。
.shrink{
-webkit-transform:scale(0.8);
-o-transform:scale(1);
display:inline-block;
}
-webkit-font-smoothing: antialiased;
font-style: oblique;
使没有 italic 属性的文字实现倾斜。
16.7ms 多数显示器默认频率是 60Hz,即 1 秒刷新 60 次,所以理论上最小间隔: 1s / 60 * 1000 = 16.7ms。
监听滚轮事件,然后滚动到一定距离时用 jquery 的 animate 实现平滑效果。
方案 1: .sub { height: calc(100%-100px); }
方案 2: .container { position:relative; } .sub { position: absolute; top: 100px; bottom: 0; }
方案 3: .container { display:flex; flex-direction:column; } .sub { flex:1; }
对于 CSS 而言,id 和 class 都是选择器,唯一不同的地方在于权重不同。如果只说 CSS,上面那一句话就讲完了。拓展出来,对于 html 而言,id 和 class 都是 dom 元素的属性值。不同的地方在于 id 属性的值是唯一的,而 class 属性值可以重复。id 还一个老特性是锚点功能,当浏览器地址栏有一个#xxx,页面会自动滚动到 id=xxx 的元素上面。
更直接的:id 给 js 用,class 给 css 用(趋势)。
<link rel="stylesheet" type="text/css" media="screen" href="xxx.css" />
其中 media 指定的属性就是设备,显示器上就是 screen,打印机则是 print,电视是 tv,投影仪是 projection。
<link rel="stylesheet" type="text/css" media="print" href="yyy.css" />
但打印样式表也应有些注意事项:
@print div{display:none;}
;反之:
SVG | 等效的 CSS |
---|---|
fill | background-color 或 color |
fill-opacity | background-color 或 color 设置 rgba/hsla |
opacity | opacity |
stroke | border-color |
stroke-width | border-thickness |
stroke-opacity | border-color 设置 rgba |
rx, ry | border-radius |
下面的属性在 SVG 和 CSS 中是一样的,只是在 SVG 的 transformations 和 dimensions 中稍有区别:
?定义:CSS 规范规定,每个元素都有 display 属性,确定该元素的类型,每个元素都有默认的 display 值,如 div 的 display 默认值为“block”,则为“块级”元素;span 默认 display 属性值为“inline”,是“行内”元素。
不同浏览器(版本)、HTML4(5)、CSS2 等实际略有差异
参考: http://stackoverflow.com/questions/6867254/browsers-default-css-for-html-elements
主要分成两部分:渲染引擎(layout engineer 或 Rendering Engine)和 JS 引擎。
渲染引擎:负责取得网页的内容(HTML、XML、图像等等)、整理讯息(例如加入 CSS 等),以及计算网页的显示方式,然后会输出至显示器或打印机。浏览器的内核的不同对于网页的语法解释会有不同,所以渲染的效果也不相同。所有网页浏览器、电子邮件客户端以及其它需要编辑、显示网络内容的应用程序都需要内核。
JS 引擎则:解析和执行 javascript 来实现网页的动态效果。
最开始渲染引擎和 JS 引擎并没有区分的很明确,后来 JS 引擎越来越独立,内核就倾向于只指渲染引擎。
- 新增的结构元素:
(1)section
表示页面中的一个内容区块,比如章节,页眉,页脚或页面中的其他部分。它可以与h1,h2,h3,h4,h5,h6等元素结合起来使用,标示文档结构。
(2)article
表示页面中的一块与上下文不相关的独立内容,譬如博客中的一篇文章或报纸中的一篇文章。
(3)aside
表示article元素的内容之外的,与article元素的内容相关的辅助信息。
(4)header
表示页面中一个内容区块或整个页面的标题。
(5)hgroup
用于对整个页面或页面中一个内容区块的标题进行组合。
(6)footer
表示整个页面或页面中一个内容区块的脚注。一般来说,它会包含创作者的姓名,创作日期以及创作者联系信息。
(7)nav
表示页面中导航链接的部分。
(8)figure
表示一段独立的流内容,一般表示文档主体流内容的一个独立单元。使用figcaption元素为figure元素组添加标题。
- 新增的功能元素:
hgroup元素:用于对整个页面或页面中一个内容区块的标题进行组合。
figure元素:表示一段独立的流内容,一般表示文档主题流内容中的一个独立单元。
video元素:定义视频,比如电影片段或其他视频流。
audio元素:定义音频,比如音乐或其他音频流。
embed元素:用来插入各种多媒体,格式可以是MIDI、WAV、AIFF、AU、MP3等。
mark元素:主要用来在视觉上向用户呈现需要突出显示或高亮显示的文字。
time元素:表示日期或时间,也可以同时表示两者。
canvas元素:表示图形,如图表和其他图像。
output元素:表示不同类型的输出,比如脚本的输出。
source元素:为媒介元素定义媒介资源。
menu元素:表示菜单列表。当希望列出表单控制时使用该标签。
ruby元素:表示ruby注释。
rt元素:表示字符的解释或发音。
rp元素:在ruby解释中使用,以定义不支持ruby元素的浏览器所显示的内容。
wbr元素:表示软换行。
command元素:表示命令按钮,如单选按钮、复选框或按钮。
details元素:表示用户要求得到并且可以得到的细节信息,可与summary 元素配合使用。
datalist元素:可选数据的列表,与input元素配合使用,可以制作出输入值的下拉列表。
datagrid元素:表示可选数据的列表,它以树形列表的形式来显示。
keygen元素:表示生成密钥。
progress元素:表示运行中的进程,可以使用progress来显示JavaScript中耗费时间的函数的进程。
email:表示必须输入E-mail地址的文本输入框。
url:表示必须输入URL地址的文本输入框。
number:表示必须输入数值的文本输入框。
range:表示必须输入一定范围内数字值的文本输入框。
Date Pickers:HTML5拥有多个可供选取日期和时间的新型输入文本框。
在用户没有与因特网连接时,可以正常访问站点或应用,在用户与因特网连接时,更新用户机器上的缓存文件。
原理:HTML5 的离线存储是基于一个新建的.appcache 文件的缓存机制(不是存储技术),通过这个文件上的解析清单离线存储资源,这些资源就会像 cookie 一样被存储了下来。之后当网络在处于离线状态下时,浏览器会通过被离线存储的数据进行页面展示。
如何使用:
CACHE MANIFEST
#v1.0
CACHE:
js/app.js
css/style.css
NETWORK:
assets/logo.png
FALLBACK:
/html5/ /404.html
使用 iframe 之前需要考虑这两个缺点。如果需要使用 iframe,最好是通过 javascript
动态给 iframe 添加 src 属性值,这样可以绕开以上两个问题。
label 标签来定义表单控制间的关系,当用户选择该标签时,浏览器会自动将焦点转到和标签相关的表单控件上。
<label for="Name">Number:label>
<label>Date:<input type="text" name="B"/>label>
给不想要提示的 form 或某个 input 设置为 autocomplete=off。
localstorge 另一个浏览上下文里被添加、修改或删除时,它都会触发一个事件,
我们通过监听事件,控制它的值来进行页面信息通信,
注意 quirks:Safari 在无痕模式下设置 localstorge 值时会抛出 QuotaExceededError 的异常。
Adobe Flash Socket 、ActiveX HTMLFile (IE) 、 基于 multipart 编码发送 XHR 、基于长轮询的 XHR。
<div style="height:1px;overflow:hidden;background:red">div>
Physical Style Elements – 自然样式标签
b, i, u, s, pre
Semantic Style Elements – 语义样式标签
strong, em, ins, del, code
应该准确使用语义样式标签, 但不能滥用, 如果不能确定时首选使用自然样式标签。
<img src="#" alt="alt信息" />
当图片不输出信息的时候,会显示 alt 信息 鼠标放上去没有信息,当图片正常读取,不会出现 alt 信息。
<img src="#" alt="alt信息" title="title信息" />
当图片不输出信息的时候,会显示 alt 信息 鼠标放上去会出现 title 信息;
当图片正常输出的时候,不会出现 alt 信息,鼠标放上去会出现 title 信息。
JavaScript 由以下三部分组成:
的检测设置需要 hasAttribute 和 removeAttribute 来完成,或者设置对应 property;link
中 href 属性,转换成 property 的时候需要通过转换得到完整 URL;
对应的是 defaultValue,修改或设置 value property 修改的是控件当前值,setAttribute 修改 value 属性不会改变 value property。浏览器的渲染过程:
DOM 树 和 渲染树 的区别:
JavaScript 作用域:
JavaScript 变量声明提升:
原型:
原型链:
原型特点:
function Mobile(name, price){
this.name = name;
this.price = price;
}
Mobile.prototype.sell = function(){
alert(this.name + ",售价 $" + this.price);
}
var iPhone7 = new Mobile("iPhone7", 1000);
iPhone7.sell();
var Person = {
firstname: "Mark",
lastname: "Yun",
age: 25,
introduce: function(){
alert('I am ' + Person.firstname + ' ' + Person.lastname);
}
};
var person = Object.create(Person);
person.introduce();
// Object.create 要求 IE9+,低版本浏览器可以自行部署:
if (!Object.create) {
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
}
var Cat = {
age: 3, // 共享数据 -- 定义在类对象内,createNew() 外
createNew: function () {
var cat = {};
// var cat = Animal.createNew(); // 继承 Animal 类
cat.name = "小咪";
var sound = "喵喵喵"; // 私有属性--定义在 createNew() 内,输出对象外
cat.makeSound = function () {
alert(sound); // 暴露私有属性
};
cat.changeAge = function(num){
Cat.age = num; // 修改共享数据
};
return cat; // 输出对象
}
};
var cat = Cat.createNew();
cat.makeSound();
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
toString() {
return '(' + this.x + ', ' + this.y + ')';
}
}
var point = new Point(2, 3);
function Cat(name,color){
Animal.apply(this, arguments);
this.name = name;
this.color = color;
}
Cat.prototype = new Animal();
Cat.prototype.constructor = Cat;
function extend(Child, Parent) {
var p = Parent.prototype;
var c = Child.prototype;
for (var i in p) {
c[i] = p[i];
}
c.uber = p;
}
function extend(Child, Parent) {
var F = function(){};
F.prototype = Parent.prototype;
Child.prototype = new F();
Child.prototype.constructor = Child;
Child.uber = Parent.prototype;
}
class ColorPoint extends Point {
constructor(x, y, color) {
super(x, y); // 调用父类的constructor(x, y)
this.color = color;
}
toString() {
return this.color + ' ' + super.toString(); // 调用父类的toString()
}
}
原型链继承的缺点
借用构造函数(类式继承)
组合式继承
javascript 创建对象简单的说,无非就是使用内置对象或各种自定义对象,当然还可以用 JSON;但写法有很多种,也能混合使用
person={firstname:"Mark",lastname:"Yun",age:25,eyecolor:"black"};
function Person(){}
var person=new Person();//定义一个function,如果使用new"实例化",该function可以看作是一个Class
person.name="Mark";
person.age="25";
person.work=function(){
alert(person.name+" hello...");
}
person.work();
function Pet(name,age,hobby){
this.name=name;//this作用域:当前对象
this.age=age;
this.hobby=hobby;
this.eat=function(){
alert("我叫"+this.name+",我喜欢"+this.hobby+",是个程序员");
}
}
var maidou =new Pet("麦兜",25,"coding");//实例化、创建对象
maidou.eat();//调用eat方法
var wcDog =new Object();
wcDog.name="旺财";
wcDog.age=3;
wcDog.work=function(){
alert("我是"+wcDog.name+",汪汪汪......");
}
wcDog.work();
function Dog(){
}
Dog.prototype.name="旺财";
Dog.prototype.eat=function(){
alert(this.name+"是个吃货");
}
var wangcai =new Dog();
wangcai.eat();
function Car(name,price){
this.name=name;
this.price=price;
}
Car.prototype.sell=function(){
alert("我是"+this.name+",我现在卖"+this.price+"万元");
}
var camry =new Car("凯美瑞",27);
camry.sell();
eval 的功能是把对应的字符串解析成 JS 代码并运行:
DOM0 级事件处理方式:
DOM2 级事件处理方式:
DOM3 级事件处理方式:
捕获、目标、冒泡
按照 W3C 标准的事件:首是进入捕获阶段,直到达到目标元素,再进入冒泡阶段。
事件执行次数(DOM2-addEventListener):元素上绑定事件的个数。
事件执行顺序:判断的关键是否目标元素
事件委托是指将事件绑定目标元素的到父元素上,利用冒泡机制触发该事件
优点:
缺点: 使用不当会造成事件在不应该触发时触发
示例:
ulEl.addEventListener('click', function(e){
var target = event.target || event.srcElement;
if(!!target && target.nodeName.toUpperCase() === "LI"){
console.log(target.innerHTML);
}
}, false);
IE 只事件冒泡,不支持事件捕获;火狐同时支持件冒泡和事件捕获。
阻止冒泡:
[js] view plaincopy
function stopHandler(event)
window.event?window.event.cancelBubble=true:event.stopPropagation();
}
参考链接:浅谈 javascript 事件取消和阻止冒泡-开源中国 2015
绑定事件
删除事件
事件对象
事件目标
阻止事件默认行为
阻止事件传播
var fireEvent = function(element, event){
if (document.createEventObject){
var mockEvent = document.createEventObject();
return element.fireEvent('on' + event, mockEvent)
}else{
var mockEvent = document.createEvent('HTMLEvents');
mockEvent.initEvent(event, true, true);
return !element.dispatchEvent(mockEvent);
}
}
function throttle(method, context) {
clearTimeout(methor.tId);
method.tId = setTimeout(function(){
method.call(context);
}, 100); // 两次调用至少间隔 100ms
}
// 调用
window.onresize = function(){
throttle(myFunc, window);
}
答案:[1, NaN, NaN]
parseInt(string, radix) 第 2 个参数 radix 表示进制。省略 radix 或 radix = 0,则数字将以十进制解析。
map 每次为 parseInt 传 3 个参数(elem, index, array),其中 index 为数组索引。
因此,map 遍历 [“1”, “2”, “3”],相应 parseInt 接收参数如下:
parseInt('1', 0); // 1
parseInt('2', 1); // NaN
parseInt('3', 2); // NaN
所以,parseInt 参数 radix 不合法,导致返回值为 NaN。
封装选择器、调用第三方 API、设置和获取样式(自由回答)。
[].forEach.call($$("*"), function(el){
el.style.outline = "1px solid #" + (~~(Math.random()*(1<<24))).toString(16);
})
解释:获取页面所有的元素,遍历这些元素,为它们添加 1 像素随机颜色的轮廓(outline)
`$$(sel) // $$`函数被许多现代浏览器命令行支持,等价于 document.querySelectorAll(sel)
[].forEach.call(NodeLists) // 使用 call 函数将数组遍历函数 forEach 应到节点元素列表
el.style.outline = "1px solid #333" // 样式 outline 位于盒模型之外,不影响元素布局位置
(1<<24) // parseInt("ffffff", 16) == 16777215 == 2^24 - 1 // 1<<24 == 2^24 == 16777216
Math.random()\*(1<<24) // 表示一个位于 0 到 16777216 之间的随机浮点数
~~Math.random()\*(1<<24) // ~~ 作用相当于 parseInt 取整
(~~(Math.random()\*(1<<24))).toString(16) // 转换为一个十六进制-
defer 和 async、动态创建 DOM 方式(用得最多)、按需异步载入 js
defer 并行加载 js 文件,会按照页面上 script 标签的顺序执行 async 并行加载 js 文件,下载完成立即执行,不会按照页面上 script 标签的顺序执行
属性 async=“async” (一旦脚本可用,则会异步执行)闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域。
闭包的特性:
use strict 是一种 ECMAscript 5 添加的(严格)运行模式,这种模式使得 Javascript 在更严格的条件下运行,使 JS 编码更加规范化的模式,消除 Javascript 语法的一些不合理、不严谨之处,减少一些怪异行为。
// 使用instanceof (待完善)
if(a instanceof Person){
alert('yes');
}
ajax 的全称:Asynchronous Javascript And XML
异步传输+js+xml
所谓异步,在这里简单地解释就是:向服务器发送请求的时候,我们不必等待结果,而是可以同时做其他的事情,等到有了结果它自己会根据设定进行后续操作,与此同时,页面是不会发生整页刷新的,提高了用户体验
创建新节点:
createDocumentFragment() //创建一个 DOM 片段
createElement() //创建一个具体的元素
createTextNode() //创建一个文本节点
添加、移除、替换、插入:
appendChild()
removeChild()
replaceChild()
insertBefore() //在已有的子节点前插入一个新的子节点
查找:
getElementsByTagName() //通过标签名称
getElementsByName() // 通过元素的 Name 属性的值(IE 容错能力较强,会得到一个数组,其中包括 id 等于 name 值的)
getElementById() //通过元素 Id,唯一性
标记清除(mark and sweep)
function createObject(name,age,profession){
//集中实例化的函数
var obj = new Object();
obj.name = name;
obj.age = age;
obj.profession = profession;
obj.move = function () {
return this.name + ' at ' + this.age + ' engaged in ' + this.profession;
};
return obj;
}
var test1 = createObject('trigkit4',22,'programmer');//第一个实例var test2 = createObject('mike',25,'engineer');//第二个实例
使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。在 js 中,函数即闭包,只有函数才会产生作用域的概念。
闭包有三个特性:
我们举例说明:比如一个黑客程序,他利用 Iframe 把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名,密码登录时,他的页面就可以通过 Javascript 读取到你的表单中 input 中的内容,这样用户名,密码就轻松到手了。]
缺点: 现在网站的 JS 都会进行压缩,一些文件用了严格模式,而另一些没有。这时这些本来是严格模式的文件,被 merge 后,这个串就到了文件的中间,不仅没有指示严格模式,反而在压缩后浪费了字节。
function deepClone(obj) {
if (!isObject(obj)) {
throw new Error('obj 不是一个对象!')
}
let isArray = Array.isArray(obj)
let cloneObj = isArray ? [] : {}
for (let key in obj) {
cloneObj[key] = isObject(obj[key]) ? deepClone(obj[key]) : obj[key]
}
return cloneObj
}
注意:for…in 法不支持拷贝 func、date、reg 和 err。
// 代理法
function deepClone(obj) {
if (!isObject(obj)) {
throw new Error('obj 不是一个对象!')
}
let isArray = Array.isArray(obj)
let cloneObj = isArray ? [...obj] : { ...obj }
Reflect.ownKeys(cloneObj).forEach(key => {
cloneObj[key] = isObject(obj[key]) ? deepClone(obj[key]) : obj[key]
})
return cloneObj
}
将时间设为当前时间往前一点
var date = new Date();
date.setDate(date.getDate() - 1);//真正的删除
setDate()方法用于设置一个月的某一天
expires 的设置
document.cookie = 'user='+ encodeURIComponent('name') + ';expires = ' + new Date(0)
假设:一个英文字符占用一个字节,一个中文字符占用两个字节
function GetBytes(str){
var len = str.length;
var bytes = len;
for(var i=0; i<len; i++){
if (str.charCodeAt(i) > 255) bytes++;
}
return bytes;
}
alert(GetBytes("你好,as"));
事件代理(Event Delegation),又称之为事件委托。是 JavaScript 中常用绑定事件的常用技巧。顾名思义,“事件代理”即是把原本需要绑定的事件委托给父元素,让父元素担当事件监听的职务。事件代理的原理是 DOM 元素的事件冒泡。使用事件代理的好处是可以提高性能。
设置 charset
放在
之前和之后有什么区别?浏览器会如何解析它们?
按照 HTML 标准,在结束后出现或任何元素的开始标签,都是解析错误;
虽然不符合 HTML 标准,但浏览器会自动容错,使实际效果与写在之前没有区别;
浏览器的容错机制会忽略之前的,视作
仍在 body 体内。省略
和