使用JS组件实现带ToolTip验证框的实例代码


Posted in Javascript onAugust 23, 2017

本组件依赖JQuery

本人测试的JQuery 是1.8,

兼容IE8,IE9,谷歌,火狐等。

//验证输入框
function ValidateCompent(input){
  var _input = $(input).clone(true);
  _input.css("height",$(input).css("height"));
  _input.css("width", $(input).css("width"));
  var border =_input.css("border"); 
  this.successIconClass = "icon-tick";//验证通过时的样式
  this.validate = false;
  this.faileIconClass = "icon-times";//验证失败时的样式
  var $validateRoot = $('<div class="validate-v1-container"><div class="validate-v1-tooltip"></div></div>');
  var $tooltip = $validateRoot.children(".validate-v1-tooltip");
  var $input = _input;
  if($input != undefined){
    var maxWidth = $input.css("width");
    var maxHeight = $input.css("height");
    $validateRoot.css("display","inline");
    $validateRoot.css("position","relative");
    $validateRoot.css("width",maxWidth);
    $validateRoot.css("height",maxHeight);
    $tooltip.css("width",maxWidth);
    $tooltip.css("padding","0px 5px");
    $tooltip.css("position","absolute");
    $tooltip.css("top","0px");
    $tooltip.css("z-index","999999");
    $tooltip.css("background-color","white");
    $tooltip.css("border","solid 1px rgb(188,188,188)");
    $tooltip.css("left",parseInt(maxWidth) + 10+"px");
    $tooltip.hide();
    var validateOption = $input.attr("data-vali-option");
    if(validateOption != undefined){
      validateOption = JSON.parse(validateOption);
      var that = this;
      var regvali = new Array();
      $tooltip.hide();
      if(validateOption.length == 0){
        return;
      }
      for(var i = 0; i <validateOption.length;i++){
        var message = validateOption[i].message;
        var pattern = validateOption[i].pattern;
        var reg = new RegExp(pattern);
        var messageView = new ValidateMessage(message,that.faileIconClass);
        regvali.push({"reg":reg,"view":messageView});
        $tooltip.append(messageView.dom);
      }
      $tooltip.css("height",(parseInt(maxHeight) +15) * validateOption.length );
      $input.on("textchange focus",function(e){
        $tooltip.show();
        for(var i = 0 ; i < regvali.length; i++){
          if(regvali[i].reg.test($input.val())){
            regvali[i].view.setIconClass(that.successIconClass);
            regvali[i].view.dom.css("color","green");
          }else{
            regvali[i].view.setIconClass(that.faileIconClass);
            regvali[i].view.dom.css("color","red");
          }
        }
      })
      $input.on("blur", function(e) {
        $tooltip.hide();
        for(var i = 0 ; i < regvali.length; i++){
          if(regvali[i].reg.test($input.val())){
            regvali[i].view.setIconClass(that.successIconClass);
            $input.css("border",border);
            that.validate = true;
          }else{
            regvali[i].view.setIconClass(that.faileIconClass);
            $input.css("border","1px solid red");
            that.validate = false;
            break;
          }
        }
      });
      $validateRoot.append($input);
    }else{
      return;
    }
  }
  this.dom = function(){
    return $validateRoot;
  }
  function ValidateMessage(message,iconFontClass){
    var dom = $('<div class="validate-message"><span class="vticon"></span><span class="vmessage"></span></div>');
    var $icon = dom.children(".vticon");
    var $message = dom.children(".vmessage");
    $message.css("line-height","28px");
    $message.css("padding","5px 5px");
    $message.css("padding-right","10px");
    $message.css("word-break","break-all");
    $message.css("word-wrap","break-word");
    $message.css("font-size","14px");
    $message.css("position","relative");
    $message.css("z-index","999999");
    this.setIconClass = function(iconClass){
      $icon.removeClass();
      $icon.addClass("vticon");
      $icon.addClass(iconClass);
    }
    this.getIcon = function(){
      return $icon;
    }
    this.setMessageText = function(_message){
      $message.html(_message);
    }
    this.getMessageText = function(){
      return $message;
    }
    this.setIconClass(iconFontClass);
    this.setMessageText(message);
    this.dom = dom;
  }
  $validateRoot.insertAfter($(input));
  $(input).remove();
}

以下是HTML代码

<input id="test" data-vali-option='[{"pattern":"[1-9]+","message":"只能输入1-9的数"},{"pattern":"[a-z]+","message":"只能输入a-z的数"}]' />

使用方法如下

$(function(){
  var c = new ValidateCompent("#test");
});

依赖JQuery,

另外附上JQuery textchange事件的代码,textchange代码放在JQuery之后,在使用方法之前。

/**
 * jQuery "splendid textchange" plugin
 * http://benalpert.com/2013/06/18/a-near-perfect-oninput-shim-for-ie-8-and-9.html
 *
 * (c) 2013 Ben Alpert, released under the MIT license
 */
(function($) {
var testNode = document.createElement("input");
var isInputSupported = "oninput" in testNode && 
  (!("documentMode" in document) || document.documentMode > 9);
var hasInputCapabilities = function(elem) {
  // The HTML5 spec lists many more types than `text` and `password` on
  // which the input event is triggered but none of them exist in IE 8 or
  // 9, so we don't check them here.
  // TODO: <textarea> should be supported too but IE seems to reset the
  // selection when changing textarea contents during a selectionchange
  // event so it's not listed here for now.
  return elem.nodeName === "INPUT" &&
    (elem.type === "text" || elem.type === "password");
};
var activeElement = null;
var activeElementValue = null;
var activeElementValueProp = null;
/**
 * (For old IE.) Replacement getter/setter for the `value` property that
 * gets set on the active element.
 */
var newValueProp = {
  get: function() {
    return activeElementValueProp.get.call(this);
  },
  set: function(val) {
    activeElementValue = val;
    activeElementValueProp.set.call(this, val);
  }
};
/**
 * (For old IE.) Starts tracking propertychange events on the passed-in element
 * and override the value property so that we can distinguish user events from
 * value changes in JS.
 */
var startWatching = function(target) {
  activeElement = target;
  activeElementValue = target.value;
  activeElementValueProp = Object.getOwnPropertyDescriptor(
      target.constructor.prototype, "value");
  Object.defineProperty(activeElement, "value", newValueProp);
  activeElement.attachEvent("onpropertychange", handlePropertyChange);
};
/**
 * (For old IE.) Removes the event listeners from the currently-tracked
 * element, if any exists.
 */
var stopWatching = function() {
 if (!activeElement) return;
 // delete restores the original property definition
 delete activeElement.value;
 activeElement.detachEvent("onpropertychange", handlePropertyChange);
 activeElement = null;
 activeElementValue = null;
 activeElementValueProp = null;
};
/**
 * (For old IE.) Handles a propertychange event, sending a textChange event if
 * the value of the active element has changed.
 */
var handlePropertyChange = function(nativeEvent) {
  if (nativeEvent.propertyName !== "value") return;
  var value = nativeEvent.srcElement.value;
  if (value === activeElementValue) return;
  activeElementValue = value;
  $(activeElement).trigger("textchange");
};
if (isInputSupported) {
  $(document)
    .on("input", function(e) {
      // In modern browsers (i.e., not IE 8 or 9), the input event is
      // exactly what we want so fall through here and trigger the
      // event...
      if (e.target.nodeName !== "TEXTAREA") {
        // ...unless it's a textarea, in which case we don't fire an
        // event (so that we have consistency with our old-IE shim).
        $(e.target).trigger("textchange");
      }
    });
} else {
  $(document)
    .on("focusin", function(e) {
      // In IE 8, we can capture almost all .value changes by adding a
      // propertychange handler and looking for events with propertyName
      // equal to 'value'.
      // In IE 9, propertychange fires for most input events but is buggy
      // and doesn't fire when text is deleted, but conveniently,
      // selectionchange appears to fire in all of the remaining cases so
      // we catch those and forward the event if the value has changed.
      // In either case, we don't want to call the event handler if the
      // value is changed from JS so we redefine a setter for `.value`
      // that updates our activeElementValue variable, allowing us to
      // ignore those changes.
      if (hasInputCapabilities(e.target)) {
        // stopWatching() should be a noop here but we call it just in
        // case we missed a blur event somehow.
        stopWatching();
        startWatching(e.target);
      }
    })
    .on("focusout", function() {
      stopWatching();
    })
    .on("selectionchange keyup keydown", function() {
      // On the selectionchange event, e.target is just document which
      // isn't helpful for us so just check activeElement instead.
      //
      // 90% of the time, keydown and keyup aren't necessary. IE 8 fails
      // to fire propertychange on the first input event after setting
      // `value` from a script and fires only keydown, keypress, keyup.
      // Catching keyup usually gets it and catching keydown lets us fire
      // an event for the first keystroke if user does a key repeat
      // (it'll be a little delayed: right before the second keystroke).
      // Other input methods (e.g., paste) seem to fire selectionchange
      // normally.
      if (activeElement && activeElement.value !== activeElementValue) {
        activeElementValue = activeElement.value;
        $(activeElement).trigger("textchange");
      }
    });
}
})(jQuery);

获取验证结果

$(function(){
  var c = new ValidateCompent("#test");
  $("#test").click(function(){
    console.log(c.validate);
  });
});

自定义显示方案

$(function(){
  var c = new ValidateCompent("#test");
  $("#test").click(function(){
    console.log(c.validate);
  });
  c.dom().addClass("你的样式类");
});

设置图标字体样式

$(function(){
  var c = new ValidateCompent("#test");
  $("#test").click(function(){
    console.log(c.validate);
  });
  c.successIconClass = "";//成功时的样式
  c.faileIconClass = "";//失败时的样式
});

效果图如下

分别是成功,部分成功,全部失败选中,未选中的样式效果,(勾叉是用的字体css,建议自行寻找字体替代)

使用JS组件实现带ToolTip验证框的实例代码使用JS组件实现带ToolTip验证框的实例代码使用JS组件实现带ToolTip验证框的实例代码使用JS组件实现带ToolTip验证框的实例代码

总结

以上所述是小编给大家介绍的使用JS组件实现带ToolTip验证框的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
Chrome中JSON.parse的特殊实现
Jan 12 Javascript
js实现表格字段排序
Feb 19 Javascript
JavaScript错误处理
Feb 03 Javascript
jQuery实现带延迟效果的滑动菜单代码
Sep 02 Javascript
详解JavaScript基于面向对象之创建对象(1)
Dec 10 Javascript
简单实现node.js图片上传
Dec 18 Javascript
获取JavaScript异步函数的返回值
Dec 21 Javascript
ajax分页效果(bootstrap模态框)
Jan 23 Javascript
JavaScript学习笔记之基于定时器实现图片无缝滚动功能详解
Jan 09 Javascript
微信小程序实现卡片层叠滑动效果
Jun 21 Javascript
微信小程序实现注册登录功能(表单校验、错误提示)
Dec 10 Javascript
vue el-table实现自定义表头
Dec 11 Javascript
利用Vue实现移动端图片轮播组件的方法实例
Aug 23 #Javascript
详解AngularJS跨页面传值(ui-router)
Aug 23 #Javascript
vue中页面跳转拦截器的实现方法
Aug 23 #Javascript
jquery.rotate.js实现可选抽奖次数和中奖内容的转盘抽奖代码
Aug 23 #jQuery
Angular2+国际化方案(ngx-translate)的示例代码
Aug 23 #Javascript
JS实现问卷星自动填问卷脚本并在两秒自动提交功能
Jun 17 #Javascript
简单实现jQuery上传图片显示预览功能
Jun 29 #jQuery
You might like
中国收音机工业发展史
2021/03/02 无线电
php过滤危险html代码
2008/08/18 PHP
用js进行url编码后用php反解以及用php实现js的escape功能函数总结
2010/02/08 PHP
php下通过curl抓取yahoo boss 搜索结果的实现代码
2011/06/10 PHP
深入分析php之面向对象
2013/05/15 PHP
PHP多线程类及用法实例
2014/12/03 PHP
PHP正则获取页面所有图片地址
2016/03/23 PHP
Laravel中的Auth模块详解
2017/08/17 PHP
关于juqery radio写法的兼容性问题(新老版本jquery)
2010/06/14 Javascript
jquery实现marquee效果(文字或者图片的水平垂直滚动)
2013/01/07 Javascript
jquery通过a标签删除table中的一行的代码
2013/12/02 Javascript
Jquery插件编写简明教程
2014/03/25 Javascript
淘宝网提供的国内NPM镜像简介和使用方法
2014/04/17 Javascript
分享两个手机访问pc网站自动跳转手机端网站代码
2020/12/24 Javascript
NodeJs基本语法和类型
2015/02/13 NodeJs
nodeJs爬虫获取数据简单实现代码
2016/03/29 NodeJs
JS获取子窗口中返回的数据实现方法
2016/05/28 Javascript
JS简单生成两个数字之间随机数的方法
2016/08/03 Javascript
jQuery元素属性操作实例(设置、获取及删除元素属性)
2016/09/08 Javascript
Websocket协议详解及简单实例代码
2016/12/12 Javascript
jQuery EasyUI 页面加载等待及页面等待层
2017/02/06 Javascript
Iphone手机、安卓手机浏览器控制默认缩放大小的方法总结(附代码)
2017/08/18 Javascript
用vue快速开发app的脚手架工具
2018/06/11 Javascript
element-ui使用导航栏跳转路由的用法详解
2018/08/22 Javascript
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
Python中用Ctrl+C终止多线程程序的问题解决
2013/03/30 Python
Python自定义scrapy中间模块避免重复采集的方法
2015/04/07 Python
python 根据网易云歌曲的ID 直接下载歌曲的实例
2019/08/24 Python
解决torch.autograd.backward中的参数问题
2020/01/07 Python
法国女性内衣购物网站:Glamuse
2019/05/13 全球购物
任课老师推荐信范文
2013/11/24 职场文书
追悼会上的答谢词
2014/01/10 职场文书
采购求职信
2014/03/17 职场文书
党的群众路线对照检查材料
2014/09/22 职场文书
2014年电工工作总结
2014/11/20 职场文书
2014年图书馆工作总结
2014/11/25 职场文书