JS原生數(shù)據(jù)雙向綁定實現(xiàn)代碼
更新時間:2017年08月14日 11:24:42 作者:搖扇子的諸葛亮
本文通過實例代碼給大家介紹了JS原生數(shù)據(jù)雙向綁定問題,代碼簡單易懂,非常不錯,具有參考借鑒價值,需要的的朋友參考下吧
代碼如下:
<span style="font-family:Times New Roman;font-size:14px;" deep="7"><!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Demo</title> <script> function DataBinder( object_id ) { // Create a simple PubSub object var pubSub = { callbacks: {}, on: function( msg, callback ) { this.callbacks[ msg ] = this.callbacks[ msg ] || []; this.callbacks[ msg ].push( callback ); }, publish: function( msg ) { this.callbacks[ msg ] = this.callbacks[ msg ] || []; for ( var i = 0, len = this.callbacks[ msg ].length; i < len; i++ ) { this.callbacks[ msg ][ i ].apply( this, arguments ); } } }, data_attr = "bind-" + object_id, message = object_id + ":input", timeIn; changeHandler = function( evt ) { var target = evt.target || evt.srcElement, // IE8 compatibility prop_name = target.getAttribute( data_attr ); if ( prop_name && prop_name !== "" ) { clearTimeout(timeIn); timeIn = setTimeout(function(){ pubSub.publish( message, prop_name, target.value ); },50); } }; // Listen to change events and proxy to PubSub if ( document.addEventListener ) { document.addEventListener( "input", changeHandler, false ); } else { // IE8 uses attachEvent instead of addEventListener document.attachEvent( "oninput", changeHandler ); } // PubSub propagates changes to all bound elements pubSub.on( message, function( evt, prop_name, new_val ) { var elements = document.querySelectorAll("[" + data_attr + "=" + prop_name + "]"), tag_name; for ( var i = 0, len = elements.length; i < len; i++ ) { tag_name = elements[ i ].tagName.toLowerCase(); if ( tag_name === "input" || tag_name === "textarea" || tag_name === "select" ) { elements[ i ].value = new_val; } else { elements[ i ].innerHTML = new_val; } } }); return pubSub; } function DBind( uid ) { var binder = new DataBinder( uid ), user = { // ... attributes: {}, set: function( attr_name, val ) { this.attributes[ attr_name ] = val; // Use the `publish` method binder.publish( uid + ":input", attr_name, val, this ); }, get: function( attr_name ) { return this.attributes[ attr_name ]; }, _binder: binder }; // Subscribe to the PubSub binder.on( uid + ":input", function( evt, attr_name, new_val, initiator ) { if ( initiator !== user ) { user.set( attr_name, new_val ); } }); return user; } </script> </head> <body> <input type="text" bind-1="name" /> <span bind-1="name"></span> <script> var DBind = new DBind( 1 ); DBind.set( "name", "" ); </script> </body> </html> </span>
效果示例:
總結(jié)
以上所述是小編給大家介紹的JS原生數(shù)據(jù)雙向綁定實現(xiàn)代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
您可能感興趣的文章:
- javascript實現(xiàn)數(shù)據(jù)雙向綁定的三種方式小結(jié)
- Vue.js每天必學之數(shù)據(jù)雙向綁定
- 輕松實現(xiàn)javascript數(shù)據(jù)雙向綁定
- 深入學習AngularJS中數(shù)據(jù)的雙向綁定機制
- 淺談AngularJs 雙向綁定原理(數(shù)據(jù)綁定機制)
- Vue.js第一天學習筆記(數(shù)據(jù)的雙向綁定、常用指令)
- 深入理解Angularjs向指令傳遞數(shù)據(jù)雙向綁定機制
- AngularJS學習筆記(三)數(shù)據(jù)雙向綁定的簡單實例
- 實例剖析AngularJS框架中數(shù)據(jù)的雙向綁定運用
- js實現(xiàn)數(shù)據(jù)雙向綁定(訪問器監(jiān)聽)
相關(guān)文章
webpack的tree shaking的實現(xiàn)方法
這篇文章主要介紹了webpack的tree shaking的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-09-09javascript動態(tài)添加樣式(行內(nèi)式/嵌入式/外鏈式等規(guī)則)
添加CSS的方式有行內(nèi)式、嵌入式、外鏈式、導入式,下面為大家詳細介紹下javascript動態(tài)添加以上樣式規(guī)則的方法,感興趣的朋友可以參考下哈2013-06-06js中setTimeout()與clearTimeout()用法實例淺析
這篇文章主要介紹了js中setTimeout()與clearTimeout()用法,以實例形式分析了setTimeout()與clearTimeout()的功能與使用技巧,需要的朋友可以參考下2015-05-05JavaScript中的普通函數(shù)和箭頭函數(shù)的區(qū)別和用法詳解
這篇文章主要介紹了JavaScript中的普通函數(shù)和箭頭函數(shù)的區(qū)別和用法詳解,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-03-03