第八周第四天笔记之jQuery知识点

jQuery知识点

1 基础知识

  • jQuery API
  • 知识点解读
    • 原生JS与jQuery代码放在head标签中的知识
      • 原生JS代码,放在head标签中,无法获取到body中的内容,因为页面是由上向下加载,所以不能获取到body中的内容,会报错;
      • 原生JS代码,放在head标签中,需要添加在window.onload=function(){}中,才能获取成功,指的是在页面加载完事之后,再执行JS代码;
      • jQuery代码,放在head标签中,必须先在head标签中引入jQuery库,才能使用;
      • jQuery代码,放在head标签中,也需要放在固定的格式中,如:$(function(){ 代码 })$(document).ready(function(){ 代码 });
    • window.onload=function(){}$(function(){ 代码 })的区别:
      • window.onload=function(){}是等页面所有的内容(图片、音频、视频、DOM结构...)都加载完成的时候,才执行JS代码;
      • $(function(){ 代码 })只要DOM结构加载完成,就开始执行JS代码;
     <!DOCTYPE html>
     <html lang="en">
     <head>
         <meta charset="UTF-8">
         <title>jQuery验证</title>
         <script src="jquery/jquery.js"></script>
         <script>
             //console.log(oDiv.innerHTML);//会报错,因为页面从上向下进行加载,新进行head后进行body,所以不会拿到oDiv;
             window.onload=function () {
                 console.log(oDiv);//结果为:<div id="div1" class="div1">div1</div>
             };
             //jQuery代码会快于上面的原生JS代码;
             $(function () {
                 //以下$(".div1")获取的是一个类数组对象,不是一个元素,长度为1,第一项为元素
                 console.log($(".div1"));//结果为:[div#div1.div1, prevObject: jQuery.fn.init(1), context: document, selector: ".div1"]
                 console.log($(".div1")[0]);//结果为:<div id="div1" class="div1">div1</div>
             });
             $(document).ready(function () {
                 console.log($(".div2,.div1"));//结果为:[div#div1.div1, div.div2, prevObject: jQuery.fn.init(1), context: document, selector: ".div2,.div1"]
             })
         </script>
     </head>
     <body>
     <div id="div1" class="div1">div1</div>
     <div class="div2">div2</div>
     <script>
         var oDiv=document.getElementById("div1");
     </script>
     </body>
     </html>
    

2 jQuery选择器

  • 基本选择器:
    • $("#div"):查找ID;$(".div"):查找class名;$("div"):查找标签名;$(".div1,.div2"):查找多个class名;
    • 获取的都是类数组对象,里面每一项为元素内容;
  • 代码验证:
     <!DOCTYPE html>
     <html lang="en">
     <head>
         <meta charset="UTF-8">
         <title>选择器验证</title>
     </head>
     <body>
     <div class="div1">内容:Div1</div>
     <div class="div2">内容:Div2</div>
     <div class="div3">内容:Div3</div>
     <div class="div4">内容:Div4</div>
     <script src="jquery/jquery.js"></script>
     <script>
         //1 获取第一个class名为div1的类数组
         console.log($(".div1"));
         console.log($("div:first"));
         console.log($("div").first());
         console.log($("div:eq(0)"));
         //以上代码结果均为:[div.div1, prevObject: jQuery.fn.init(1), context: document, selector: ".div1"]
         //2 获取除了第一个元素的其他元素
         console.log($("div:not(.div1)"));//not是除了哪个元素;
         console.log($(".div2,.div3,.div4"));
         //以上代码结果为:[div.div2, div.div3, div.div4, prevObject: jQuery.fn.init(1), context: document, selector: ".div2,.div3,.div4"]
         //3 奇数,偶数 even odd 指的是索引的奇偶
         $("div:even").css("backgroundColor","red");//索引为偶数的元素设置
         $("div:odd").css("backgroundColor","blue");//索引为奇数的元素设置
         //4 gt(n)大于索引n, lt(n)小于索引n;
         $("div:gt(1)").css("backgroundColor","yellow");//大于1的索引的元素设置
         $("div:lt(3)").css("backgroundColor","pink");//小于3的索引的元素设置
     </script>
     </body>
     </html>
    

3 jQuery选项卡制作实例

  • 知识点:每个方法返回的都是实例this,所以都能使用原型上的方法
  • 代码:
     <!DOCTYPE html>
     <html lang="en">
     <head>
         <meta charset="UTF-8">
         <title>选项卡实例</title>
         <style>
             *{
                 margin: 0;
                 padding: 0;
                 list-style: none;
             }
             .wrap{
                 width: 600px;
                 height: 350px;
             }
             .wrap button{
                 width: 200px;
                 height: 50px;
                 text-align: center;
                 line-height: 50px;
                 float: left;
             }
             .wrap button.active{
                 background-color: lightseagreen;
             }
             .wrap div{
                 width: 600px;
                 height: 300px;
                 text-align: center;
                 line-height: 300px;
                 display: none;
                 font-size: 30px;
             }
             .wrap div.show{
                 background-color: lightseagreen;
                 display: block;
             }
         </style>
     </head>
     <body>
     <div class="wrap">
         <button value="按钮1" class="active">按钮1</button>
         <button value="按钮2">按钮2</button>
         <button value="按钮3">按钮3</button>
         <div class="show">内容1</div>
         <div>内容2</div>
         <div>内容3</div>
     </div>
     <script src="jquery/jquery.js"></script>
     <script>
         $("button").click(function () {
             $(this).addClass("active").siblings("button").removeClass("active");
             $(".wrap div").eq($(this).index()).addClass("show").siblings("div").removeClass("show");
         })
     </script>
     </body>
     </html>
    

4 取值赋值合体

  • css()
    • 一个参数的时候:1)参数为属性名,则为获取属性值,其中width等含单位的,会获取到单位;2)参数为对象,则为设置一组属性
    • 两个参数的时候:第一个为属性名,第二个为属性值;其中属性名为width时,属性值可以不加单位;
  • html()
    • 获取 html()
    • 设置 html("内容")
  • val()获取设置同html()
    • 针对表单元素的值:input textarea select ;可以通过:input来获取所有表单元素;
  • attr()
    • 获取 attr("class")
    • 设置 attr("class","xxx")

5 原生JS与jQuery

  • 特性:二者只能共存,不能混淆;
  • 共存:指的是JS和jQuery之间能相互转换
    • JS代码获取的是一个标签元素,而jQuery代码获取的是一个实例对象数组;数组中的每一项为标签元素;
    • JS转成jquery: 只需要被$()包裹即可;如:this => $(this),var oDiv=xxx => $(oDiv);
    • jQuery转成JS: [index]或get(index),其中index为索引,即数组中的第几项;
  • 混淆:原生JS只能使用JS的方法,jQuery只能使用jQuery的方法;
  • 原生JS与jQuery共存转换实例
    • 知识点:jQuery代码中点击事件函数中的this为原生JS中的标签元素;
     <!DOCTYPE html>
     <html lang="en">
     <head>
         <meta charset="UTF-8">
         <title>共存实例</title>
         <style>
             .div1{
                 width: 200px;
                 height: 200px;
                 background-color: red;
             }
         </style>
     </head>
     <div class="div1"></div>
     <body>
     <script src="jquery/jquery.js"></script>
     <script>
         //需求:当点击div元素时,让其背景色变为黄色
         $(".div1").click(function () {
             //jQuery中事件函数中获取的this为原生JS中的元素标签
             console.log(this);//结果为:<div class="div1"></div>
             //1 用原生JS设置颜色
             this.style.backgroundColor="yellow";
             
             //2 将原生JS代码this转化为jQuery代码,使用jQuery方法
             $(this).css("backgroundColor","yellow");
            
             //3 可以将jQuery代码转化为原生JS代码,添加[index]或者.get(index)
             $(this)[0].style.backgroundColor="blue";
             //也可以写成.get(index)
             $(this).get(0).style.backgroundColor="blue";
             
             //二者可以相互转化,但是不能混淆使用,各自使用各自的方法;
         })
     </script>
     </body>
     </html>
    
  • 实例2:
    • 知识点:jQuery代码中获取一组标签元素后,不用遍历,直接给每一个元素设置;
     <!DOCTYPE html>
     <html lang="en">
     <head>
         <meta charset="UTF-8">
         <title>遍历元素</title>
     </head>
     <body>
     <div>div1</div>
     <div>div2</div>
     <div>div3</div>
     <div>div4</div>
     <div>div5</div>
     <script src="jquery/jquery.js"></script>
     <script>
         //需求:遍历所有div元素设置其背景色为红色
         //1 利用原生JS代码设置
         var aDiv=document.getElementsByTagName("div");
         for(var i=0; i<aDiv.length; i++){
             aDiv[i].style.backgroundColor="red";
         }
         
         //2 利用jQuery代码设置,不用遍历,直接设置;
         var $aDiv=$("div");
         $aDiv.css("backgroundColor","red");
         
         //3 二者共存设置
         var $aDiv=$("div");
         for(var i=0; i<$aDiv.length; i++){
             //$aDiv为一个数组,里面每项为标签元素,即$aDiv[i]为标签元素,原生JS
             $aDiv[i].style.backgroundColor="blue";
             //也可以将原生JS标签元素$aDiv[i]转化为jQuery代码,即用$()包裹起来;
             $($aDiv[i]).css("backgroundColor","pink");
         }
     </script>
     </body>
     </html>
    

6 浏览器可视区域数据

  • 浏览器可视区域的宽高及卷去的长度的获取
    • 浏览器可视区域的宽高:
      • 原生JS:utils.win("clientWidth")utils.win("clientHeight");
      • jQuery:$(window).width(),$(window).height();
    • 浏览区卷去的长度:
      • 原生JS:utils.win("scrollTop"),utils.win("scrollLeft");
      • jQuery:$(window).scrollTop(),$(window).scrollLeft;
  • 元素ele到body元素的偏移量
    • 原生JS:utils.offset(ele),返回值为一个对象:{Left:xxx,Top:xxx};
    • jQuery:$(ele).offset(),返回值为一个对象:{left:xxx,top:xxx};

7 jQuery中DOM操作

  • DOM节点关系:
    • parent():取得一个包含着所有匹配元素的唯一父元素的元素集合。
      • 实例:$("p").parent()指:查找每个p元素的父元素;$("p").parent(".selected")指:查找p元素的父元素中每个类名为selected的父元素。
    • parents():取得一个包含着所有匹配元素的祖先元素的元素集合(不包含根元素)。可以通过一个可选的表达式进行筛选。
    • children():取得一个包含匹配的元素集合中每一个元素的所有子元素的元素集合。
    • next():取得一个包含匹配的元素集合中每一个元素紧邻的后面同辈元素的元素集合。
    • nextAll():查找当前元素之后所有的同辈元素。
    • pre():取得一个包含匹配的元素集合中每一个元素紧邻的前一个同辈元素的元素集合。
    • prevAll():查找当前元素之前所有的同辈元素。
    • index():取得当前元素的索引值。
    • siblings():取得一个包含匹配的元素集合中每一个元素的所有唯一同辈元素的元素集合。可以用可选的表达式进行筛选。
  • DOM动态操作
    • 创建元素:$("<div></div>")$("<div>")
    • clone(): 复制克隆匹配的DOM元素并且选中这些克隆的副本。参数为boolean值;默认值为false:复制表层;true:深度复制;
    • append():向每个匹配的元素内部追加内容。主体为元素;
    • appendTo():把所有匹配的元素追加到另一个指定的元素元素集合中。主体为插入的内容;
    • prepend():向每个匹配的元素内部前置内容。
    • prependTo():把所有匹配的元素前置到另一个、指定的元素元素集合中。
    • before():在每个匹配的元素之前插入内容。
    • insertBefore():把所有匹配的元素插入到另一个、指定的元素元素集合的后面。
    • after():在每个匹配的元素之后插入内容。
    • insertAfter():把所有匹配的元素插入到另一个、指定的元素元素集合的后面。
    • replaceWith():将所有匹配的元素替换成指定的HTML或DOM元素。在dom操作中用里面的内容替换其他的内容,会发现替换的内容会移动到被替换的内容处,相当于剪切;
    • replaceAll():用匹配的元素替换掉所有 selector匹配到的元素。
    • remove():从DOM中删除所有匹配的元素,相当于自己删除自己。这个方法不会把匹配的元素从jQuery对象中删除,因而可以在将来再使用这些匹配的元素。但除了这个元素本身得以保留之外,其他的比如绑定的事件,附加的数据等都会被移除。
    • 注意:其中appendTo(), prependTo(), insertBefore(), insertAfter(),和replaceAll(),这几个方法成为一个破坏性操作,主体都是被操作的内容,要选择先前选中的元素,需要使用end()方法;

8 数据交互

  • jOuery中的ajax请求
    • 实例:表单元素的提交数据
    • 知识点:
      • type:请求方式,分为get和post,get显示数据,post不显示;
      • url:请求地址,后台数据地址;为防止地址相同可以加上随机数和事件戳;如:url:"ajax/data.txt?"+Math.random()+new Date().getTime().
      • async:是否异步,默认为true;
      • dataType:返回的数据类型;json,text
      • data:向后台传输的数据;表单元素数据可以通过serialize()方法获取;表单序列化;
      • success:成功后执行的函数;
      • error:失败后执行的函数;
    • 注意点:1)表单元素提交,必须设置name属性;2)提交按钮使用submit,提交不用设置data,自动获取提交;3)提交按钮使用button,需要添加点击事件,传入data数据;
     <!DOCTYPE html>
     <html lang="en">
     <head>
         <meta charset="UTF-8">
         <title>数据交互</title>
     </head>
     <body>
     <form action="https://www.baidu.com/" method="get" target="_blank">
         <label for="username">
             用户名:<input type="text" name="user1" id="username"/>
         </label><br/>
         <label for="password">
             密码:<input type="password" name="passw" id="password"/>
         </label>
         <!--<p><input type="submit" value="提交数据"/></p>-->
         <p><input type="button" value="提交数据"/></p>
     </form>
     <script src="jquery/jquery.js"></script>
     <script>
         // 注意:1)只要进行表单提交,必须设置name属性;
         //1)提交按钮使用submit,提交不用设置data,自动获取提交
         $.ajax({
             type:"GET",
             dataType:"json",//返回的数据类型;默认情况下是text,文本格式;
             url:"ajax/data.txt",//请求地址;
             success:function (val) {
                 var data=val;
                 console.log(data);
             },
             error:function (val) {
                console.log("获取失败")
             }
         });
         //2)提交按钮使用button,需要添加点击事件,传入data数据
         $("input[type=button]").click(function () {
             $.ajax({
                 //1 请求方式
                 type:"GET",
                 //2 是否异步
                 async:true,
                 //3 返回的数据类型,json、text
                 dataType:"json",//返回的数据类型;默认情况下是text,文本格式;解决了jsonParse的问题
                 //4 data前端向后台发送的数据,
                 //4.1 利用字符串拼接获取内容
                 //data:`username=${$("#username").val()}&password=${$("#password").val()}`,
                 //4.2 利用serialize()自动获取表单数据
                 data:$("form").serialize(),
                 //5 请求地址
                 url:"ajax/data.txt",//请求地址;
                 //6 成功后执行的函数
                 success:function (val) {
                     var data=val;
                     console.log(data);
                 },
                 //7 失败后执行的函数
                 error:function (val) {
                     console.log("获取失败");
                 }
             })
         })
     </script>
     </body>
     </html>
    

9 动画运动

  • show():显示隐藏的匹配元素。
  • hide():隐藏显示的元素。
  • toggle:用于绑定两个或多个事件处理器函数,以响应被选元素的轮流的 click 事件;如果元素是可见的,切换为隐藏的;如果元素是隐藏的,切换为可见的。
  • slideUp():通过高度变化(向上减小)来动态地隐藏所有匹配的元素,在隐藏完成后可选地触发一个回调函数。
  • slideDown():通过高度变化(向下增大)来动态地显示所有匹配的元素,在显示完成后可选地触发一个回调函数。
  • slideToggle():通过高度变化来切换所有匹配元素的可见性,并在切换完成后可选地触发一个回调函数。
  • fadeIn():通过不透明度的变化来实现所有匹配元素的淡入效果,并在动画完成后可选地触发一个回调函数
  • fadeOut():通过不透明度的变化来实现所有匹配元素的淡出效果,并在动画完成后可选地触发一个回调函数。
  • fadeTo(opacity):把所有匹配元素的不透明度以渐进方式调整到指定的不透明度,并在动画完成后可选地触发一个回调函数。
  • fadeToggle():通过不透明度的变化来开关所有匹配元素的淡入和淡出效果,并在动画完成后可选地触发一个回调函数。
  • animate(target,duration,effect,callback):创建自定义函数。
  • stop():停止所有在指定元素上正在运行的动画。
  • delay():设置一个延时来推迟执行队列中之后的项目。如:$(".wrap div").slideDown(3000).delay(2000).fadeOut(2000);即:添加点击事件后,div用3秒滑下,然后延迟2秒后,用2秒淡出;
 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>动画</title>
     <style>
         .wrap{
             width: 300px;
             margin: 20px auto;
         }
         .wrap button{
             width: 100%;
             height: 50px;
             line-height: 50px;
             background-color: lightseagreen;
             cursor: pointer;
         }
         .wrap div{
             width: 100%;
             height: 300px;
             background-color: red;
             display: none;
         }
     </style>
 </head>
 <body>
 <div class="wrap">
     <button>点击动画</button>
     <div></div>
 </div>
 <script src="jquery/jquery.js"></script>
 <script>
     //1 原生JS的原理设置;
     var bOk=true;
     $(".wrap button").click(function () {
         if(bOk){
             $(".wrap div").slideDown(3000,function () {
                 alert(1)
             });
         }else{
             $(".wrap div").slideUp(2000,function () {
                 alert(1)
             });
         }
         bOk=!bOk;
     });
     //2 jQuery运动库设置
     $("button").click(function () {
         //1) 直接用slideToggle来实现滑下滑上
         $(".wrap div").slideToggle(3000,function () {
             alert(1)
         });
         //2 分别设置滑下滑上,可以在中间添加延迟时间;
         $(".wrap div").stop().slideDown(3000).delay(3000).slideUp(5000);
     })
 </script>
 </body>
 </html>

10 事件

  • 点击事件:click
    • 在原生JS中,同一个元素添加同一个事件,事件只能发生一个,会被覆盖;因原生JS中,事件为0级事件;
     <script>
         //1 原生JS中事件为0级事件,给同一个元素添加同一个事件时,会被覆盖;
         var oDiv=document.getElementsByTagName("div")[0];
         oDiv.onclick=function () {
             alert(1);//不会弹出
         };
         oDiv.onclick=function () {
             alert(2);//会弹出
         }
     </script>
    
    • jQuery代码中,可以对同一个元素添加同一个事件;
     <script>
         //2 jQuery中的点击事件:多个事件都会弹出
         $("div").click(function () {
             alert(1);
         });
         $("div").click(function () {
             alert(2);
         });
     </script>
    
  • 绑定事件:on
    • 代码:on("click",fn);fn可以是匿名函数
    • on可以绑定多个事件;
  • 解除事件:off
    • 代码:off("click",fn);fn不能是匿名函数,要与on相对应;
     <script>
         function fn1(){
             alert(1);
         }
         function fn2(){
             alert(2);
         }
         function fn3(){
             alert(3);
         }
         $("div").on("click",fn1);
         $("div").on("click",fn2);
         $("div").on("click",fn3);
         $("div").off("click",fn1);//解除fn1,不会弹出1;
     </script>
    
  • 添加一次:one
    • 代码:one("click",fn1),只添加一次点击事件
    • 点击一次后,再点击的时候不会发生;

11 插件

  • 工具方法:给jQuery类添加静态属性,类调用执行
    • 插件chajian1代码:
     //静态方法的添加:直接给类添加静态属性
     $.extend({
         tab:function (ele) {
             $(ele).find("button").click(function () {
                 $(this).addClass("active").siblings("button").removeClass("active");
                 $(ele).find("div").eq($(this).index()).addClass("show").siblings("div").removeClass("show");
             })
         }
     });
    
  • 实例方法:给jQuery类的原型上添加属性方法;实例调用执行;
    • 插件chajian2代码:
     //给jQuery原型上添加方法
     $.prototype.extend({
         tab1: function () {
             var $aBtn = this.find("button");
             var $aDiv = this.find("div");
             $aBtn.click(function () {
                 $(this).addClass("active").siblings("button").removeClass("active");
                 $aDiv.eq($(this).index()).addClass("show").siblings("div").removeClass("show");
             })
         }
     })
    
  • 调用执行代码:
     <body>
     <div class="wrap" id="tab1">
         <button value="按钮1" class="active">按钮1</button>
         <button value="按钮2">按钮2</button>
         <button value="按钮3">按钮3</button>
         <div class="show">内容1</div>
         <div>内容2</div>
         <div>内容3</div>
     </div>
     <div class="wrap" id="tab2">
         <button value="按钮1" class="active">按钮1</button>
         <button value="按钮2">按钮2</button>
         <button value="按钮3">按钮3</button>
         <div class="show">内容1</div>
         <div>内容2</div>
         <div>内容3</div>
     </div>
     <script src="jquery/jquery.js"></script>
     <script src="js/chajian.js"></script>
     <script src="js/chajian2.js"></script>
     <script>
         //1 工具方法:给$添加静态属性,类调用执行;
         $.tab($("#tab1"));
         //2 实例原型上添加方法,实例调用执行
         $("#tab1").tab1();
         $("#tab2").tab1();
     </script>
     </body>
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342