-
Notifications
You must be signed in to change notification settings - Fork 0
/
jquery.myData.min.js
9 lines (8 loc) · 11.3 KB
/
jquery.myData.min.js
1
2
3
4
5
6
7
8
9
/**
* jquery.mydata - Small JQuery&Zepto plugin for two-ways data binding.
* @version v0.5.0
* @link https://github.com/ange007/JQuery.myData
* @license MIT
* @author Borysenko Vladymyr
*/
"use strict";function _classCallCheck(e,t){if(!(e instanceof t)){throw new TypeError("Cannot call a class as a function")}}function _defineProperties(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||false;a.configurable=true;if("value"in a)a.writable=true;Object.defineProperty(e,a.key,a)}}function _createClass(e,t,n){if(t)_defineProperties(e.prototype,t);if(n)_defineProperties(e,n);return e}function _typeof(e){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){_typeof=function e(t){return typeof t}}else{_typeof=function e(t){return t&&typeof Symbol==="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t}}return _typeof(e)}(function(e){if(typeof define==="function"&&define.amd){define(["jquery"],e)}else if((typeof exports==="undefined"?"undefined":_typeof(exports))==="object"){module.exports=e(window.Zepto||window.jQuery||window.$||require("jquery"),window,document)}else{e(window.Zepto||window.jQuery||window.$,window,document)}})(function($,window,document){"use strict";var pluginName="myData";var isJQ=!!window.jQuery;var Plugin=function(){function Plugin(e,t,n,a){_classCallCheck(this,Plugin);this.debug=a;this.bindings=[];this.checkTimer=undefined;this.bindEventsObserver=undefined;this.bindElementsObserver=undefined;this.element=$(e);this.callbacks={};this.keys={event:"data-on",data:"data-bind","data-element":"data-bind-element",value:"data-value","default-value":"data-default-value"};if(_typeof(t)==="object"&&t.hasOwnProperty("event")&&t.hasOwnProperty("data")){this.eventTarget=t.event;this.dataTarget=t.data;if(_typeof(t["data-keys"])==="object"){this.keys={event:t["data-keys"]["event"]||this.keys["event"],value:t["data-keys"]["value"]||this.keys["value"],"default-value":t["data-keys"]["default-value"]||this.keys["default-value"],data:t["data-keys"]["data"]||this.keys["data"],"data-element":t["data-keys"]["data-element"]||this.keys["data-element"]}}}else{this.eventTarget=t;this.dataTarget=t}if(typeof n==="function"){this.callbacks.main=n}else if(_typeof(n)==="object"){this.callbacks.main=n.main;this.callbacks.get=n.get;this.callbacks.set=n.set;this.callbacks.on=n.on}this.bind()}_createClass(Plugin,[{key:"bind",value:function e(){this._setBindEvents();this._setEventListeners();this._triggerBindElementEvents();this._setCheckTimer(250)}},{key:"unbind",value:function e(){this.element.off("."+pluginName,"["+this.keys["data"]+"]").off("."+pluginName,"["+this.keys["data-element"]+"]").off("."+pluginName,"["+this.keys["event"]+"]");clearInterval(this.checkTimer);this.bindEventsObserver.disconnect();this.bindElementsObserver.disconnect();this.bindings=[]}},{key:"_setEventListeners",value:function _setEventListeners(){var _this=this;var bindEvents=["change","keyup","input","paste"].map(function(e){return e+="."+pluginName});var onEvents=["click","dblclick","change","input","paste","load","unload","select","resize","scroll","submit","error","keydown","keyup","keypress","mouseover","mousedown","mouseup","mouseout","mouseenter","mouseleave","blur","focus","focusin","focusout"].map(function(e){return e+="."+pluginName});this.element.on(bindEvents.join(" "),"["+this.keys["data"]+"]",function(e){var t=$(e.currentTarget);var n=t.attr(_this.keys["data"]);var a=undefined;for(var i in _this.bindings){var s=_this.bindings[i];if(s.element!==e.currentTarget||s.property!==n){continue}a=_this._readElementValue(t,s.value);var l="set"+n.charAt(0).toUpperCase()+n.substr(1);if(a!==s.value){s.value=a;if(typeof _this.dataTarget[l]==="function"){_this.dataTarget[l].apply(_this.dataTarget,[a])}else if(typeof _this.dataTarget[n]==="function"){_this.dataTarget[n].apply(_this.dataTarget,[a])}else if(_this.dataTarget.hasOwnProperty(n)){_this.dataTarget[n]=a}break}}if(_this.debug){console.info('jQuery.myData - Binding Data (element > object) (data-bind): Set "'.concat(a,'" to "(set)').concat(n,'", event: ').concat(e.type),t.get(0))}if(typeof _this.callbacks.set==="function"){_this.callbacks.set(t,n,a,{type:e.type})}else if(typeof _this.callbacks.main==="function"){_this.callbacks.main("set",t,n,a,{type:e.type})}});this.element.on(bindEvents.join(" ")+" click","["+this.keys["data-element"]+"]",function(i){var s=$(i.currentTarget);var e=s.attr(_this.keys["data-element"]);_this._extractActions(s,e,function(e,t){var n=s.find(t).length?s.find(t):$(t);var a=_this._readElementValue(s,n.val());if(_this.debug){console.info('jQuery.myData - Element connection (data-bind-element): Set element "'.concat(t,'" value: "').concat(a,'", event: ').concat(i.type),s.get(0))}_this._setElementValue(n,e,a)})});this.element.on(onEvents.join(" "),"["+this.keys["event"]+"]",function(event){var element=$(event.currentTarget);var actionData=element.attr(_this.keys["event"]);_this._extractActions(element,actionData,function(eventType,handlerName){var handlerFunc=handlerName.match(/([a-zA-Z0-9,\.\-_\/]+)(?:\(([^)]+)\))?$/)||false;if(eventType!=event.type||!handlerFunc){return}var name=handlerFunc[1];var args=typeof handlerFunc[2]==="string"?handlerFunc[2].split(",").map(function(e){return e.trim().match(/^['"]{0,}(.*?)['"]{0,}$/)[1]||""}):[];var targetFuncExist=_this.eventTarget!==undefined&&typeof _this.eventTarget[name]==="function";var windowFuncExist=typeof window[name]==="function";var value=_this._readElementValue(element,undefined);var callArgs=$.extend([],args);if(callArgs.length>0){callArgs.push({element:element,event:event,value:value})}else{callArgs=[value,{element:element,event:event,value:value}]}var result=undefined;if(targetFuncExist){result=_this.eventTarget[name].apply(_this.eventTarget,callArgs)}else{try{result=eval(name).apply(window,callArgs)}catch(e){console.warn('jQuery.myData: Could not call - "'.concat(name,'"'))}}if(_this.debug){console.info('jQuery.myData - Action Reaction (data-on): Call function "'.concat(handlerName,'", event: ').concat(event.type),element.get(0))}if(typeof _this.callbacks.on==="function"){_this.callbacks.on(element,name,value,{type:event.type,args:args})}else if(typeof _this.callbacks.main==="function"){_this.callbacks.main("on",element,name,value,{type:event.type,args:args})}if(result===false){event.stopPropagation();return false}else if(result===true){event.preventDefault();return result}})});if(this.debug){console.info("jQuery.myData - Set Event Listeners",this.element)}}},{key:"_setBindEvents",value:function e(){var i=this;var n=function e(t){var n=$(t),a=n.attr(i.keys["data"])||"";if(a===""){return}i.bindings.push({element:t,property:a,value:undefined})};this.element.find("["+this.keys["data"]+"]").each(function(e,t){n(t)});this.bindEventsObserver=new MutationObserver(function(e){e.forEach(function(e){e.addedNodes.forEach(function(e){n(e)})})});this.bindEventsObserver.observe(this.element[0],{childList:true})}},{key:"_triggerBindElementEvents",value:function e(){var r=this;var n=function e(i,s){var l=$(i);var t=l.attr(r.keys["data-element"])||"";if(t===""){return}r._extractActions(l,t,function(e,t){var n=$(t);var a=undefined;if(s){a=$(i).attr(r.keys["default-value"])}if(!a){a=r._readElementValue(l,n.val())}r._setElementValue(n,e,a)})};this.element.find("["+this.keys["data-element"]+"]").each(function(e,t){n(t,true)});this.bindElementsObserver=new MutationObserver(function(e){e.forEach(function(e){e.addedNodes.forEach(function(e){n(e,true)})})});this.bindElementsObserver.observe(this.element[0],{childList:true})}},{key:"_setCheckTimer",value:function e(t){var r=this;clearInterval(this.checkTimer);this.checkTimer=setInterval(function(){for(var e in r.bindings){var t=r.bindings[e];var n=$(t.element);var a=t.property;var i=t.value;var s="";var l="get"+a.charAt(0).toUpperCase()+a.substr(1);if(typeof r.dataTarget[l]==="function"){s=r.dataTarget[l]()}else if(typeof r.dataTarget[a]==="function"){s=r.dataTarget[a]()}else if(r.dataTarget.hasOwnProperty(a)){s=r.dataTarget[a]}if(s===i){continue}t.value=s;if(n.is('input[type="checkbox"]')||n.is('input[type="radio"]')){n.attr("checked",s)}else if(n.is("select")||n.is("input")||n.is("textarea")){n.val(s)}else{n.html(s)}if(r.debug){console.info('jQuery.myData - Binding Data (object > element) (data-bind): Read "'.concat(s,'" from "(get)').concat(a,'"'),n.get(0))}if(typeof r.callbacks.get==="function"){r.callbacks.get(n,a,s,{})}else if(typeof r.callbacks.main==="function"){r.callbacks.main("get",n,a,s,{})}}},t)}},{key:"_readElementValue",value:function e(t,n){var a=undefined;var i=$(t).attr("value");var s=$(t).attr(this.keys["value"]);if(s!==undefined&&s!==""){a=s}else if(t.is('input[type="checkbox"]')||t.is('input[type="radio"]')){if(typeof n!=="boolean"&&i!==undefined){a=$(t).is(":checked")?i:false}else{a=$(t).is(":checked")}}else if(t.is("select")){if(typeof n==="number"){a=$(t).find(":selected").index()}else{a=$(t).val()}}else if(t.is("input")||t.is("textarea")){a=$(t).val()}else if(t.is("a")){a=$(t).attr("href")}else if(t.is("form")){a={};$(t[0]).serializeArray().forEach(function(e){a[e.name]=e.value})}if(a===""||a===undefined){a=i||$(t).html()}return a}},{key:"_setElementValue",value:function e(t,n,a){var i=this._valIsBoolean(a);var s=this._valToBoolean(a);var l=t.data("myData-init");var r;if(n==="visible"||n==="hidden"){var o=t.css("display")===""||t.css("display")==="block"||t.css("display")==="none";if(i){r=n==="visible"&&s?"visible":"hidden"}else{r=n==="visible"&&t.is(":visible")?"hidden":"visible"}if(o){t.css("display",r==="hidden"?"none":"block")}else{t.css("visibility",r)}}else if(n==="enabled"||n==="disabled"){if(i){r=!s&&n==="enabled"||s&&n==="disabled"}else{r=t.is(":disabled")}if(!r){t.removeAttr("disabled")}else{t.attr("disabled","disabled")}}else if(n==="slide"){if(i){r=s}else{r=!t.is(":visible")}if(r){t.slideDown(200)}else{t.slideUp(200)}}else{if(t.is("input")||t.is("textarea")){t.val(a)}else{t.text(a)}}t.data("myData-init",true)}},{key:"_extractActions",value:function e(t,n,l){var r="click";if(t.is("form")){r="submit"}else if(t.is("input, select, textarea")){r="change"}var a=[];if(typeof n!=="string"){return}else{if(n.indexOf("[")===0){try{a=JSON.parse(n)}catch(e){a=(n.match(/[\[\{}](.*?)[\}\]]/)[1]||"").split(",")}}else{a=n.split(",")}}a.forEach(function(e,t,n){var a=e.indexOf(":")>=0?e.split(":"):[r,e];var i=a[0].trim().split(",");var s=a[1].trim();if(!s){return}i.forEach(function(e,t,n){l(e,s)})})}},{key:"_valIsBoolean",value:function e(t){return typeof t==="boolean"&&t||typeof t==="string"&&["yes","true","y","no","false","n"].indexOf(t)!==-1||typeof t==="integer"&&[0,1].indexOf(t)!==-1}},{key:"_valToBoolean",value:function e(t){return typeof t==="boolean"&&t||typeof t==="string"&&["yes","true","y"].indexOf(t)!==-1||typeof t==="integer"&&t===1}},{key:"destroy",value:function e(){this.unbind()}}]);return Plugin}();$.fn[pluginName]=function(e,t){var n=isJQ?$(this).data("_"+pluginName):$(this)[0]["_"+pluginName];if(e===undefined||_typeof(e)==="object"){var a=Math.random().toString(36).substring(7);var i=false;if(_typeof(e)==="object"){if(e.exclusive){a="";delete e.exclusive}if(e.debug){i=true;delete e.debug}}if(!n||a!==""){var s=new Plugin(this,e,t,i);if(isJQ){$(this).data("_"+pluginName,s)}else{$(this)[0]["_"+pluginName]=s}}return $(this)}else if(typeof e==="string"&&e[0]!=="_"&&e!=="init"){var l=arguments;var r=undefined;if(n instanceof Plugin&&typeof n[e]==="function"){r=n[e].apply(n,Array.prototype.slice.call(l,1))}return r!==undefined?r:$(this)}}});