ホームページ  >  記事  >  ウェブフロントエンド  >  js ネイティブ コードは双方向のデータ バインディングを実装します (直接使用でき、すでにカプセル化されています)。

js ネイティブ コードは双方向のデータ バインディングを実装します (直接使用でき、すでにカプセル化されています)。

亚连
亚连オリジナル
2018-05-18 13:45:282339ブラウズ

以下は、双方向データ バインディングを実装するためにコンパイルした JS ネイティブ コードです。興味のある学生は参照してください。

これは jquery プラグインとしてパッケージ化されています。コードをコピーして Jquery の後に導入します。
プラグイン行を削除して直接使用することもできます。

<!--使用方法-->
<div data-bind-1="name"></div>
<input type="text" data-bind-1="name" />
<script>
    $.DBind(1).set("name", "123");
</script>
(function() {
//封装成jqery插件
jQuery.DBind = function(id) {
return new DBind(id);
};    //下面是具体的实现
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 = "data-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;
}
})();

上記は、双方向データ バインディングを実装するために私がコンパイルした JS ネイティブ コードです。将来的にはすべての人に役立つことを願っています。

関連記事:

jsでdiv、span、labelを作成する方法をコードで詳しく解説

JSダウンロードファイルストリームの簡単な操作(コード添付)

初級ビデオ.js の使用メモ (コードが添付されています)

以上がjs ネイティブ コードは双方向のデータ バインディングを実装します (直接使用でき、すでにカプセル化されています)。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。