//该属性上面就绑定了事件和数据 if ( ( data = elem[ dataPriv.expando ] ) ) { //如果data 属性置为undefined elem[ dataPriv.expando ] = undefined; } //dataUser应该是用户绑定的事件 if ( elem[ dataUser.expando ] ) { // 将元素的dataUser.expando属性置为undefined // Assign undefined instead of using delete, see Data#remove elem[ dataUser.expando ]置为 undefined ⑥ 将 elem[dataUser.expando]置为 undefined ---- 四、acceptData() 作用: 判断是否是指定的节点类型,返回 true/false
文章目录 一、Expando 动态类简介 二、动态类创建 三、为动态类增加字段和方法 四、完整代码示例 一、Expando 动态类简介 ---- Groovy 运行时 , 可以动态地创建一个类 , 该类称为 " 动态类 " ; 这个类运行前并不存在 , 没有通过 class 定义该类 , 而是在 运行时通过代码创建的 ; Groovy 提供了一个 groovy.util.Expando 类 , 该类专门用于创建 " 动态类 " ; Expando 动态类原型如下 : package groovy.util; /** * 表示一个动态可扩展的bean。 ; public Expando() { } public Expando(Map expandoProperties) { this.expandoProperties = expandoProperties; } } 二、动态类创建 ---- Expando 构造函数可以接受键值对作为参数 , public class Expando extends GroovyObjectSupport
3、markFunction()标记一个特定的函数 function markFunction( fn ){ fn[ expando ] = true; return fn; } 为fn expando是一个字符串,expando = "sizzle" + 1 * new Date()。 4、assert()方法,检测所用元素是否可用。看assert这个单词的含义即知,是一个断言方法。
] = obj[expando] || {}; return obj[expando]; } return { data : function 之后是 getCache() , 获取 “obj” 上的 “cache”,即 obj[expando];如果 obj[expando] 为空,则进行初始化。 function getCache(obj) { if (obj.nodeType) { var id = obj[expando] = obj[expando ] = obj[expando] || {}; return obj[expando]; } } // Other codes uuid 或被存放在 DOM Element 的 “expando” 属性中。
这为创建灵活的数据结构提供了可能:dynamic expando = new ExpandoObject();expando.Property = "Value";expando.Method = new
Groovy 元编程进行函数拦截 | 属性缺失 propertyMissing 函数回调 | 方法缺失 methodMissing 函数回调 ) 博客 ; 利用 Groovy 类的上述特性 , 结合 Expando 动态类 , 实现方法的动态注入 ; Expando 动态类参考 【Groovy】MOP 元对象协议与元编程 ( Expando 动态类 | 创建动态类 | 为动态类增加字段和方法 ) 博客 ; 假如调用了
(cancelBubble、returnValue) 例子: <html> <body> <script> function OuterClick() { if(event.expando == } } function InnerClick() { var eventObj = document.createEventObject(); // Set an expando property eventObj.expando = "from_inner"; parent.document.all.Outer.fireEvent("onclick",eventObj); event.cancelBubble
实际测试效果: 浏览器 复制子元素 标准属性(property) 标准特性(attribute) 自定义特性(customize attribute) 自定义属性(expando) DOM0事件处理函数 boolean} isDeep=true]) 实际测试效果: 浏览器 复制子元素 标准属性(property) 标准特性(attribute) 自定义特性(customize attribute) 自定义属性(expando HTMLDocumentFragment} externalNode) 实际测试效果: 浏览器 复制子元素 标准属性(property) 标准特性(attribute) 自定义特性(customize attribute) 自定义属性(expando }) }(document)) 实际测试效果: 浏览器 复制子元素 标准属性(property) 标准特性(attribute) 自定义特性(customize attribute) 自定义属性(expando
这个函数不用建立一个新的expando,就能在一个元素上存放任何格式的数据,而不仅仅是字符串 removeData([name list]) 在元素上移除存放的数据,与 data([key], [value
elemData = dataPriv.get( elem ) ① Data() //目标元素的jQuery id //源码4209行 function Data() { this.expando = jQuery.expando + Data.uid++; } ② jQuery.expando jQuery.extend( { //相当于jQuery为每一个元素取唯一的id ///\D/g : 去掉非数字的字符 // Unique for each copy of jQuery on the page //源码360行 expando: "jQuery version + Math.random() ).replace( /\D/g, "" ), ... ... }) ③ Math.random() 伪随机,到小数点后16位 expando
fcssescape ); } else { context.setAttribute( "id", (nid = expando } catch ( qsaError ) { } finally { if ( nid === expando
//总览: jQuery.extend({ expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), isReady function(){}, grep: function(){}, map: function(){}, guid: 1, support: support }) 1、先来看下expando
data('prop') ) // get $(elem).data(prop, val)的工作原理如下: 首先为本DOM节点分配一个唯一的数字标识(如果之前没有设置过): elem[ jQuery.expando ] = id = ++jQuery.uuid // from jQuery source 其中jQuery.expando是一个随机数,不会发生重复。 jQuery.cache jQuery.cache[id]['prop'] = val 当需要读取DOM节点的data属性时,原理如下: DOM节点的唯一数字标识被重新获取id = elem[ jQuery.expando
+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:! this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void
document.defaultCharset expando: 当此属性设置为 false 时,它会阻止客户端对象扩展。 document.expando parentWindow: 包含窗口的文档。 document.parentWindow readyState: 指定文档的加载状态。
+e.nodeType};function Y(){this.expando=k.expando+Y.uid++}Y.uid=1,Y.prototype={cache:function(e){var t e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:! this.cache(e):e[this.expando]&&e[this.expando][V(t)]},access:function(e,t,n){return void 0===t||t&&"string e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void k.event.remove(n,r):k.removeEvent(n,r,t.handle);n[Q.expando]=void 0}n[J.expando]&&(n[J.expando]=void
+a.nodeType};function V(){this.expando=r.expando+V.uid++}V.uid=1,V.prototype={cache:function(a){var b a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:! this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0= a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void
function( originalEvent ) { //如果存在属性id则原样返回(因为已处理成jQueryEvent) return originalEvent[ jQuery.expando this.timeStamp = src && src.timeStamp || Date.now(); // Mark it as fixed //修正的标志 this[ jQuery.expando
+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:! this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void
在使用委托时需要注意闭包的概念(和javascript中的类似),理解闭包对象的生命周期 扩展方法 public static bool IsNull(this String x){} 动态类型 Dynamic expando