小试牛刀——JavaScript基础部分

二.属性操作,图片切换,短信发送模拟

2.1 HTML属性操作

html属性操作:读 写
属性名
属性值
属性读操作:获取 找到
元素.属性名

属性写操作: ("添加")替换,修改
元素.属性名=新的值
oP.innerHTML 读取元素内的所有HTML内容
oP.innerHTML=新值 替换元素内的所有HTML内容

2.2条件判断

if(条件){
...
}

if(条件){
}else{
...
}

if(条件1){
}else if(条件2...){
}else{
}

2.3 数组应用及实例应用
2.8 图片切换及函数合并扩展模拟短信作业

三.for应用,自动生成,this关键字

3.1 动态方法:ByTagName()

var oUl=document.getElementById("list") -- 静态方法
var aLi=oUl.getElementByTagName("li") -- 动态方法
document.getElementByTagName("li");
aLi.length
aLi[0]

3.2 ByTagName动态方法特性

前边可以放document,也可以用元素
是一堆元素的集合,[]访问

3.3 初识for循环
3.4 for循环执行顺序

for(var i=0;i<arr.length;i++){
}

3.5 for应用:选取 生成 性能

var str="";
for(var i=0;i<100;i++){
str+='<input type="button" value="按钮" />
}
document.body.innerHTML=str;
//这样写生成速度快

3.6 for循环生成坐标
3.7 for循环遍历2维数组,嵌套
3.8 cssText文本格式化与属性操作
oDiv.onclick=function(){
  //oDiv.style.width='200px';
   oDiv.style.cssText='width:200px;height:200px;
}
//cssText没有太大兼容性问题 比较好用 没有改变原属性
3.9 综合实力:生成一组新闻及思路分析
3.10 this指向及this应用

this:这个
this:指的是调用当前方法(函数)的那个对象
window是JS老大

四.自定义属性,索引值

4.1 自定义属性,自定义一组开关应用

JS可以为任何的html元素添加任意个自定义属性

for(var i=0;i<arr.length;i++){
  arr[i].onOff=true;
  arr[i].onclick=function(){
      if(this.onOff){
      ...
        this.onOff=false;
      }else{
      ...
        this.onOff=true;
      } 
  }
}
4.2 获取自身递增数字及匹配数组内容
        var aBtn=document.getElementsByTagName("input");
          var arr=['A','B','C','D'];
          for(var i=0;i<aBtn.length;i++){
                aBtn[i].num=0;
                aBtn[i].onclick=function(){
                    this.value=arr[this.num]
                    this.num++;
                    if(this.num===arr.length){
                        this.num=0;
                    }
                }
            }
4.3 添加索引值 匹配数组 HTML元素
  var aBtn=document.getElementsByTagName("input");
            for(var i=0;i<aBtn.length;i++){
                aBtn[i].index=i;
                aBtn[i].onclick=function(){
                    this.value=this.index;
                }
            }
4.4 图片切换综合实例
4.8 QQ菜单实例2:实现点击高亮显示,3道作业要求

五.JS数据类型,类型转换

5.1 JS数据类型及相关操作

js中的数据类型 原始类型: Number String Boolean null undefined
引用类型:函数 对象(obj [] {} )
typeof 判断数据类型
str.charAt() 根据下标获取子字符串

5.2 数据类型转化Number

var a="100";
Number(a);//100
var a="";
Number(a)://0
var a=true;
Number(a);//0
var a=[];
Number(a);//0
var a="w";
Number(a);//NaN

5.3 parsetInt与parsetFloat的区别

var a="200px"
parsetInt(a)//20
var a="200.332px"
parseFloat(a);//200.332

5.4 Js中稀奇古怪的隐式类型转换

+ - * / %
++ --
><
!
==

5.5 isNaN应用实例

一旦程序中出现 NaN 肯定是进行了非法的运算操作
is Not a Number 不是数字
isNaN();//true false

5.6 数据类型转换所对应的小练习

六.函数传参,重用,价格计算

6.1函数传参 参数类型

函数传递参数 参数=js的数据类型 数字 字符串 布尔 函数 对象 未定义

6.2 传参应用 类型判断及多组

尽量保证HTML代码结构一致 可以通过父级选取子元素
把核心主程序实现,用函数包起来
把每组里不同的值找出来,通过传参实现

七.作用域,JS预解析机制

7.1 js作用域和预解析机制

作用域:
域:空间 范围 区域
逐行解读代码

7.2 全局与局部作用域解析 作用域链

由上到下 由内到外

  1. 预解析:var function 参数...
    function a(){alert(4)}
    a=....(未定义)X
    遇到重名的:只留下一个
    变量和函数重名了,就只留下函数
  2. 逐行解读代码
    表达式:= + / *...
    表达式可以修改预解析的值
    alert(a);// function a(){alert(4)}
    var a=1;
    alert(a);//1
    function a(){alert(2)}
    alert(a);//1
    var a=3;
    alert(a);//3
    function a(){alert(4)}
    alert(a);//3
7.3 调用局部数据 全局声明 for嵌套函数中i取值
  var a=1;
    function fun(a){
        alert(a);//1
        a=2;
    }
    fun(a);
    alert(a);//1

八.运算符,流程控制

运算符流程控制

判断: if,switch(case break default),? :
循环:while ,for
跳出:break , continue
什么是真,什么是假
真:非零的数字,字符串,true,函数,Object:[] {}(存在)
假:零,NaN,空字符串,false,null,未定义

var str="css"
switch(str){
  case "js" : alert("js");
  break;
  case "html" : alert("html");
  default;
  case "css" : alert(str);
}
//三目
alert(12<450?"120<450":"120!<450")

//while循环
var i=0;
while(i<3){
  alert(i);
  i++
}

//for循环
for(var i=0;i<3;i++){
  if(i===2){
    break;
   //continue;
    }
alert(i);
}

九.return,定时器基础

9.1函数返回值 return详解应用

return返回值 :数字 字符串 布尔 函数 对象.......(元素 [] {} null) 未定义----数据类型

  1. 函数名+括号: fn1()==>return后面的值;
  2. 所有函数默认返回值:未定义(undefined)
  3. return 后面的任何代码都不执行了;
9.2 arguments实参集合与局部变量,参数关系

arguments是实参 形参可以不要---实参的集合(类数组集合)

sum(1,2,3);
sum(1,2,3,4);
function sum(){
  var n=0;
  for(var i=0;i<arguments.length;i++){
      n+=argumenst[i];
  }
}
9.3 currentStyle与getComputedStyle应用

getComputedStyle(element).width/height/.... //获取计算机计算后的样式
background:url() red... 复合样式不要获取 单一样式不要做判断
不要有空格 不要获取未设置后的样式: 不兼容

getStyle(,'width');
function getStyle(obj,attr){
    return obj.currentStyle?obj.currentStyle[attr]:getComputedStyle(obj)[attr];
}
9.4 setInterval详解,定时器管理,背景选择实例

定时器:时间概念
setInterval(函数,毫秒);//重复执行
clearInterval(timer) //清除

注意 : 定时器如果是由事件控制的 一定要先关后开 每次点击之前先清除一下

9.5 setTimeout详解,弹窗广告实例(写在demo里)
9.6 定时器应用-自动切换焦点图,qq延时菜单实例(写在demo里)

十.定时器管理,函数封装

10.1 定时器管理-开关设置

要明白定时器使用规则 每次定时器执行时 要先清除定时器

10.2,10.2 函数封装的传参,判断处理,正负值的处理,添加毁掉函数
     div{width:60px;height:60px;background:red;position:absolute;left:0;top:35px;}
    <input type="button" value="向前" id="btn1">
    <input type="button" value="向后" id="btn2">
    <div id="div1"></div>
    <script>
        /*
        * obj 对象
        * attr css属性 方向 宽高云云
        * dir 步长
        * target 目标
        * endFn 回调函数
        * */
        var oBtn1=document.getElementById("btn1");
        var oBtn2=document.getElementById("btn2");
        var oDiv=document.getElementById("div1");
        oBtn1.onclick=function(){
            doMove(oDiv,"left",10,800,function(){doMove(oDiv,"top",10,500)});
        }
        oBtn2.onclick=function(){
            doMove(oDiv,"left",10,0);
        }
        function  doMove(obj,attr,dir,target,endFn){
            dir=parseInt(getStyle(obj,attr))<target?dir:-dir;
            clearInterval(obj.timer);
            obj.timer=setInterval(function(){
                var speed=parseInt(getStyle(obj,attr))+dir;
                if(speed>target&&dir>0||speed<target&&dir<0 ){
                    speed=target;
                }
                obj.style[attr]=speed+"px";

                if(speed===target){
                    clearInterval(obj.timer);
                    endFn&&endFn();
                }
            },50)

        }
        function getStyle(obj,attr){
            return obj.currentStyle?obj.currentStyle[attr]:getComputedStyle(obj)[attr];
        }



    </script>
10.4 doMove应用小练习

引入以上封装js

 window.onload=function(){
        var str="";
        var len=10;
        var aDiv=document.getElementsByTagName("div");
        var timer=null;
        var num=0;
        var onOff=true;
        for(var i=0;i<len;i++){
            str+='<div style="width:50px;height:50px;background:red;position:absolute;top:0px;left:'+i*60+'px;"></div>'
        }
        document.body.innerHTML=str;
        document.onclick=function(){
            clearInterval(timer);
            timer=setInterval(function(){
                if(onOff){
                    doMove(aDiv[num],'top',30,500);
                    num++;
                    if(num===len){
                        clearInterval(timer);
                        onOff=false;
                        num=0;
                    }
                }else{
                    doMove(aDiv[num],'top',30,0);
                    num++;
                    if(num===10){
                        clearInterval(timer);
                        onOff=true;
                        num=0;
                    }
                }
            },200)

        }
    }
10.5 抖动原理及实现过程

需要引入以上封装js

 img{width:260px;height:auto;display:block;position:absolute;top:100px;left:250px;}
 window.onload=function(){
        var oImg=document.getElementById("img1");
         oImg.onclick=function(){
            var pos=parseInt(getStyle(oImg,"left"));
            var arr=[];
            var timer=null;
            var num=0;
            for(var i=20;i>0;i-=2){
                arr.push(i,-i)
            }
            arr.push(0);
           clearInterval(timer);
           timer=setInterval(function(){
               oImg.style.left=pos+arr[num]+"px";
               num++;
               if(num===arr.length){
                   clearInterval(timer)
               }
           },50)
        }
    }
10.6 抖的函数封装及隐患,修复及练习
 img{width:260px;height:auto;display:block;position:absolute;top:100px;left:250px;}
 window.onload=function(){
        var oImg=document.getElementById("img1");
        var onOff=true;
        oImg.onmouseover=function(){
            shake(oImg,'top')
        }
        function shake(obj,attr,endFn){
            if(onOff){
                clearInterval(obj.timer);
                onOff=false;
                var num=0;
                var arr=[];
                var pos=parseInt(getStyle(obj,attr));
                for(var i=20;i>0;i-=2){
                    arr.push(i,-i)
                }
                arr.push(0);

                obj.timer=setInterval(function(){
                    oImg.style[attr]=pos+arr[num]+"px";
                    num++;
                    if(num===arr.length){
                        clearInterval(obj.timer);
                        endFn&&endFn();
                        onOff=true;
                    }
                },50)
            }
        }
    }
    /*
    * 心得:如何在一次事件没有执行完毕之前避免当时再次执行该事件 找了两种方法
    * 第一种方法:定义一个开关,让它为true,在true的条件下执行事件 执行过程中开关为false 执行完毕开关再变回true
    * 第二种方法:定义一个遮罩层,再第一次事件执行的时候生成 然后就可以防止再次执行事件穿透 第一次事件执行完毕遮罩层删掉云云
    *
    * */

十一.日期对象,时钟倒计时

11.1系统时间对象

系统时间对象 new Date() -----当前系统的时间对象
getFullYear()
getMonth()
getDate()
getDay()
getHours()
getMinutes()
getSeconds()

方法名 描述
getFullYear() 返回Date对象"年份"部分的实际数值
getMonth() 返回Date对象"月份"部分的数值(0-11)
getDate() 返回Date对象"日期"部分数值(1-31)
getDay() 返回Date对象"星期"部分的数值(0-6)
getHours() 返回Date对象"小时"部分的数值(0-23)
getMinutes() 返回Date对象"分钟"部分的数值(0-59)
getSeconds() 返回Date对象"秒"部分的数值(0-59)
getMilliseconds() 返回Date对象"毫秒部分的数值(0-999)"
getTime() 返回Date对象与UTC时间1970年1月1日午夜之间相差的毫秒数
getTimezoneOffset() 返回本地时间与格林威治标准时间(GMT)的分钟差
修改时间信息
setFullYear() 设置Date对象中"年份"部分的实际数
setMonth() 设置Date对象中"月份"部分的数值(0-11,但不限于)
setDate() 设置Date对象中"日期"部分的数值(1-31,但不限于)
setHours() 设置Date对象中"小时"部分的数值(0-23,但不限于)
setMinutes() 设置Date对象中"分钟"部分的数值(0-59,但不限于)
setMilliseconds() 设置Date对象中"毫秒"部分的数值(0-999,但不限于)
setTime() 以毫秒值设置Date对象
时间格式转换
toString 返回Date对象的字符串形式
toDateString() 返回Date对象"日期"部分(年月日)的字符串形式
toTimeString() 返回Date对象"时间"部分(时分秒)的字符串形式
toLocaleString() 基于本地时间格式,返回Date对象的字符串形式
toLocalDateString() 基于本地时间,返回Date对象"日期"部分(年月日)的字符串形式
toLocalTimeString() 基于本地时间格式,返回Date对象"时间"部分(时分秒)的字符串形式
toGMTString() 基于GMT时间格式,返回Date对象的字符串形式
toUTCString() 基于UTC时间格式,返回Date对象的字符串形式
11.3 倒计时原理

Date对象参数:
数字形式: new Date(2017,4,1,9,48,12);
字符串形式: new Date('June 10,2017 12:12:12');
月份取值:January February Match April May June July August September October November December
时间转换公式:
天:Math.floor(t/86400)
时:Math.floor(t%86400/3600)
分:Math.floor(t%86400%3600/60)
秒:t%60
时间戳: getTime()
返回从1970年1月1日0点0分0秒0毫秒

11.4 倒计时实例
function fnTime(){
        var iNow=new Date();
        var iNew=new Date(2018,0,2,18,0,0);
        var t=Math.floor((iNew-iNow)/1000);
        var str=Math.floor(t/60/60/24)+"天"+Math.floor(t%86400/3600)+"时"+Math.floor(t%86400/60)+"分"+Math.floor(t%60)+"秒";
        document.body.innerHTML="距离下班还有: "+str;
    }
    fnTime();
    setInterval(function(){
        fnTime();
    },1000)

十二.字符串,查找高亮显示

12.1 字符串获取类,封装检测数字的方法
  1. str.charAt()------对应下标的内容
  2. str.charCodeAt()------对应下标内容的编码
  3. String.fromCharCode(22937)----根据编码转换为字
12.2 fromCharCode返回字符串实例,字符串加密
12.3 indexOf,lastIndexOf
  1. str.indexOf('x',1) ----从左往右找,第一个参数是一个字符串,默认从0开始查找 ,如果有第二个参数数字就从数字指定的位置开始查找 返回-1表示没找到
  2. str.lastIndexOf('x')----从右往左找 如果第二个参数为负数,默认当成0来处理
12.4 比较类,截取类,substring应用实例
  1. subString()------默认从0开始截取全部,可以检测两个数,小的自动放前边,如果有一个参数为负数 默认从0开始
    两个特点:两个参数会自动交换位置,所有的负数当0处理
    总而言之,就记着str.subString(x,y)---从x开始截取到y结束 x<y
  2. str.slice(x,y)---从x开始到y结束 可以支持负数
12.5 大小写转换,split分割字符串
  1. str.toUpperCase();------转化为大写
  2. str.toLowerCase();------转化为小写
  3. str.split('x'); 字符串分割成一个数组
12.6 split彩色文字效果实例
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        div{width:300px;height:300px;border:1px solid red;padding:5px;}
        span{padding:5px 15px;display:inline-block;margin:5px 0;}
    </style>
</head>
<body>
<div id="div"></div>
<input type="text">
<input type="button" value="按钮">
<script>
    var  oDiv=document.getElementById("div");
    var aInp=document.getElementsByTagName("input");
    aInp[1].onclick=function(){
        var str=aInp[0].value;
        var arr=str.split("");
        var color=["#f2a0a1","#c1e4e9","#5b7e91","#eaf4fc"];
        for(var i=0;i<arr.length;i++){
            arr[i]="<span style='background:"+color[i%color.length]+"'>"+arr[i]+"</span>";
        }
       oDiv.innerHTML=arr.join("");

    }
</script>
</body>
12.7 高亮显示关键字实例,替换搜索关键字实例
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        div{border:10px solid #ddd;width:360px;height:200px;background:#ebf6f7;font-size:14px;padding:6px;margin: 5px 0;}
        span{background:#ff4;}
    </style>
</head>
<body>
<input type="text">
<input type="text">
<input type="button" value="替换">

<div id="div">
    老王送孙子上学,路上看到一帮人对着一名环卫工又拍又照的。回头对孙子说:看到没,不好好学习将来和他一样扫马路。 老王送孙子上学,路上看到一帮人对着一名环卫工又拍又照的。回头对孙子说:看到没,不好好学习将来和他一样扫马路。 老王送孙子上学,路上看到一帮人对着一名环卫工又拍又照的。回头对孙子说:看到没,不好好学习将来和他一样扫马路。 老王送孙子上学,路上看到一帮人对着一名环卫工又拍又照的。回头对孙子说:看到没,不好好学习将来和他一样扫马路。 老王送孙子上学,路上看到一帮人对着一名环卫工又拍又照的。回头对孙子说:看到没,不好好学习将来和他一样扫马路。
</div>
<script>
    window.onload=function(){
        var div=document.getElementById("div");
        var text=div.innerHTML;
        var input=document.getElementsByTagName("input");
        input[2].onclick=function(){
            var str=input[0].value;
            var newStr=input[1].value;
            if(!str) return;
            div.innerHTML=text.split(str).join('<span>'+newStr+'</span>');
        }

    }
</script>
12.8 字符串方法总结,两道有趣的课后练习

var str = '字符串方法总结字符串方法总结www.com';
str.charAt(1); // '字'
str.charCodeAt(1); // 21619
String.fromCharCode(22937, 21619); // '妙味'
str.indexOf('m', 4); // 9
str.lastIndexOf('o'); // 16
'1000' < '2' // true
'1000' > 2 // true
str.substring(0, 4); // '字符串方'
str.slice(-3); // 'com'
str.toUpperCase(); // '妙味课堂-WWW.COM'
str.toLowerCase(); // '妙味课堂-www.com'
str.split('.', 2); // [ '字符串方法总结字符串方法总结www','com']

十三.JSon,数组方法,随机函数,数组去重

13.1 json数据格式及json语法

var json={name:'leo',age:'32'}
json.name-----leo
var json={name:'leo',age:'32'}
var json={'name':'leo','age':'32'}---安全系数高

13.2 for in遍历json语法

for( var attr in json){
console.log(json[attr])
}

13.3 数据定义及清空数据效率问题

arr.length="";

13.4 数组4个小宝贝方法与技巧

arr.push("abc")
arr.unshift("abc") ---IE6 7不支持
arr.pop("abc") -----如果不写任何参数 默认为1
arr.shift("abc") -----如果不写任何参数 默认为1

一种排队的方法
var arr=["小乔","大乔","武则天","诸葛亮","阿珂"];
arr.unshift(arr.pop())
13.5 splice方法,数组去重

//删除 替换 添加
arr.splice()
第一个参数: 从几开始
第二个参数: 删除几个
之后的参数: 用于替换或添加内容 取决于第二个参数 如果为0 则是添加 否则为替换

13.6 sort排序

arr.sort() ---字符串的比较
arr.sort(function(a,b){return a-b}) ----从小到大
arr.sort(function(a,b){return b-a}) ----从大到小
排序扩展实例:

var arrWidth=["345px","58px","90px","1000px"]
arrWidth.sort(function(a,b){
    return parseInt(a)-parseInt(b);
})
console.log(arrWidth)//["58px", "90px", "345px", "1000px"]
随机排序
arr.sort(function(a,b){
    return Math.random()-0.5;
})
13.7 随机数及随机公式推理过程

Math.round(Math.random()*(max-min)+min)

13.8 concat,reverse,面试题及练习

arr.concat()
arr.reverse()

数组去重splice()方法

var arr=[2,5,6,8,5,3,9,7,5,2,6];
    for(var i=0;i<arr.length;i++){
        for(var n=i+1;n<arr.length;n++){
            if(arr[i]===arr[n]){
                arr.splice(n,1);
            }
        }
    }

随机产生100个从0-1000之间不重复的整数

var n=100;
    for(var i=0,str=[];i<n;i++){
        str.push(Math.round(Math.random()*n));
        if(str.length>1){
            for(var a=0;a<str.length;a++){
                for( b=a+1;b<str.length-1;b++){
                    if(str[a]===str[b]){
                        str.splice(b,1);
                        n++;
                    }
                }
            }
        }
    }
    str=str.join(" | ");
    document.body.innerHTML=str;

为数组编写indexOf();方法

var arr=[6,9,3,8,7,4,5];
indexOf(arr,5);
function indexOf(arr,elem){
  for(var i=0;i<arr.length;i++){
      if(arr[i]===elem){
        return i;  
      }
    }
   return -1;
}

冒泡排序

 var arr=[5,26,3,59,18,22,66,37,42,26];
  for(var n=1;n<arr.length;n++){
       for(var i=0;i<arr.length-n;i++){
            if(arr[i]>arr[i+1]){
                arr[i]+=arr[i+1];
                arr[i+1]=arr[i]-arr[i+1];
                arr[i]-=arr[i+1]
            }
       }
    }
    console.log(arr)

找最大

    var arr=[5,26,3,59,18,22,66,37,42,26];
    var max=arr[0];
    for(var i=0;i<arr.length-1;i++){
        if(max<arr[i+1]){
            max=arr[i+1]
        }
    }
    console.log(max)

去掉数组中重复的元素(哈希去重),并统计原数组中每个值出现的次数,输出出现次数最多的那个字符和次数

 var arr=[5,26,3,59,18,22,66,37,42,26,3,18,5,5];
    var hash={};
    for(var i=0;i<arr.length;i++){
        if(hash[arr[i]]!==undefined){
             hash[arr[i]]++;
        }else{
             hash[arr[i]]=1;
        }
    }
    console.log(hash);//{3: 2, 5: 3, 18: 2, 22: 1, 26: 2, 37: 1, 42: 1, 59: 1, 66: 1}
    arr=[];
    var max=maxKey=0;
    for(var key in hash){
        arr[arr.length]=(key-=0);
        if(hash[key]>max){
           max=hash[key]
        }
        if(max===hash[key]){
            maxKey=key;
        }
    }
    console.log("输出次数最多的数字是:"+maxKey+" 次数为: "+max);//输出次数最多的数字是:5 次数为: 3
    console.log(arr);//去重后 :[3, 5, 18, 22, 26, 37, 42, 59, 66]

统计字符串中每个字符出现的次数,并输出出现次数最多的那个字符

    var str="zheshiyigetebiemeidedifang";
    var hash={};
    for(var i=0;i<str.length;i++){
        if(hash[str[i]]===undefined){
            hash[str[i]]=1;
        }else{
            hash[str[i]]++;
        }
    }
    var max=maxKey=0;
    for(var key in hash){
        if(hash[key]>max){
            max=hash[key];
        }
        if(max===hash[key]){
            maxKey=key;
        }
    }
    console.log(hash)
    console.log(max)
    console.log(maxKey)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容