w3cschool小编带你了解mybatis

thbcm阅读(175)

什么是mybatis:

Mybatis本质是一种半自动化的ORM框架,前身是ibatis,除了要pojo和映射关系之外,还需要些sql语句。

怎么看待ORM框架:

处理矛盾的,java程序员喜欢面向对象开发和面向接口开发,而数据库是一张张表和一个个库组成的,这两者的关系很难调和,而关系型映射解决了这一个问题。

Mybatis映射文件三要素:

  • SQL;
  • 映射规则;
  • Pojo。

为什么要用mybatis而不用hibernate?

在我们互联网的环境里面, 我们经常要面对海量数据,所以我们要基于底层的调优能力,就是sql语句。而hibernate生成的sql语句很不透明。

Mybatis核心流程三大阶段:

  • 初始化阶段,读取XML配置文件和注解中的配置信息,创建解析对象,并完成各个模块的初始化工作。就是把我们的配置文件加载到内存里面去。在sqlSession初始化的时候加载到内存中去的;
  • 代理阶段,封装iBatis的编程模型,使用mapper接口开发的初始化工作;
  • 数据读写阶段,通过SqlSession完成SQL的解析,参数的映射,SQL的执行,结果的反射解析过程。

SqlSession

SqlSession意味着创建数据库会话,代表了一次与数据库的连接;

是mybatis对外提供数据访问的主要API;

实际上SqlSession的功能都是基于Excutor来实现的。

Mybatis的两种编程模型Mybatis封装了ibatis编程模型,使用sqlsession对外提供数据库的访问。还有一种是使用mapper接口编程,就可以访问数据库

Mybatis和ibatis的区别

Mybatis前身是ibatis的,ibatis之前是Apache旗下的产品,后来到了谷歌旗下,但是谷歌发现ibatis实现起来很麻烦,还需要维护静态变量,并且没有业务含义。所以谷歌改成了mybatis,通过面向接口的方式,让所有代码有了业务含义,屏蔽掉了底层代码的复杂性。

为什么使用mapper接口就可以对数据库进行访问了呢?

其实最后它还是转成了底层的ibatis执行方法,它会使用配置文件解读+动态代理, 找到session中的对应方法执行,找到方法的命名空间和方法名。传递参数。

业务流程还是首先要实例化sqlssessionFactory,加载数据库配置文件以及mapper.xml到configuration对象。然后获取sqlsession对象。然后通过动态代理跨越面向接口编程和ibatis编程的鸿沟,最后遵循jdbc的规范,通过底层的四大对象合作完成功能。

推荐好课:

Mybatis3.x从入门到精通

MyBatis 教程

Mybatis常见面试题

jQuery代码片段:一些实用的示例代码

thbcm阅读(176)

jQuery 是当前非常火爆的一款 javascript 框架,下边是由网给大家收集的一些实用的 jQuery 示例代码片段,当然您可以下载 jQuery </code>

</pre>

 使用 jQuery 来切换样式表

$("link[media='screen']").attr("href", "Alternative.css");

 jQuery 检测浏览器类型

(if( $.browser.safari)) (if ($.browser.msie && $.browser.version > 6 )) (if ($.browser.msie && $.browser.version <= 6 )) (if ($.browser.mozilla && $.browser.version >= '1.8' ))

 jQuery 验证某个元素是否为空

if ($("#Demo").html()) { //null;}

 jQuery从集合中获得索引值

$("ul > li").click(function () { var index = $(this).prevAll().length; });

 jQuery选择被选中的option元素

$("#someElement").find("option:selected");

 jQuery为选择器绑定方法

$("table").delegate("td", "hover", function(){ $(this).toggleClass("hover"); }); //1.42版后,delegate替代live,因为它们提供了更好的上下文支持

 jQuery自动滚动到页面中的某区域(可以看做一个小插件)

jQuery.fn.Autoscroll = function(sel) { $('html,body').animate( {scrollTop: $(sel).offset().top},500 ); } //调用:$("#area_name").Autoscroll();

 jQuery限制”TextArea”域中的字符数(可以看做一个小插件)

(function($) { jQuery.fn.maxLength = function(max){ this.each(function(){ var type = this.tagName.toLowerCase(); var inputType = this.type ? this.type.toLowerCase() : null; if (type == "input" && inputType == "text" || inputType == "password") { //应用标准的maxLength this.maxLength = max; } else if (type == "textarea") { this.onkeypress = function(e){ var ob = e || event; var keyCode = ob.keyCode; var hasSelection = document.selection ? document.selection.createRange().text.length > 0 : this.selectionStart != this.selectionEnd; return !(this.value.length >= max && (keyCode > 50 || keyCode == 32 || keyCode == 0 || keyCode == 13) && !ob.ctrlKey && !ob.altKey && !hasSelection); }; this.onkeyup = function(){ if (this.value.length > max) { this.value = this.value.substring(0, max); } }; } }); })(jQuery); //调用:$('#macoArea").maxLength(500);

 jQuery判断某个元素是否可见

if($("#macoArea").is(":visible") == "true") { //少年,别跑 }

 jQuery元素居中显示(可以看做一个小插件)

(function($) { jQuery.fn.center = function () { this.css('position','absolute'); this.css('top', ( $(window).height() - this.height() ) / +$(window).scrollTop() + 'px'); this.css('left', ( $(window).width() - this.width() ) / 2+$(window).scrollLeft() + 'px'); return this; } })(jQuery); //调用:$("#macoArea").center();

 jQuery使用.siblings()选择同辈元素

// 少年,你是否这样操作过 $('#nav li').click(function(){ $("#macoArea li").removeClass("current"); $(this).addClass("current"); }); //这样做是不是会更好呢 $("#nav li").click(function(){ $(this).addClass("current").siblings().removeClass("current"); });

 jQuery操作复选框全选反选

var sta = false; //你懂,全局东东 $('a').click(function() { $("input[type=checkbox]").attr("checked",!sta); sta = !sta; });

 jQuery获得鼠标光标位置x和y

$(document).mousemove(function(e)} $(document).ready(function() { $().mousemove(function(e){ $("#macoArea").html("X Axis : " + e.pageX + " | Y Axis " + e.pageY); }); });

 jQuery解析XML

function ParseXml(xml) { $(xml).find("Node").each(function(){ $("#macoArea").append($(this).attr("Author") + ""); ); }

 jQuery判断图像是否被完全加载进来

$('#demoImg').attr("src", "demo.jpg").load(function() { alert("是的,你看到的是真的"); });

 jQuery让Cookie过期

var date = new Date(); date.setTime(date.getTime() + (x * 60 * 1000)); $.cookie("example", "foo", { expires: date });;

 jQuery禁止鼠标右键

$(function(){ $(document).bind("contextmenu",function(e){ return false; }); }); 

用 jQuery 和 Ajax 构建富 Internet 应用程序

thbcm阅读(181)

JQuery 受欢迎的指数迅速攀升,现已成为 Web 开发人员首选的 JavaScript 库。与此同时,人们对富 Internet 应用程序(Rich Internet Application,RIA)的应用和需求也在迅速增长,并期待用基于浏览器的应用程序代替桌面应用程序。无论是电子表格,还是薪水册和电子邮件应用程序,现在都在浏览器中再现了类似于桌面的体验。随着这些应用程序数量的增多和功能的日益复杂,JavaScript 库将会变得越来越重要,因为它是构建这些应用程序的坚实基础。JQuery 无疑成为了开发人员最佳选择。本系列文章深入探索了 jQuery,并提供了坚实的基础。开发人员借助这个基础就可以快速轻松地构建自己的 RIA。

在本系列 之前的一篇文章 中,您了解了用来构建 RIA 以及为页面添加交互性的三个基本组件。第一个模块是 Event 模块,借助此模块,能捕获用户对页面的任意交互并以编程的方式进行响应。比如,您可以向按钮点击、鼠标移动等事件附加代码。下一个模块是 Attributes 模块,它解释了如何在页面元素上获得/设置值,以及如何将其作为带有变量的数据对象。这些值包含了决定为用户提供何种响应的大部分信息。最后,您还看到了如何进行 CSS 处理,以及如何在不重新加载页面的情况下更改页面上任意元素的布局、颜色、字体等。了解这三个模块之后,就等于掌握了交互 Web 页面的三个基本元素 — 获取用户交互(Event)、收集信息(Attribute)以及在事件和信息基础上提供反馈(CSS)。

在本文中,将对交互 Web 页面的这三个基本元素进行更进一步的探究,提供当今高级 Web 应用程序必备的 “酷” 效果和特征。这些附加的模块对提供 RIA 而言并不是至关重要的,但这些效果和特征会给用户留下深刻印象,并且还会极大地扩展 RIA 的可用范围和特性。您将看到的第一个模块是 Effects 模块,它包含很多特性,比如隐藏元素、随处移动元素、淡入淡出元素等。换言之,这些都是让 Web 页酷起来的 “亮点”。最后一个要讨论的模块是 Asynchronous JavaScript + XML (Ajax) 模块。大多数人都将该模块等同为 RIA。Ajax 让 Web 应用程序无需重载页面就能与服务器进行交互、向服务器传递信息并从中获取信息(与 Web 上的一些意见相反,Ajax 不 单纯是一个很酷的 JavaScript 动画工具)。您将发现 jQuery 提供了极其简单易用的 Ajax 工具。实际上,jQuery 使 Ajax 的使用与调用其他 JavaScript 方法一样简单。

本文中的示例应用程序是个总结,展示了 Effects 和 Ajax 模块如何融入到这个示例 Web 邮件应用程序中。我将向这个示例程序添加一些效果使其更加漂亮,而且更重要的一点是,我将添加一些 Ajax 代码,以便无需重载页面邮件应用程序就能显示信息。

Effects 模块

从其名字往往容易得出这样的结论,Effects 模块只包含一些动画和效果,而这些动画和效果往往是一些 “正规” 的 Web 页面所竭力避免的。但实际情况并非如此。几乎所有的应用程序都会遇到这样的情况,即某个页面元素需要隐藏或其视图应该根据另一个页面元素的状态进行切换。这类更改对于一个 RIA 而言非常重要,因为它们让您能够加载某个页面的所有页面元素,然后通过隐藏/显示特定的元素只显示所需的信息。重载页面的方式并不可取。比如一个具有两个选项的组合框,一个选项是隐藏 div,一个选项是显示此 div。很显然,与更改组合框并重载页面隐藏/显示 div 相比,用客户端代码隐藏/显示此 div 更简单和高效。而仅隐藏/显示还是要让它淡入/淡出,则完全取决于您。

如上所述,最基本的效果函数是 show() 和 hide() 函数。这非常直观;它们可分别用来显示和隐藏页面上的某个元素。

清单 1. 隐藏和显示函数

以下为引用的内容:

// shows every <p> on the page

$("p").show();

// hides every <p> on the page

$("p").hide();

// hides every other <p> on the page

$("p:odd").hide();

除了这些基本操作,利用 show() 和 hide() 这两个函数,还能更多地控制页面元素如何显示和隐藏。相关文档将 hide() 描述为 “优美” 的显示/隐藏,对于 show(),就是综合淡入和滑出的效果。

在开始深入探讨一些例子之前,不妨回过头来看看传递给这些效果函数的参数。每个函数(除了通用的 show() 和 hide() 函数之外)都允许在效果完成时传入要调用的速度和函数。速度用来控制效果出现的快慢。这个参数可以是一个 “slow”、”fast” 或 “normal” 字符串。此外,如果需要精确控制动画时间,那就需要用参数指定毫秒数。Effects 函数的第二个参数本身就是一个函数,此函数在效果完成后调用。如果想要将几个效果组合成一个较大规模的效果,这一点将非常重要,因为利用它,能够可靠地控制一个效果何时完成,下一个效果何时开始。

清单 2. 复合效果

以下为引用的内容:

// the img with an ID of "picture" should start hidden

// when the "showPicture" button is pressed, show the img with an ID of "picture"

// and animate it, so it appears quickly in a fade In and slide out, and when

// it's done being shown, show the caption of the picture, which is

// always in the span right after the <img> tag

<input type="button" id="showPicture">

<img src="/pic.jpg" id="picture"><span>This is the picture's caption</span>

// jQuery code inside the document.ready() function

$("#picture").hide().next().hide();

$("#showPicture").click(function(){

   $("#picture").show("fast", function(){

       $("#picture").next().show();

   });

});

// notice how it took more text to describe what you want to happen than it took

// to actually code it!

Effects 模块还有其他一些函数,它们与 show() 和 hide() 非常类似,并且最终所实现的功能也基本相同;只不过实现的方式不同。slideDown() 和 slideUp() 函数分别用来显示和隐藏一个页面元素。不过,这是通过将该元素滑下或滑上的动画效果实现的(从其名称中不难看出这一点)。与我刚刚提到的增强了的 hide() 和 show() 函数类似,您也可以控制滑动的速度以及在效果完成时要调用的函数。此外,要显示/隐藏页面元素还有另一种选择,即 fadeIn() 和 fadeOut() 函数,正如其名字所示,这两个函数用来淡入页面元素直至该元素透明,然后使该元素消失。它们允许在效果完成时定制速度和要调用的函数。

你值得掌握的Windows的15个热键

thbcm阅读(168)

你值得掌握的Windows的15个热键

  • 1. win+ctrl+D 创建虚拟桌面
  • 2. win+ctrl+左右箭头 切换桌面
        win+ctrl+F4 关闭当前虚拟桌面
  • 3. win+M 全部窗口最小化 (win+逗号可以查看桌面)
  • 4. win+数字 打开任务栏中从左到右的应用,数字代表该程序的位置
  • 5. win+左右箭头,可将当前程序置于左半或右半部分屏幕,用此热键可实现两个应用分屏。
  • 6. 应用切换ctrl+alt+tab显示当前桌面运行的所有应用程序
        win+tab 显示所有正在运行的程序以及可用桌面
  •     ctrl+tab 向右切换切换选项卡

  • 7. ctrl+shift+Esc 打开任务管理器
  • 8. win+E 打开文档管理器
  • 9. win+加号/减号 打开放大镜
  • 10. win+PrtScr截取当前屏幕并保存到图片文件夹中PrtScr仅截取当前屏幕不保存至文件夹
  • 11. win+A打开通知中心
  • 12. win+I打开设置
  • 13. 聆听模式下按 win+C打开Win10 小娜 Cortana:你的私人助理
  • 14. win+G打开游戏录制工具栏
  • 15. win+L 锁定

推荐好课:

计算机系统原理入门

电脑快捷键大全

jQuery的高级教程:动画、遍历和事件绑定实例

thbcm阅读(173)

学习目标:

  • 学会如何使用jQuery的动画效果
  • 学会如何进行遍历和事件绑定
  • 熟练应用jQuery进行相关复杂操作

学习内容:

一、jQuery高级

1、动画:三种方式显示和隐藏元素
  • 默认显示和隐藏元素show([speed,[easing],[fn]])hide([speed,[easing],[fn]])toggle([speed,[easing],[fn]])
  • 滚动显示和隐藏元素slideDown([speed,[easing],[fn]])slideUp([speed,[easing],[fn]])slideToggle([speed,[easing],[fn]])
  • 淡入淡出显示和隐藏元素fadeIn([speed,[easing],[fn]])fadeOut([speed,[easing],[fn]])fadeToggle([speed,[easing],[fn]])
  • 参数speed:速度,三种预定义的值(“slow”,“normal”,“fast”)或表示动画时长的毫秒数值(如:1000)easing:用来指定切换效果,默认是”swing”,可用参数”linear”swing:动画执行时效果是“先慢,中间快,又慢”linear:动画执行时的速度是匀速的fn:在动画完成时执行的函数,每个元素执行一次
2、遍历
  • js遍历方式for(初始化值;循环结束条件;步长)
  • jq遍历方式jq对象.each(callback)$.each(object,[callback])for…of jQuery3.0之后提供的版本
3、事件绑定
  • jQuery标准的绑定方式jq对象.事件方法(回调函数);如果调用事件方法,不传递回调函数,则触发浏览器默认行为表单对象.submit(); // 让表单提交
  • on绑定事件/off解绑事件jq对象.on(事件,回调函数);jq对象.off(事件); 如果不传递事件名称,则解绑所有的事件
  • 事件切换:togglejq对象.toggle(fn1,fn2…); 多次点击依次执行传递的函数
4、案例
  • 广告显示和隐藏需求当页面加载完成后,3秒后,自动显示广告广告显示5秒后,自动消失分析使用定时器来完成 setTimeOut()执行一次的定时器jQuery的显示和隐藏的动画效果其实就是控制display属性使用show/hide相关方法完成广告的显示
  • 抽象需求点击开始,小相框快速切换点击停止,小相框停止切换分析给开始按钮绑定单击事件定义循环定时器切换小相框的src属性定义数组,存放图片资源路径生成随机数,数组索引给结束按钮绑定单击事件停止定时器给大相框设置src属性
5、插件:增强jQuery功能
  • 实现方式$.fn.extend(object);增强通过jQuery获取对象的功能 $(“#id”)$.extend(object);增强jQuery对象自身的功能 $/jQuery

学习产出:

1、 动画
<!DOCTYPE html>
<html>
<head>
   <meta charset="UTF-8">
   <title>Insert title here</title>
   <script type="text/javascript" src="../js/jquery-3.3.1.min.js"></script>
   <script>
       // 隐藏div
       function hideFn() {
           /*$("#showDiv").hide("slow","swing",function () {
              // alert("隐藏了。。。");
          })*/
           // 默认方式
           // $("#showDiv").hide("slow","swing");
           // 滑动方式
           // $("#showDiv").slideDown("slow","swing");
           // 淡入淡出方式
           $("#showDiv").fadeOut("slow","swing");
      }

       // 显示div
       function showFn() {
           /*$("#showDiv").show("slow","linear",function () {
              // alert("显示了。。。");
          })*/
           // 默认方式
           // $("#showDiv").show("slow","swing");
           // 滑动方式
           // $("#showDiv").slideUp("slow","swing");
           // 淡入淡出方式
           $("#showDiv").fadeIn("slow","swing");
      }

       // 切换显示隐藏div
       function toggleFn() {
           /*$("#showDiv").toggle("slow","swing",function () {
              // alert("切换显示隐藏了。。。");
          })*/
           // 默认方式
           // $("#showDiv").toggle("slow","swing");
           // 滑动方式
           // $("#showDiv").slideToggle("slow","swing");
           // 淡入淡出方式
           $("#showDiv").fadeToggle("slow","swing");
      }
   </script>
</head>
<body>
<input type="button" value="点击按钮隐藏div" onclick="hideFn()">
<input type="button" value="点击按钮显示div" onclick="showFn()">
<input type="button" value="点击按钮切换div显示和隐藏" onclick="toggleFn()">

<div id="showDiv" style="width:300px;height:300px;background:pink">
  div显示和隐藏
</div>
</body>
</html>
2、遍历
<!DOCTYPE html>
<html>
<head>
   <meta charset="UTF-8">
   <title></title>
   <script src="../js/jquery-3.3.1.min.js" type="text/javascript" charset="utf-8"></script>
   <script type="text/javascript">

       $(function () {
           // 获取所有ul下面的li
           var citys = $("#city li");
           // 遍历li
           // js遍历方式
           for (var i = 0;i < citys.length; i++){
               // 获取内容
               alert(i+":"+citys[i].innerHTML);
          }

           // jq遍历方式
           citys.each(function (index,element) {
               // 获取li对象,直接用this
               // alert(this.innerHTML);
               // alert($(this).html());
               // 获取li对象,在回调函数中定义参数index(索引) element(元素对象)
               // alert(index+":"+element.innerHTML);
               // alert(index+":"+$(element).html());

               // 判断如果是上海,结束循环
               if ("上海"==$(this).html()){
                   // 如果当前回调函数返回值是false,终止循环
                   // 如果当前回调函数返回值是true,终止本次循环,继续下次循环
                   return false;
                   // return true;
              }
               alert(index+":"+$(element).html());
          });

           $.each(citys,function () {
               alert($(this).html());
          });

           for (li of citys){
               alert($(li).html());
          }

      });

   </script>
</head>
<body>
<ul id="city">
   <li>北京</li>
   <li>上海</li>
   <li>天津</li>
   <li>重庆</li>
</ul>
</body>
</html>
3、 事件绑定与解绑
<!DOCTYPE html>
<html>
<head>
   <meta charset="UTF-8">
   <title></title>
   <script src="../js/jquery-3.3.1.min.js" type="text/javascript" charset="utf-8"></script>
   <script type="text/javascript">
       $(function () {
           // 获取name对象,绑定click事件
           // $("#name").click(function () {
           //     alert("我被点击了!");
           // });

           // 给name对象绑定鼠标移动元素之上事件与鼠标移除事件
           // $("#name").mouseover(function () {
           //     alert("鼠标来了!");
           // });
           // $("#name").mouseleave(function () {
           //     alert("鼠标走了!");
           // });

           // 简化操作,链式编程
           // $("#name").mouseover(function () {
           //     alert("鼠标来了");
           // }).mouseleave(function () {
           //     alert("鼠标走了");
           // })


           $("#name").focus();// 让文本输入框获得焦点
           // 表单对象.submit()   // 让表单提交
      })

   </script>
</head>
<body>
<input id="name" type="text" value="绑定点击事件">
</body>
</html>

<!DOCTYPE html>
<html>
<head>
   <meta charset="UTF-8">
   <title></title>
   <script src="../js/jquery-3.3.1.min.js" type="text/javascript" charset="utf-8"></script>
   <script type="text/javascript">
       $(function () {
           // 使用on绑定事件
           $("#btn").on("click",function () {
               alert("我被点击了!");
          });

           // 使用off解绑事件
           $("#btn2").click(function () {
               // 解除btn按钮的click绑定事件
               $("#btn").off("click");
          });
      });



   </script>
</head>
<body>
<input id="btn" type="button" value="使用on绑定点击事件">
<input id="btn2" type="button" value="使用off解绑点击事件">
</body>
</html>

<!DOCTYPE html>
<html>
<head>
   <meta charset="UTF-8">
   <title></title>
   <script src="../js/jquery-3.3.1.min.js" type="text/javascript" charset="utf-8"></script>
   <script src="../js/jquery-migrate-1.0.0.js" type="text/javascript" charset="utf-8"></script>
   <script type="text/javascript">
       $(function () {
           $("#btn").toggle(function () {
               // 改变背景色为绿色
               $("#myDiv").css("backgroundColor","green");
          },function () {
               // 改变背景色为黄色
               $("#myDiv").css("backgroundColor","yellow");
          })
      })
   </script>
</head>
<body>

   <input id="btn" type="button" value="事件切换">
   <div id="myDiv" style="width:300px;height:300px;background:pink">
      点击按钮变成绿色,再次点击黄色
   </div>
</body>
</html>
4、案例1:广告显示和隐藏
<!DOCTYPE html>
<html>
<head>
   <meta charset="UTF-8">
   <title>广告的自动显示与隐藏</title>
   <style>
       #content{width:100%;height:500px;background:#999}
   </style>

   <!--引入jquery-->
   <script type="text/javascript" src="../js/jquery-3.3.1.min.js"></script>
   <script>
       $(function () {
           // 定义定时器,3秒之后显示广告
           setTimeout(adShow,3000);
           // 定义定时器,5秒之后隐藏广告
           setTimeout(adHide,8000);
      });
       // 显示广告
       function adShow() {
           $("#ad").show("slow");
      }
       // 隐藏广告
       function adHide() {
           $("#ad").hide("slow");
      }
   </script>
</head>
<body>
<!-- 整体的DIV -->
<div>
   <!-- 广告DIV -->
   <div id="ad" style="display: none;">
       <img style="width:100%" src="../img/adv.jpg" />
   </div>

   <!-- 下方正文部分 -->
   <div id="content">
      正文部分
   </div>
</div>
</body>
</html>
5、案例2:抽奖
<!DOCTYPE html>
<html>
<head>
   <meta charset="UTF-8">
   <title>jquery案例之抽奖</title>
   <script type="text/javascript" src="../js/jquery-3.3.1.min.js"></script>
   <script>
       var img = ["../img/man00.jpg",
           "../img/man01.jpg",
           "../img/man02.jpg",
           "../img/man03.jpg",
           "../img/man04.jpg",
           "../img/man05.jpg",
           "../img/man06.jpg"];
       $(function () {
           $("#startID").prop("disabled",false);
           $("#stopID").prop("disabled",true);

           var startId;
           var index;
           $("#startID").click(function () {
               $("#startID").prop("disabled",true);
               $("#stopID").prop("disabled",false);
               startId = setInterval(function () {
                   index = Math.floor(Math.random()*7);
                   $("#img1ID").prop("src",img[index])
              },20);
          });
           $("#stopID").click(function () {
               $("#startID").prop("disabled",false);
               $("#stopID").prop("disabled",true);
               clearInterval(startId);
               $("#img2ID").prop("src",img[index]).hide();
               $("#img2ID").show(1000);
          });
      })
   </script>
</head>
<body>

<!-- 小像框 -->
<div style="border-style:dotted;width:160px;height:100px">
   <img id="img1ID" src="../img/man00.jpg" style="width:160px;height:100px"/>
</div>

<!-- 大像框 -->
<div
       style="border-style:double;width:800px;height:500px;position:absolute;left:500px;top:10px">
   <img id="img2ID" src="../img/man00.jpg" width="800px" height="500px"/>
</div>

<!-- 开始按钮 -->
<input
       id="startID"
       type="button"
       value="点击开始"
       style="width:150px;height:150px;font-size:22px"
       onclick="imgStart()">

<!-- 停止按钮 -->
<input
       id="stopID"
       type="button"
       value="点击停止"
       style="width:150px;height:150px;font-size:22px"
       onclick="imgStop()">


<script language='javascript' type='text/javascript'>
   //准备一个一维数组,装用户的像片路径
   var imgs = [
       "../img/man00.jpg",
       "../img/man01.jpg",
       "../img/man02.jpg",
       "../img/man03.jpg",
       "../img/man04.jpg",
       "../img/man05.jpg",
       "../img/man06.jpg"
  ];

</script>
</body>
</html>
6、01-jQuery对象进行方法扩展
<!DOCTYPE html>
<html>
<head>
   <meta charset="UTF-8">
   <title>01-jQuery对象进行方法扩展</title>
   <script src="../js/jquery-3.3.1.min.js" type="text/javascript" charset="utf-8"></script>
   <script type="text/javascript">
       // 使用jQuery插件,给jq添加两个方法,check()选中所有复选框,uncheck()取消所有选中
       // 定义jQuery对象的插件
       $.fn.extend({
           // 定义一个check方法,所有的jq对象都可以调用该方法
           check:function () {
               this.prop("checked",true);
          },
           uncheck:function () {
               this.prop("checked",false);
          }
      });
       $(function () {
           $("#btn-check").click(function () {
               $("input[type='checkbox']").check();
          });
           $("#btn-uncheck").click(function () {
               $("input[type='checkbox']").uncheck();
          });
      })
   </script>
</head>
<body>
<input id="btn-check" type="button" value="点击选中复选框" onclick="checkFn()">
<input id="btn-uncheck" type="button" value="点击取消复选框选中" onclick="uncheckFn()">
<br/>
<input type="checkbox" value="football">足球
<input type="checkbox" value="basketball">篮球
<input type="checkbox" value="volleyball">排球

</body>
</html>
7、02-jQuery全局进行方法扩展
<!DOCTYPE html>
<html>
<head>
   <meta charset="UTF-8">
   <title>01-jQuery对象进行方法扩展</title>
   <script src="../js/jquery-3.3.1.min.js" type="text/javascript" charset="utf-8"></script>
   <script type="text/javascript">
       //对全局方法扩展2个方法,扩展min方法:求2个值的最小值;扩展max方法:求2个值最大值
       $.extend({
           max:function (a,b) {
               return a >= b ? a : b;
          },
           min:function (a,b) {
               return a <= b ? a : b;
          }
      });

       var max = $.max(2,3);
       alert(max);
       var min = $.min(1,8);
       alert(min);
   </script>
</head>
<body>
</body>
</html>

关于input框 限制输入长度记录

thbcm阅读(181)

问题描述:input输入框长度限制&非正则表达式

方式一

type = "number"  -> 输入类型

oninput ->{

oninput 事件在用户输入时触发。

该事件在 <input> 或 <textarea> 元素的值发生改变时触发。

提示: 该事件类似于 onchange 事件。不同之处在于 oninput 事件在元素值发生变化是立即触发, onchange 在元素失去焦点时触发。另外一点不同是 onchange 事件也可以作用于 <keygen> 和 <select> 元素

}
value.slice(start,end)

return ' <input type="number" value="'+value+'" οninput="if(value.length>16)value=value.slice(0,3)" />';
参数 描述
start 必需。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。
end 可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。

注:如果 end 未被规定,那么 slice() 方法会选取从 start 到数组结尾的所有元素。

具体用法请自行前往官网学习!

方式二

maxlength属性 ->
{
maxlength 属性规定输入字段的最大长度,以字符个数计。

maxlength 属性与 <input type="text"> 或 <input type="password"> 配合使用
}
return ' <input type="number" value="'+value+'" maxlength = “长度” />';

H5之外部浏览器唤起微信分享

thbcm阅读(170)

最近在做一个手机站,要求点击分享可以直接打开微信分享出去。而不是 jiathis,share 分享这种的点击出来二维码。在网上看了很多,都说 APP 能唤起微信,手机网页实现不了。也找了很多都不能直接唤起微信。

总结出来一个可以直接唤起微信的。适应手机 qq 浏览器和 uc 浏览器。

下面上代码,把这些直接放到要转发的页面里就可以了:

html 部分:

<script src="mshare.js"></script>//引进mshare.js
<button data-mshare="0">点击弹出原生分享面板</button>
<button data-mshare="1">点击触发朋友圈分享</button>
<button data-mshare="2">点击触发发送给微信朋友</button>

js部分:

<script>
var mshare = new mShare({
  title: 'Lorem ipsum dolor sit.',
  url: 'http://m.ly.com',
  desc: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quaerat inventore minima voluptates.',
  img: 'http://placehold.it/150x150'
});
$('button').click(function () {
  // 1 ==> 朋友圈 2 ==> 朋友 0 ==> 直接弹出原生
  mshare.init(+$(this).data('mshare'));
});
</script>

下面是 mshare.js 的代码分享,把这些代码新建一个 js 文件放进去,然后在页面中引进就 ok 了。

/**
* 此插件主要作用是在UC和QQ两个主流浏览器
* 上面触发微信分享到朋友圈或发送给朋友的功能
*/
'use strict';
var UA = navigator.appVersion;
/**
* 是否是 UC 浏览器
*/
var uc = UA.split('UCBrowser/').length > 1 ? 1 : 0;
/**
* 判断 qq 浏览器
* 然而qq浏览器分高低版本
* 2 代表高版本
* 1 代表低版本
*/
var qq = UA.split('MQQBrowser/').length > 1 ? 2 : 0;
/**
* 是否是微信
*/
var wx = /micromessenger/i.test(UA);
/**
* 浏览器版本
*/
var qqVs = qq ? parseFloat(UA.split('MQQBrowser/')[1]) : 0;
var ucVs = uc ? parseFloat(UA.split('UCBrowser/')[1]) : 0;
/**
* 获取操作系统信息 iPhone(1) Android(2)
*/
var os = (function () {
  var ua = navigator.userAgent;
  if (/iphone|ipod/i.test(ua)) {
      return 1;
  } else if (/android/i.test(ua)) {
      return 2;
  } else {
      return 0;
  }
}());
/**
* qq浏览器下面 是否加载好了相应的api文件
*/
var qqBridgeLoaded = false;
// 进一步细化版本和平台判断
if ((qq && qqVs < 5.4 && os == 1) || (qq && qqVs < 5.3 && os == 1)) {
  qq = 0;
} else {
  if (qq && qqVs < 5.4 && os == 2) {
      qq = 1;
  } else {
      if (uc && ((ucVs < 10.2 && os == 1) || (ucVs < 9.7 && os == 2))) {
          uc = 0;
      }
  }
}
/**
* qq浏览器下面 根据不同版本 加载对应的bridge
* @method loadqqApi
* @param {Function} cb 回调函数
*/
function loadqqApi(cb) {
  // qq == 0
  if (!qq) {
      return cb && cb();
  }
  var script = document.createElement('script');
  script.src = (+qq === 1) ? '//3gimg.qq.com/html5/js/qb.js' : '//jsapi.qq.com/get?api=app.share';
  /**
    * 需要等加载过 qq 的 bridge 脚本之后
    * 再去初始化分享组件
    */
  script.onload = function () {
      cb && cb();
  };
  document.body.appendChild(script);
}
/**
* UC浏览器分享
* @method ucShare
*/
function ucShare(config) {
  // ['title', 'content', 'url', 'platform', 'disablePlatform', 'source', 'htmlID']
  // 关于platform
  // ios: kWeixin || kWeixinFriend;
  // android: WechatFriends || WechatTimeline
  // uc 分享会直接使用截图
  var platform = '';
  var shareInfo = null;
// 指定了分享类型
  if (config.type) {
      if (os == 2) {
        platform = config.type == 1 ? 'WechatTimeline' : 'WechatFriends';
    } else if (os == 1) {
        platform = config.type == 1 ? 'kWeixinFriend' : 'kWeixin';
      }
  }
  shareInfo = [config.title, config.desc, config.url, platform, '', '', ''];
  // android
  if (window.ucweb) {
      ucweb.startRequest && ucweb.startRequest('shell.page_share', shareInfo);
      return;
  }
  if (window.ucbrowser) {
      ucbrowser.web_share && ucbrowser.web_share.apply(null, shareInfo);
      return;
  }
}
/**
* qq 浏览器分享函数
* @method qqShare
*/
function qqShare(config) {
  var type = config.type;
  //微信好友 1, 微信朋友圈 8
  type = type ? ((type == 1) ? 8 : 1) : '';
  var share = function () {
      var shareInfo = {
          'url': config.url,
          'title': config.title,
          'description': config.desc,
          'img_url': config.img,
          'img_title': config.title,
          'to_app': type,
          'cus_txt': ''
      };
      if (window.browser) {
          browser.app && browser.app.share(shareInfo);
      } else if (window.qb) {
          qb.share && qb.share(shareInfo);
      }
  };
  if (qqBridgeLoaded) {
      share();
  } else {
      loadqqApi(share);
  }
}/**
* 对外暴露的接口函数
* @method mShare * @param {Object} config 配置对象
*/
function mShare(config) {
  this.config = config;
  this.init = function (type) {
      if (typeof type != 'undefined') this.config.type = type;
      try {
          if (uc) {
              ucShare(this.config);
          } else if (qq && !wx) {
              qqShare(this.config);
          }
      } catch (e) {}
  }
}
// 预加载 qq bridge
loadqqApi(function () {
  qqBridgeLoaded = true;
});
if (typeof module === 'object' && module.exports) {
  module.exports = mShare;
} else {
  window.mShare = mShare;
}

好了,这样就可以直接唤起微信进行分享啦

针对 vue 实现防抖

thbcm阅读(165)

1.首先新建一个 debounce.js 代码如下

const debounce=function(fn, delay){
let timer = null
return function(){
let content = this;
let args = arguments;
if(timer){
clearTimeout(timer)
}
timer = setTimeout(()=>{
fn.apply(content,args)
}, delay)
}
}
export default debounce

2.在需要防抖的 vue 文件中引入 debounce,内容如下;这是一个输入框的 500ms 的防抖

<template>
  <div class="main">
      <el-input v-model="input" @change="changeSeletc" placeholder="请输入内容"></el-input>
  </div>
</template>
<script>
  import debounce from "../utils/debounce"
   export default {
      name: "alarm",
      data(){
          return{
              input: ''
          }
      },
      methods:{
          changeSeletc:debounce(function () {
              console.log(this.input)
          },500),
      }
  }
</script>
<style scoped>
</style>

3.效果如下图

AJAX的基本使用

thbcm阅读(170)

一. ajax 是什么

  • ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。
  • AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。
  • 传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面。ajax 通过在后台与服务器进行少量数据交换,这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

二. 基本使用

function loadData() {
   let xhr;
   if (window.XMLHttpRequest) {
     xhr = new XMLHttpRequest();
  } else {
     xhr = new ActiveXObject("Microsoft.XMLHTTP");
  }

   xhr.onreadystatechange = function () {
     if (xhr.readyState === 4 && xhr.status === 200) {
       console.log(xhr.responseText);
    }
  }

   xhr.open("GET","http://127.0.0.1:3001/users",true);
   xhr.send();
}

3. 对上边代码进行讲解

3.1 创建XMLHttpRequest 对象

所有现代浏览器(IE7+、Firefox、Chrome、Safari 以及 Opera)均内建 XMLHttpRequest 对象。创建 XMLHttpRequest 对象的语法:let xhr = new XMLHttpRequest();

老版本的 Internet Explorer (IE5 和 IE6)使用 ActiveX 对象:let xhr = new ActiveXObject(“Microsoft.XMLHTTP”);

所以为了应对所有的现代浏览器,包括 IE5 和 IE6,应该检查浏览器是否支持 XMLHttpRequest 对象。如果支持,则创建 XMLHttpRequest 对象。如果不支持,则创建 ActiveXObject :

let xhr;
if (window.XMLHttpRequest) {
 xhr = new XMLHttpRequest();
} else {
 xhr = new ActiveXObject("Microsoft.XMLHTTP");
}

3.2 向服务器发送请求

xhr.open("GET","http://127.0.0.1:3001/users",true);
xhr.send();

(1)open(method,url,async) 方法规定请求的类型、URL 以及是否异步处理请求。

  • method:请求的类型;GET 或 POST
  • url:要访问的服务器上的位置
  • async:true(异步)或 false(同步)

(2)send(string) 将请求发送到服务器

  • 参数string:仅用于 POST 请求

3.3 接收服务器的响应

如需获得来自服务器的响应,请使用 XMLHttpRequest 对象的 responseText 或 responseXML 属性。

  • responseText:获得字符串形式的响应数据
  • responseXML:获得 XML 形式的响应数据

3.4 onreadystatechange 事件

当请求被发送到服务器时,我们需要执行一些基于响应的任务。每当 readyState 改变时,就会触发 onreadystatechange 事件。readyState 属性存有 XMLHttpRequest 的状态信息。

(1)onreadystatechange:每当 readyState 属性改变时,就会调用该函数。

(2)readyState:存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。

  • 0: 请求未初始化
  • 1: 服务器连接已建立
  • 2: 请求已接收
  • 3: 请求处理中
  • 4: 请求已完成,且响应已就绪

(3)status

  • 200: “OK”
  • 404: 未找到页面

(4)在 onreadystatechange 事件中,我们规定当服务器响应已做好被处理的准备时所执行的任务。当 readyState 等于 4 且状态为 200 时,表示响应已就绪。

注意: onreadystatechange 事件被触发 4 次(0 – 4), 分别是: 0-1、1-2、2-3、3-4,对应着 readyState 的每个变化。

xhr.onreadystatechange = function () {
 if (xhr.readyState === 4 && xhr.status === 200) {
   console.log(xhr.responseText);
}
}

4. 其它方式

//第一个参数是请求路径,第二个参数是一个函数,当拿到数据后调用该函数
function get(url,callback) {
 let xhr = new XMLHttpRequest();
 //当请求加载成功之后要调用该函数
 xhr.onload = function() {
   callback(xhr.responseText);
}
 xhr.open('get',url)
 xhr.send();
}

get('http://localhost:3001/users',function (data) {
 console.log(data);
});

4.1 扩展

我们可以把上边那段代码改写成支持Promise的形式,这样就可以进行链式调用

function get(url) {
 return new Promise(function (resolve, reject) {
   let xhr = new XMLHttpRequest();
   xhr.onload = function () {
     //使用JSON.parse()将拿到的数据转成JS对象
     resolve(JSON.parse(xhr.responseText));
  }
   xhr.open('get', url)
   xhr.send();
})
}

链式调用:

let data = {};
get('http://localhost:3001/users')
.then(function (userData) {
  data.user = userData;
  return get('http://localhost:3001/jobs')
})
.then(function (jobsData) {
  data.jobs = jobsData;
  console.log(data);
})

JS 如何创建对象?

thbcm阅读(160)

一、new Object();

 var x="age"

        var obj=new Object();
        obj.name="wang";
        obj.x=20; //.字符串
        obj[x]=25; //[变量]
        console.log(obj);//{name: "wang", x: 20, age: 25}

二、字面量

 var a="hobby"
        var obj={"name":"wang","age":"18"};

            obj.sex="男";
            obj[a]="唱歌";
            obj.say=function(){
            }
            console.log(obj);//{name: "wang", age: "18", sex: "男", hobby: "唱歌", say: ƒ}
            var obj2={"aa bb":"hellow",".x":"world"};
            console.log(obj2["aa bb"]);//hellow
            console.log( obj2[".x"] );//world

三、工厂模式;

 //1.创建函数
        function a(name, age) {
            var obj = {
                "name": "wang",
                "age": 19,
                "say": function () {
                }
            }
            return obj
        }
        //2.依次调用
        var obj1 = a("wang", 20);
        console.log(obj1);//{name: "wang", age: 19, say: ƒ}
        console.log(obj1 instanceof Object);//true

            //优点:返回新对象,互不影响
            //缺点:代码重复(方法相同)。
            //  没有从属关系,

四、构造函数

 //四、构造函数;
        //优点:有从属
        //缺点:代码重复(相同方法);
         //   1.创建函数
         //2.传入参数
        function A(name,age){
            //3.this。属性名=值
            this.name=name;
            this.age=age;
            this.say=function(){
            }
        }
        //调用 : var obj=new 构造函数(参数)
        
        var obj= new A("wang",19);
        console.log(obj);
        console.log( obj instanceof Object );//true
        console.log( obj instanceof A );//true

五、原型模式

 //原型优点:共同/相同的属性、方法不重复 有从属关系
        //缺点:原型上的属性不可单独改变
        function Fn(){
            
        }
        Fn.prototype.name="王";
        Fn.prototype.age=19;

        var obj=new Fn();
        console.log(obj);
        /*
        修改obj.__proto__.name
        obj.__proto__.name 发生变化
        obj2.__proto__.name 也发生变化
        obj和obj1 共用__proto__对象
        公共/相同的属性、方法放在构造函数.prototype上 实现代码不重复
        */
            obj.__proto__.name="李"
            console.log( obj.__proto__.name  );

            var obj2=new Fn();
            console.log(obj2);
            console.log(obj.__proto__.name);

推荐好课:

小白学前端:JavaScript零基础入门到进阶(2020版)

JavaScript实战:动态网站开发

JavaScript交互式网站实战开发

联系我们