`
yiminghe
  • 浏览: 1466431 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

基于cloneNode的组件模版思想

阅读更多

引:


看了一下 YUI 源码架构,发现似乎没有像 Extjs 一样存在一个模版模块,如Ext.template ,而是大量利用了浏览器提供的克隆功能,如同原型设计模式般得到相似的组件(节点)实例,而不用每次重复构建相同的DOM节点,实际也是一种模版思路。

 


实战:

 

在这个思想下,我尝试实验一个基于clone模版的阴影功能 :

 

演示@googlecode


阴影即是在一块区域后面的一片灰色区域,做的好的话还可以圆角边等花样,看一下 windowlite :采用 extjs 的阴影样式而构建圆角阴影:

 

 

原理即是在window 层下放一 div 里面元素组成圆角背景,略大于 window,从而透出 window 形成阴影边框。


阴影层实现 html 代码:

 

<div class="x-shadow" id="ext-gen58" style="z-index: 10000; left: 593px; top: -277px; width: 587px; height: 298px; display: block;">
			<div class="xst">
				<div class="xstl">
				<div class="xstc" style="width: 575px;">
				<div class="xstr">
			</div>
			<div class="xsc" style="height: 286px;">
				<div class="xsml">
				<div class="xsmc" style="width: 575px;">
				<div class="xsmr">
			</div>
			<div class="xsb">
				<div class="xsbl">
				<div class="xsbc" style="width: 575px;">
				<div class="xsbr">
			</div>
		</div>
 

其中 width,height 根据window 的大小而动态调整。


若以 extjs 一类的模版实现,可将此段html设为模版,大小位置参数填充,不同的window,根据该模版填充参数创建不同的阴影层即可。

 

 

cloneNode 模版:

 

若采用 clone 的原型设计,可以页面开始就建立该层(原型层),不同的window建立时,只需 clone 原型层,并修改相应的属性即可,程序更方便简单。

 

步鄹

1.页面开始原型层建立

 

<div class="x-shadow" id="shadowTemplate" style="z-index: 10000; left: -9999px; top: -9999px; display:block;">
			<div class="xst">
				<div class="xstl"></div>
				<div class="xstc"></div>
				<div class="xstr"></div>
			</div>
			<div class="xsc">
				<div class="xsml"></div>
				<div class="xsmc"></div>
				<div class="xsmr"></div>
			</div>
			<div class="xsb">
				<div class="xsbl"></div>
				<div class="xsbc"></div>
				<div class="xsbr"></div>
			</div>
		</div>
 

2.每次 window 建立 需要新的原型层时克隆原型层,并修改相应属性

 

//克隆原型层
function createShadow(style){
			var s1=Ext.getDom("shadowTemplate").cloneNode(true);
			s1.id="s"+Ext.id();
			Ext.fly(s1).setStyle(style);
			var width=Ext.fly(s1).getComputedWidth()-12,
			height=Ext.fly(s1).getComputedHeight()-12;
			var h1=Ext.fly(s1).child(".xstc",true),
			h2=Ext.fly(s1).child(".xsbc",true),
				h4=Ext.fly(s1).child(".xsmc",true),
			h3=Ext.fly(s1).child(".xsc",true);
			h1.style.width=width+"px";
			h2.style.width=width+"px";
			h4.style.width=width+"px";
			h3.style.height=height+"px";
			return s1;
		}

		Ext.onReady(function(){
			var s1=createShadow({
				display:"block",
				left:"10px",
				top:"10px",
				width:"100px",
				height:"100px"
			});
			Ext.getBody().dom.appendChild(s1);	
			
			var s1=createShadow({
				display:"block",
				left:"10px",
				top:"210px",
				width:"100px",
				height:"100px"
			});
			Ext.getBody().dom.appendChild(s1);
		});
 


3.将克隆后的层DOM节点插入到合适位置即可。

 

 

实践2:

 

tabpanellite 中支持两种使用方式

1。直接从markup中渐进增强过来

2。完全由javascript生成一切


对于2,使用模版节点的做法:

Ext.ux.TabPanelLite.template = function() {

    var holder = document.createElement("div");
	holder.className="tabpanel";
    holder.innerHTML = ""
    + "<div class='tabheader'>"
    + "<ul class='tabpanel_nav clearfix'><ul></div><div class='panels'></div>";
    return {

        getSkeleton: function() {
            return holder.cloneNode(true);
        },
        getPanel: function() {
            var p = document.createElement("div");
            p.className = "panel";
            return p;
        },
        getTab: function(active) {
            var li = document.createElement("li");
            li.innerHTML = "" +
            "<a class='tab_left' href='#' hideFocus='on'>"
            + "	<em class='tab_right'>"
            + "		<span class='tab_inner'>"
            + "			<span class='tab_text'>??"

            + "			</span>"
            + "		</span>"
            + "	</em>"
            + "	</a>";
            return li;

        }

    };

} ();
 

 

 

 

 

 

 

  • 大小: 7.7 KB
0
0
分享到:
评论

相关推荐

    javascript 拷贝节点cloneNode()使用介绍.docx

    ### JavaScript 拷贝节点cloneNode()使用介绍 在JavaScript中,`cloneNode()`方法是DOM(Document Object Model)操作中的一个重要功能,主要用于复制(克隆)DOM树中的节点及其属性。这对于创建复杂的用户界面或者...

    javascript cloneNode()方法的使用

    javascript cloneNode()方法的使用 javascript 中的 cloneNode() 方法是用来克隆一个元素的,包括其所有子元素和属性。该方法返回克隆的元素,并且可以选择是否克隆元素的所有子元素。 在上面的实例代码中,我们...

    JavaScript 用cloneNode方法克隆节点的代码

    JavaScript提供了一种简单有效的方法来实现这一点,那就是使用DOM(文档对象模型)中的cloneNode方法。cloneNode方法允许我们复制已有的节点,并且可以选择是否复制节点的子节点,即深拷贝或浅拷贝。 为了理解...

    IE下使用cloneNode注意事项分享

    在网页开发过程中,DOM操作是不可或缺的一部分,其中`cloneNode`方法用于复制DOM节点及其子节点。然而,当在Internet Explorer(尤其是版本8及以下)中使用`cloneNode`时,需要注意一些特定的行为,这些行为可能导致...

    javascript dom操作之cloneNode文本节点克隆使用技巧

    在JavaScript中,DOM(文档对象模型)操作是实现网页动态交互的基础,而`cloneNode`方法是DOM操作中用于克隆节点的一个重要函数。了解`cloneNode`以及它在克隆文本节点时的使用技巧,对于进行DOM操作的前端开发者来...

    javascript 拷贝节点cloneNode()使用介绍

    cloneNode(a)方法接受一个布尔值参数,表示是否深拷贝 true:表示执行深拷贝,复制本节点以及整个子节点树. false:浅拷贝.只复制节点本身. 复制后返回的节点副本属于文档所有,但是并没有父节点.除非使用appendChild,...

    DOM节点深度克隆函数cloneNode()用法实例

    本文实例讲述了DOM节点深度克隆函数cloneNode()用法。分享给大家供大家参考。 具体实现方法如下: 代码如下:&lt;html&gt; &lt;head&gt; [removed] function t(){  var nodeul = document.getElementsByTagName(...

    Opera下cloneNode的bug

    这里我们要讨论的是一个与`cloneNode`方法相关的bug,尤其在处理Form节点时可能会遇到。 `cloneNode`是DOM操作中的一个重要函数,它用于复制一个节点及其所有子节点。在大多数情况下,这个方法在不同浏览器间表现...

    cloneNode实现表格增加删除效果

    `cloneNode`方法就是JavaScript中用于复制DOM节点的一个重要工具,它可以让我们轻松地实现表格的增加和删除功能。下面我们将深入探讨`cloneNode`方法以及如何用它来实现上述的效果。 首先,`cloneNode`是DOM API中...

    web-components-app:使用Web组件的应用程序

    通过阅读和分析这些文件,你可以了解如何从头构建一个基于Web组件的应用程序,理解香草JavaScript和Shadow DOM在实际项目中的应用。这不仅有助于提升Web开发技能,也有利于适应不断变化的前端技术趋势。

    WC-TodoApp:学习Web组件:https:dev.tothepassleweb-components-from-zero-to-hero-4n4m

    WC-TodoApp是一个用于学习Web组件的项目,它基于JavaScript技术构建。Web组件是现代Web开发中的一个重要概念,它允许开发者创建可复用、自包含的UI元素,从而提高代码的模块化和可维护性。在本文中,我们将深入探讨...

    教你javascript克隆dom结点,浅复制结点,深复制结点

    - 创建可复用的组件:在前端开发中,有时我们需要创建多个相似的元素,如列表项,这时可以先创建一个模板,然后通过克隆生成多个副本。 - 动画效果:在某些动画效果中,如粒子效果,可以利用克隆技术来生成大量节点...

    x-element:客户端组件

    shadowRoot.appendChild(template.content.cloneNode(true)); } } ``` 四、生命周期方法 自定义元素有多个生命周期回调,如`constructor`、`connectedCallback`、`disconnectedCallback`等,它们在元素的不同状态...

    自定义标签视频组件网页模板

    shadowRoot.appendChild(template.content.cloneNode(true)); // 在这里可以获取到Shadow DOM中的元素并进行操作 } ``` 4. **添加功能**: 自定义元素可以扩展其功能,如响应式布局、自定义控制按钮、视频流切换...

Global site tag (gtag.js) - Google Analytics