全网最全jQuery常用语法笔记

传送门

JQuery 入口函数

// jquery入口函数可以执行多次
$(document).ready(function(){
     console.log(1);
})

// 简写
 $(function(){
    console.log(1);
 })

JQuery 选择器

<div class="box-1">div</div>
<span class="txt-2">span</span>
<h3 id="demo">h3</h3>
<button>button</button>
<input type="text" value="input">
<ul>
    <li>1</li>
    <li>2</li>
</ul>
<input type="checkbox" checked>
<input type="checkbox">
<script>
    $(function() {
        // 页面上的标签
        // DOM: 文档对象模型(DOM 是控制页面元素的一套标准)
        // dom对象:页面上的标签(元素)

        // 选择器(获取页面标签的一种方式)
        // 调用 $函数或者 jQuery函数,传递的是选择器的标记
        // 返回 jquery 对象
        var o1 = $(".box-1") 
        console.log(o1); // o1 是 jQuery 对象
        console.log(typeof o1);
        console.log($("#demo"))
        console.log($("button"));
        console.log($("input[type='text']"))
        console.log($("ul > li:nth-child(1)"))
        console.log($("input[type='checkbox']:checked"))
    })
</script>
<div class="wrapper">
  <div class="nav">
    <ul>
      <li>颜色</li>
      <li>颜色</li>
      <li>颜色</li>
      <li class="active">黄色</li>
      <li>紫色</li>
      <li>粉色</li>
      <li>淡蓝色</li>
      <li>黄绿色</li>
    </ul>
  </div>
</div>
<script>
  $(function () {
    // 选中 .nav 标签
    $(".nav").css("background", "deepskyblue");
    // 选中 .nav 标签的父元素
    $(".nav").parent().css("height", "120px");
    // 选中 .nav 标签的子元素
    $(".nav").children("ul").css("backgroundColor", "#ccc");
    //选中 .nav 标签下所有的li元素
    $(".nav").find("li").css("borderRadius", "20px");
    // 选中 .active标签的上一个元素
    $(".active").prev().css("backgroundColor", "blue");
    // 选中 .active标签的下一个元素
    $(".active").next().css("backgroundColor", "purple");

    // 选中 .active以外的所有 li 元素
     $(".active").siblings("li").css("backgroundColor", "#fff");

    // 选中 ul li 列表中第一个 li 标签
    $("ul li").first().css("backgroundColor", "red");
    // 选中 ul li 列表中第一个 li 标签
    $("ul li").last().css("backgroundColor", "yellowgreen");

    // 通过索引值选中元素
    $("ul li").eq(1).css("background", "green");
    $("ul li").eq(2).css("background", "blue");

    // 选中倒数第二个li
    var len = $("ul li").length;
    $("ul li")
      .eq(len - 2)
      .css("backgroundColor", "lightblue");
    $("ul li")
      .eq(len - 3)
      .css("backgroundColor", "blue");
  });
</script>

JQuery 设置元素的样式

<div class="box-1"></div>
<script>
   $(function() {
       // 方法一
       $(".box-1").css("backgroundColor","red");
       
       // 方法二
       var option = {
           backgroundColor: "green",
           borderRadius: "50px"
       }
       $(".box-1").css(option);
   })
</script>

JQuery 控制元素的类名

<div>1</div>
<div>2</div>
<div>3</div>
<script>
    
  // 设置元素的类名 addClass
  $("div").eq(0).addClass("bg-red");
    
  // 移除元素的类名 removeClass
  $("div").eq(0).removeClass("bg-red");
    
  // 切换类名 toggleClass(存在就移除 不存在就添加)
  $("div").eq(0).toggleClass("bg-red");
  $("div").eq(0).toggleClass("bg-red");
    
  // 判断是否包含该类名 hasClass
  var flag = $("div").eq(0).hasClass("bg-red");  
  console.log(flag); // true 表示存在该类名; false表示不存在该类名
</script>

JQuery 控制元素的文本

<div>
   <!-- 双标签 -->
  <span>天空突然下了点雨</span>
</div>
<div class="form-1">
   <!-- 单标签 -->
   <input type="text" value="现在天气又好转了">
</div>
<script>
    // 获取值
    var v1 = $(".text-1").html();
    console.log(v1); //   <!-- 双标签 --><span>天空突然下了点雨</span>  原样输出
    
    // 获取值
    var v2 = $(".text-2").text();
    console.log(v2); // 天气突然下了点雨 去除掉标签 原样输出
    
    // 获取表单值
    var v3 = $(".form-1 input").val();
    console.log(v3);
    
    // 设置元素的纯文本
    $(".text-1").text("<b>天空突然下了点雨</b>");
    
    // 设置文本内容
    $(".form-1 input").val("输入...");
</script>

JQuery 控制标签的属性

<div class="">1</div>
<div id="">2</div>
<img src="" alt="3">
<a href="">4</a>
<script>
   // 设置标签的属性
   $("div").eq(0).attr("class","box");
   // 获取标签的属性
   var v1 =  $("div").eq(0).attr("class"); 
   // 删除标签的属性
   $('img').removeAttr("src")
</script>

JQuery 表单标签的属性控制

<div>
    <input type="button" value="按钮" disabled>
    <input type="button" value="按钮">
</div>
<div>
    <input type="checkbox" checked>
    <input type="checkbox" >
</div>
<script>
  var v1 = $("input[type='button']").eq(0).prop("disabled");
  var v2 = $("input[type='button']").eq(1).prop("disabled");
  console.log(v1);// true
  console.log(v2);// false
    
  var v3 = $("input[type='checkbox']").eq(0).prop("checked");
  var v4 = $("input[type='checkbox']").eq(1).prop("checked");
  console.log(v3);// true
  console.log(v4);// false 
    
   // 选择复选框标签 设置勾选状态
   $("input[type='checkbox']").eq(0).prop("checked",false);
</script>

JQuery 对象和 DOM 对象

<div></div>
<script>
   var $dom = $("div");
   console.log( $dom );
    
   // 转成 dom 对象
   var div1 = $dom[0];
   var div2 = $dom.get(0); 
    
   // 转成 jQuery 对象
   var ele = document.querySelector("div");
   var $ele =  $(ele);
   
</script>

JQuery 操作 DOM

  • 给容器中添加子元素
<div id="container">
    <div class="demo"></div>
</div>
<script>
  $(function() {
      // 添加元素 往容器标签尾端(索引值为length-1)添加元素 滚动加载
      $('container').append("<div class='box1'>1</div>");
      
      // 添加元素 往容器标签首位(索引值为0)添加元素 下拉刷新
      $('container').prepend("<div class='box'>4</div>");
  })
</script>
  • 给容器中添加子元素
<div class="box-1">
    <!-- 目标元素 -->
    <div></div>
</div>
<div class="box-2"></div>
<script>
// 把目标元素移动至指定的容器标签
$(function() {
 $(".box-1 > div").appendTo('.box-2');
})
</script>
  • 给指定元素前后添加元素
<div class="container">
    <div class="demo"></div>
</div>
<script>
    $(function() {
        // 在元素前添加元素
        $('demo').before('<h2>Hello World</h2>');
        // 在元素后添加元素
        $('demo').after('<h2>Hello world</h2>');
    })
</script>
  • 给指定元素前后添加元素
<div class="container">
    <div class="demo"></div>
</div>
<div class='box'></div>
<script>
   $(function() {
       // 将 .box 元素添加到 .demo元素的后面
       $('.box').insertAfter('.container .demo');
       $('.box').insertBefore('.container .demo');
   })
</script>
  • 删除元素
<ul>
    <li class="list-1">A</li>
    <li class="list-2">B</li>
    <li class="list-3">C</li>
</ul>
<script>
   $(function() {
       // 删除所有 li 元素
       $('ul li').remove();
       
       // 删除指定元素
       $('ul li').eq(0).remove();
       $('.list-1').remove();
       
       // 清空元素
       $('ul').html("");
       $('ul').empty();
   })
</script>
  • 克隆元素
<div class='container'>
    <ul>
        <li>列表1</li>
        <li>列表2</li>
        <li>列表3</li>
    </ul>
</div>
<script>
   $(function() {
       var $ele = $('.container').clone();
       $('body').append($ele);
   })
</script>

JQuery 事件

  • 方法一:$(selector).事件类型(function(){})
<button class="btn-1">点击按钮1</button>
<button class="btn-2">点击按钮2</button>
<button class="btn-3">点击按钮3</button>
<script>
   $('.btn-1').click(function() {
       console.log(this);
       // 把 dom 对象转成 jquery 对象
       $(this).css('backgroundColor', 'yellow')
   })
   // 其他事件监听也是类似 (jquery对象.监听事件的类型)
</script>
  • 方法二:$(selector).bind(事件类型,function(){})
<button class='btn'>按钮</button>
<script>
    // 一个监听器可以监听多种事件类型
   $('.btn').bind('click mouseenter', function(event) {
       var count = 0;
       // 获取事件的类型  
       var type = event.handleObj.origType;
       if(type === "click") {
           count++
           if(count == 5) {
               // 删除点击监听器
               $('.btn').unbind("click");
               // 删除所有事件类型的监听器
               // $(".btn").unbind(); 
           }
       }
       
   })    
</script>
  • 方法三:事件委托 delegate()
<ul>
    <li data-type="a">张三</li>
    <li data-type="b" class="item-2">李四</li>
    <li data-type="c">赵云</li>
    <li data-type="e">孙六</li>
</ul>
<script>
    // 区分父容器中的子元素
   $('ul').delegate("li[data-type='b']", 'click', function(e) {
       console.log(e.target)
   })
   $('ul').delegate(".item-2", 'click', function(e) {
       console.log(e.target)
   })
   $('ul').delegate("li", 'click', function(e) {
       if(e.target.dataset.type == 'b') {
           console.log("lisi")
       }
   })
    
   // 绑定多个事件
    $('ul').delegate(".item-2","click mouseenter",function(event) {
        if(event.handleObj.origType == "click") {
            console.log("click")
        }else if(event.handleObj.origType == "mouseenter") {
            console.log("mouseenter")
        }
    })
    
    // 解除点击事件
    $('ul').undelegate("click");
    // 解除所有事件
    $('ul').undelegate();
</script>
  • 方法四:事件委托 on() (jQuery 推荐)
<div class="container">
    <button>按钮1</button>
    <button>按钮2</button>
    <button>按钮3</button>
    <button>按钮4</button>
</div>
<script>
   // 绑定事件
   $('button').on("click", function() {
        console.log(e);
   })
    
   // 事件委托
   $('.container').on("click", "button", function(e) {
       console.log($(this))
   })
    
   // 绑定多个事件
   $('.container').on('click mouseenter', "button", function(e) {
       if(e.handleObj.origType == "click"){
           console.log('click')
       }
   })
    
   // 取消点击事件绑定
   $('.container').off("click")
   
   // 取消所有事件绑定
   $('.container').off();
</script>

显示和隐藏元素

  • 方式一:简单
<button class='btn-show'>显示</button>
<button class='btn-hide'>隐藏</button>
<div class='box'></div>
<script>
    // 元素隐藏
    $(".box").hide();
    
    // 元素显示
    $(".box").show();
    
    // 显示隐藏切换
    $(".box").toggle();
    
    // 方式一:执行动画,通过改变元素的宽度和高度等显示和隐藏元素
    $(".btn-show").click(function() {
        $(".box").show(1000);
        // $(".box").hide(1000);
    })
    
    // 方式二:fast / slow
    $(".btn-show").click(function(){
        $(".box").show("fast"); // 显示
     // $(".box").hide("slow"); // 隐藏  
    }) 
    
    // 方式三:动画结束后,可以执行回调函数
    $(".btn-show").click(function() {
        $(".box").show(1000, function() {
            console.log("show")
        })
    })
</script>
  • 方式二:下拉显示和收起隐藏
<button class='btn-show'>下拉显示</button>
<button class='btnl-hide'>收起隐藏</button>
<div class='box'>hello world</div>
<script>
    // 方式一
    $('.box').slideUp(); // 隐藏元素
    $('.box').slideDown(); // 显示元素
    $('.box').slideToggle(); // 切换
    
    // 方式二
    $('.box').slideDown(1000);
    
    // 方式三
    $('.box').slideDown(1000, function() {
        console.log("显示元素")
    })
</script>
  • 方式三:淡入显示和淡出隐藏
<button class="btn-show">淡入显示</button>
<button class="btn-hide">淡出隐藏</button>
<div class="box">hello world</div>
<script>
   // 方式一
   $('.box').fadeOut(); // 隐藏元素
   $('.box').fadeIn(); // 显示元素
   $('.box').fadeToggle(); // 切换
   
   // 方式二
   $('.btn-show').click(function() {
       $('.box').fadeIn(500)
   })
    
   // 方式三
   $('.btn-show').click(function() {
       $('.box').fadeIn(500, function() {
           console.log("淡入")
       })
   })
</script>

动画

  • 动画开始
<button class="btn-animate">执行动画</button>
<div class="box"></div>
<script>
    /*
      参数: 1、样式对象 2、毫秒值/英文词汇 3、回调函数
    */
    $(".btn-animate").animate({
        width: "100px",
        borderRadius: "50px"
    }, 1000, function() {
        $('.box').css("background", "blue")
    })
</script>
  • 动画结束
$("#start").click(function() {
    $('.box').animate({height:50}, 3000)
             .animate({width: 300}, 3000)
             .animate({marginLeft: 150}, 3000)
})
$("#pause").click(function() {
    // 一个参数
    $('.box').stop(); // 立即停止当前动画,继续执行后续动画
    $('.box').stop(true); // 立即停止当前的动画,不执行后续的动画
    $('.box').stop(false); // 立即停止当前动画,继续执行后续动画
    
    // 两个参数
    $('.box').stop(true, false); // 立即停止当前的动画,不执行后续的动画
    $(".box").stop(true,true); // 立即完成当前的动画,停止执行后续的动画
    $(".box").stop(false,true); // 立即完成当前的动画,会执行后续的动画
    $(".box").stop(false,false);  //立即停止当前的动画,会执行后续的动画
})

总结:参数不写默认为 false

后续动画 取绝于 第一个参数为 false则执行,true 则结束

当前动画 取绝于 第二个参数为false则停止,true 则完成

  • 动画队列
<button class="btn-start">开始</button>
<button class="btn-next">继续执行(下一个动画)</button>
<button class="btn-pause">停止</button>
<div>
    <div class="red"></div>
    <div class="green"></div>
</div>
<script>
  $(function() {
     // 定义动画队列
     var arr = [
       function() {$(.red).animate({marginLeft: 100}, 1000)},
       function() {$(.green).animate({marginLeft: 100}, 1000)},  
     ]
     // 绑定事件
     $(".btn-start").click(function() {
         $("body").queue("fx", arr)
     })
     $(".btn-next").click(function() {
         // 执行下一个动画
         $("body").dequeue("fx")
     })
     $(".btn-pause").click(function() {
         // 清除动画队列
         $("body").clearQueue("fx");
     })
  }) 
  // 如果以上方法不符合您的业务逻辑,那就直接根据数组索引值执行动画
  // var f1 = arr[0]
  // f1()
</script>

获取元素下标

  • 并列关系
<div>
    <button>按钮</button>
    <button>按钮</button>
    <button>按钮</button>
    <button>按钮</button>
    <button>按钮</button>
    <button>按钮</button>
</div> 
<script>
  $('div').on('click', "button", function() {
      console.log($(this).index);
  })
</script>
  • 嵌套关系
<div><button>按钮</button></div>
<div><button>按钮</button></div>
<div><button>按钮</button></div>
<div><button>按钮</button></div>
<div><button>按钮</button></div>
<div><button>按钮</button></div>
<script>
   $('div button').click(function() {
       var v1 = $('div button').index($(this));
       console.log(v1);
   })
</script>

遍历jQuery对象数组

  • 方法一: 调用者 jQuery 对象
<ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
</ul>
<script>
    // 定义颜色数组
    var arrColor = [
        "red",
        "green",
        "purple",
        "yellow",
        "pink"
    ]
    $('ul li').each(function(index, item) {
        // item 是 dom 对象
        // 讲 item 转成 jquery 对象
        $(item).css("background", arrColor[index]);
    })
</script>
  • 方法二:调用者 $
$.each(arrColor, function(index, item) {
    // index 代表索引值
    // item 代表数组的每一项的每一项数据
    $("ul li").eq(index).css("background", item);
})

拓展方法

  • 方式一: 调用者 jquery 对象
<div class="box"></div>
<script>
   // 写法一  $.fn fn是原型对象
   $.fn.sayHello = function() {
       console.log("hello world");
   }
   $.fn.changeWidth = function() {
       console.log(this); // 此时 this 是 jquery 对象
       console.log($(this));
       this.css("width","500px"); // 正确
       $(this).animate({width:500}, 2000); // 正确
   }
   $(".box").sayHello(); // hello world
   $(".box").changeWidth(); 
    
   //写法二 
    $.fn.extend({
        foo: function() {
            console.log("foo");
        },
        myRandom(num) {
            renturn Math.floor(Math.random()*num);
        }
    })
    $(".box").foo(); // foo
    $(".box").myRandom(100);
</script>
  • 方式二:调用者 $
// 方法一
$.sayHello = function() {
    console.log("hello world");
}
$.changeColor = function() {
    $(".box").css("background", "red")
}
$.sayHello();
$.changeColor();

//写法二
$.extend({
    foo: function() {
        console.log("foo");
    },
    myRandom(num) {
        return Math.floor(Math.random() * num);
    }
})
$.foo(); // foo
$.myRandom(100);

jQuery 中的 input 和 change 的区别

<input type="range" id="range"></input>
<script>
    // 触发一次
    $("#range").change(function() {
        console.log("change值", $(this).val());
    })
    // 触发多次
    $("#range").input(function() {
        console.log("input值", $(this).val());
    })
</script> 

更改 $ 别名

<button>点击一下</button>
<script>
    $(function() {
        // 更改 jQuery别名 $
        // 调用者: jQuery 或 $
        // 作用: 改变 jq的函数别名
        var _ = $.noConflict();
        
        _("button").click(function() {
            _(this).css("background", "red");
        })
    })
</script>

补充: jquery 中的 offset 与原生 offsetLeft 及 offsetTop的区别

注意: jquery 中的 offset 和原生 offset 获取的边距都是相对浏览器可视化的部分

jquery 中:

     offset 不受 定位的影响

原生 DOM 中:

     父容器是否设置了 position 属性值,会影响到其 offsetLeft
<style>
    body {
        margin: 0;
    }
    .header {
        height: 100px;
        border-bottom: 3px solid #000;  
    }
    .nav {
        width: 1000px;
         /* 经过计算水平居中距离左边距离为 268px 即 margin: 0 268px*/
        margin: 0 auto; 
        height: 100px;
        background-color: deepskyblue;
        /* 添加position */
        /* position: relative; */
    }
    .nav .box {
        width: 100px;
        height: 80px;
        background-color: red;
    }
</style>
<div class="header">
    <!-- 父元素 -->
    <div class="nav">
        <!-- 子元素 -->
        <div class="box"></div>
    </div>
</div>
<script>
    // 通过 jquery 来获取 .box 元素距离左边的距离
    var point = $(".box").offset(); // {top: 0,left: 268}
    console.log(point); 
    // 接下来 如果缩小浏览器的宽度小于 1000(.nav的宽度)
    console.log(point); // {top:0, left: 0}  正常
    // 父元素(.nav)去掉定位 position 也没有影响到
    
    // 原生情况下
    var box = document.querySelector(".box");
    // 父容器添加了 position 情况下
    console.log({
        top: box.offsetTop,
        left: box.offsetLeft
    }); // {top: 0, left: 0}
    // 父容器没有添加了 position 情况下
     console.log({
        top: box.offsetTop,
        left: box.offsetLeft
    }); // {top: 0,left: 268}
</script>

总结:

(1)在原生js 中 使用 offsetLeft 时需要考虑到父容器是否添加了定位属性

(2)而在 jq 中不需要考虑这个问题, offsetLeft 是直接获取该元素距离可视化浏览器左边的距离

(3)在 jq 中 即使子元素设置 top left 也不会影响到获取元素距离可视化浏览器的左和上的距离

jquery 对象中的position 方法

用法: $('.box').position(); 获取元素的位置

少用:由于jquery 的版本更新迭代,有些比较旧的版本没有该方法

offest 和 position 选择

 如果该元素添加了 top 和 left 属性 则使用 position

 反之, 使用 offset 获取即可

具体区别这里不细谈,可以通过下面例子来看看区别

<style>
body {
        margin: 0;
    }
    .header {
        height: 100px;
        border-bottom: 3px solid #000;  
    }
    .nav {
        width: 1000px;
        margin: 0 auto;
        height: 100px;
        background-color: deepskyblue;
        /* 添加position */
        position: relative;
    }
    .nav .box {
        width: 100px;
        height: 80px;
        background-color: red;
        /* 添加定位*/
        position: absolute;
        /* 考虑这里 */
        left: 30px;
    }
</style>
<div class="header">
    <!-- 父元素 -->
    <div class="nav">
        <!-- 子元素 -->
        <div class="box"></div>
    </div>
</div>
<script>
    var point = $(".box").offset();
    console.log(point);// {top: 0, left: 298}  268 + 30
    
   
    var pos = $(".box").position();
    console.log(pos) // {top: 0, left: 30} 
</script>

欢迎访问我的个人博客

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

推荐阅读更多精彩内容