tp 鼠标经过存id数组 子类能定义数组么怎么遍历

2009年11月 PHP大版内专家分月排行榜第二
2009年8月 PHP大版内专家分月排行榜第三
2009年10月 PHP大版内专家分月排行榜第二2009年9月 PHP大版内专家分月排行榜第二2009年7月 PHP大版内专家分月排行榜第二2008年1月 PHP大版内专家分月排行榜第二2007年8月 PHP大版内专家分月排行榜第二2007年5月 PHP大版内专家分月排行榜第二2007年3月 PHP大版内专家分月排行榜第二
2009年11月 PHP大版内专家分月排行榜第三2007年7月 PHP大版内专家分月排行榜第三2007年4月 PHP大版内专家分月排行榜第三2007年1月 PHP大版内专家分月排行榜第三
2009年10月 PHP大版内专家分月排行榜第二2009年9月 PHP大版内专家分月排行榜第二2009年7月 PHP大版内专家分月排行榜第二2008年1月 PHP大版内专家分月排行榜第二2007年8月 PHP大版内专家分月排行榜第二2007年5月 PHP大版内专家分月排行榜第二2007年3月 PHP大版内专家分月排行榜第二
2009年11月 PHP大版内专家分月排行榜第三2007年7月 PHP大版内专家分月排行榜第三2007年4月 PHP大版内专家分月排行榜第三2007年1月 PHP大版内专家分月排行榜第三
2005年12月 PHP大版内专家分月排行榜第二2005年11月 PHP大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。商城首页无限极分类,遍历数组的问题,求教大神。【php吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:136,294贴子:
商城首页无限极分类,遍历数组的问题,求教大神。收藏
要在商城前台首页显示无限极分类,类似京东那样的这是商品分类模型的代码,用的TP框架,三层的嵌套循环,遍历完某个单元之后,销毁变量,我知道不unset掉也是可以的,就是不明白这几个问题:第14行 unset($data[$k]);和15行
unset($v);
有何区别?为什么unset($data[$k]) 之后,print_r($v);这一项还是能打印出结果?既然unset掉了,第33行的赋值又怎么会起作用呢?头大了,哪位大神指点一下,感激不尽哪。
php学习选达内,O基础入学,名师指导1-4个月从入门到精通,先就业后付款「需高中以上!南昌php培训,达内培训O基础变php高手!免费培训7天试学
看到你的代码我发现我的基础完全不过关
$data[$K] 这个是 原来的数据, $v 是foreach 搞出来的 $v , 他是存在的.
unset($data[$k], $v还是存在的.
我咧个去,怎么套了这么多层
foreach是把$data 复制一份出来进行循环,另外,你可以猜猜下面的结果&?php$data =array('a','b','c');foreach($data as $k=&$v){
$v='d';
echo $data[$k]; /// 猜猜这个}foreach($data as &$val){
$val = 'e';}echo $data[0]
///猜猜这个?&
没仔细看,但是你不用递归的话确定能遍历无限分类吗
$arr = array(1,2,3,4,5);foreach ($arr as $v) echo $v;function forea(&$arr){
echo current($arr);
if(next($arr)){
forea($arr);
}}你觉得哪种方便呢?另外,使用递归效率是最差的。
我是用数据库把父类和子类分别查询出来,然后在前端直接显示,2条SQL语句搞定
无限分类可以参考我几天前写的一个帖子,花了好长时间想出来的,不使用递归的无限分类,还有可自定义层次深度的分类。速度很不错,2500条数据处理用时8ms
启博360Shopphp分销系统,砍价/团购/秒杀/拼团等一应俱全,分销商裂变无限量,助力企业发力微电商.详情点击咨询
如果层次多了呢??
递归可解决,
这代码真搓,就算不用递归,也不应该这样
楼主你问的现在解决了嘛?
登录百度帐号推荐应用项目语言:PHP
权限:read-only(如需更高权限请先加入项目)
Index: dd.js
===================================================================
--- dd.js (revision 0)
+++ dd.js (revision 2)
@@ -0,0 +1,1121 @@
+Copyright 2011, KISSY UI Library v1.20dev
+MIT Licensed
+build time: ${build.time}
+ * dd support for kissy , dd objects central management module
+ * @author: 承玉&&
+KISSY.add('dd/ddm', function(S, DOM, Event, N, Base) {
var doc = document,
Node = S.require(&node/node&),
SHIM_ZINDEX = 999999;
function DDM() {
DDM.superclass.constructor.apply(this, arguments);
this._init();
DDM.ATTRS = {
prefixCls:{
value:&ks-dd-&
* mousedown 后 buffer 触发时间
bufferTime: { value: 200 },
* 当前激活的拖动对象,在同一时间只有一个值,所以不是数组
activeDrag: {},
*当前激活的drop对象,在同一时间只有一个值
activeDrop:{},
* 所有注册的可被防止对象,统一管理
负责拖动涉及的全局事件:
1.全局统一的鼠标移动监控
2.全局统一的鼠标弹起监控,用来通知当前拖动对象停止
3.为了跨越 iframe 而统一在底下的遮罩层
S.extend(DDM, Base, {
_regDrop:function(d) {
this.get(&drops&).push(d);
_unregDrop:function(d) {
var index = S.indexOf(d, this.get(&drops&));
if (index != -1) {
this.get(&drops&).splice(index, 1);
_init: function() {
var self =
self._showShimMove = throttle(self._move, self, 30);
全局鼠标移动事件通知当前拖动对象正在移动
注意:chrome8: click 时 mousedown-mousemove-mouseup-click 也会触发 mousemove
_move: function(ev) {
var activeDrag = this.get('activeDrag');
//S.log(&move&);
if (!activeDrag)
//防止 ie 选择到字
ev.preventDefault();
activeDrag._move(ev);
* 获得当前的激活drop
this._notifyDropsMove(ev);
_notifyDropsMove:function(ev) {
var activeDrag = this.get(&activeDrag&),mode = activeDrag.get(&mode&);
var drops = this.get(&drops&);
var activeDrop,
vArea = 0,
dragRegion = region(activeDrag.get(&node&)),
dragArea = area(dragRegion);
S.each(drops, function(drop) {
var node = drop.getNodeFromTarget(ev);
if (!node || node[0] == activeDrag.get(&dragNode&)[0])
if (mode == &point&) {
//取鼠标所在的 drop 区域
if (inNodeByPointer(node, activeDrag.mousePos)) {
activeDrop =
} else if (mode == &intersect&) {
//取一个和activeDrag交集最大的drop区域
a = area(intersect(dragRegion, region(node)));
if (a & vArea) {
activeDrop =
} else if (mode == &strict&) {
//drag 全部在 drop 里面
a = area(intersect(dragRegion, region(node)));
if (a == dragArea) {
activeDrop =
var oldDrop = this.get(&activeDrop&);
if (oldDrop && oldDrop != activeDrop) {
oldDrop._handleOut(ev);
if (activeDrop) {
activeDrop._handleOver(ev);
activeDrag.get(&node&).removeClass(this.get(&prefixCls&) + &drag-over&);
this.set(&activeDrop&, null);
_deactivateDrops:function() {
var activeDrag = this.get(&activeDrag&),
activeDrop = this.get(&activeDrop&);
activeDrag.get(&node&).removeClass(this.get(&prefixCls&) + &drag-over&);
if (activeDrop) {
var ret = { drag: activeDrag, drop: activeDrop};
activeDrop.get(&node&).removeClass(this.get(&prefixCls&) + &drop-over&);
activeDrop.fire('drophit', ret);
activeDrag.fire('dragdrophit', ret)
this.fire(&drophit&, ret);
this.fire(&dragdrophit&, ret);
activeDrag.fire('dragdropmiss', {
drag:activeDrag
this.fire(&dragdropmiss&, {
drag:activeDrag
* 当前拖动对象通知全局:我要开始啦
* 全局设置当前拖动对象,
* 还要根据配置进行 buffer 处理
* @param drag
_start: function(drag) {
var self = this,
bufferTime = self.get(&bufferTime&) || 0;
//事件先要注册好,防止点击,导致 mouseup 时还没注册事件
self._registerEvent();
//是否中央管理,强制限制拖放延迟
if (bufferTime) {
self._bufferTimer = setTimeout(function() {
self._bufferStart(drag);
}, bufferTime);
self._bufferStart(drag);
_bufferStart: function(drag) {
var self =
self.set('activeDrag', drag);
//真正开始移动了才激活垫片
if (drag.get(&shim&))
self._activeShim();
drag._start();
drag.get(&dragNode&).addClass(this.get(&prefixCls&) + &dragging&);
* 全局通知当前拖动对象:你结束拖动了!
* @param ev
_end: function(ev) {
var self = this,
activeDrag = self.get(&activeDrag&);
self._unregisterEvent();
if (self._bufferTimer) {
clearTimeout(self._bufferTimer);
self._bufferTimer =
self._shim && self._shim.css({
display:&none&
if (!activeDrag)
activeDrag._end(ev);
activeDrag.get(&dragNode&).removeClass(this.get(&prefixCls&) + &dragging&);
//处理 drop,看看到底是否有 drop 命中
this._deactivateDrops(ev);
self.set(&activeDrag&, null);
self.set(&activeDrop&, null);
* 垫片只需创建一次
_activeShim: function() {
var self = this,doc =
//创造垫片,防止进入iframe,外面document监听不到 mousedown/up/move
self._shim = new Node(&&div & +
&style='& +
//red for debug
&background-color:& +
&position:& +
&left:0;& +
&width:100%;& +
&top:0;& +
&cursor:& +
&z-index:& +
//覆盖iframe上面即可
SHIM_ZINDEX
&'&&/div&&).appendTo(doc.body);
//0.5 for debug
self._shim.css(&opacity&, 0);
self._activeShim = self._showS
self._showShim();
_showShim: function() {
var self =
self._shim.css({
display: &&,
height: DOM['docHeight']()
* 开始时注册全局监听事件
_registerEvent: function() {
var self =
Event.on(doc, 'mouseup', self._end, self);
Event.on(doc, 'mousemove', self._showShimMove, self);
* 结束时需要取消掉,防止平时无谓的监听
_unregisterEvent: function() {
var self =
Event.remove(doc, 'mousemove', self._showShimMove, self);
Event.remove(doc, 'mouseup', self._end, self);
* Throttles a call to a method based on the time between calls. from YUI
* @method throttle
* @for KISSY
* @param fn {function} The function call to throttle.
* @param ms {int} The number of milliseconds to throttle the method call. Defaults to 150
* @return {function} Returns a wrapped function that calls fn throttled.
* ! Based on work by Simon Willison: /292562
function throttle(fn, scope, ms) {
ms = ms || 150;
if (ms === -1) {
return (function() {
fn.apply(scope, arguments);
var last = S.now();
return (function() {
var now = S.now();
if (now - last & ms) {
fn.apply(scope, arguments);
function region(node) {
var offset = node.offset();
left:offset.left,
right:offset.left + node[0].offsetWidth,
top:offset.top,
bottom:offset.top + node[0].offsetHeight
function inRegion(region, pointer) {
return region.left &= pointer.left
&& region.right &= pointer.left
&& region.top &= pointer.top
&& region.bottom &= pointer.
function area(region) {
if (region.top &= region.bottom || region.left &= region.right) return 0;
return (region.right - region.left) * (region.bottom - region.top);
function intersect(r1, r2) {
var t = Math.max(r1.top, r2.top),
r = Math.min(r1.right, r2.right),
b = Math.min(r1.bottom, r2.bottom),
l = Math.max(r1.left, r2.left);
function inNodeByPointer(node, point) {
return inRegion(region(node), point);
var ddm = new DDM();
ddm.inRegion = inR
ddm.region =
requires:[&dom&,&event&,&node&,&base&]
+ * dd support for kissy, drag for dd
+ * @author: 承玉&&
+KISSY.add('dd/draggable', function(S, UA, Node, Base, DDM) {
拖放纯功能类
function Draggable() {
Draggable.superclass.constructor.apply(this, arguments);
this._init();
Draggable.POINT = &pointer&;
Draggable.INTERSECT = &intersect&;
Draggable.STRICT = &strict&;
Draggable.ATTRS = {
* 拖放节点,可能指向 proxy node
setter:function(v) {
return Node.one(v);
真实的节点
dragNode:{},
* 是否需要遮罩跨越iframe
value:true
* handler 数组,注意暂时必须在 node 里面
handlers:{
value:&move&
* @enum point,intersect,strict
* @description
In point mode, a Drop is targeted by the cursor being over the Target
In intersect mode, a Drop is targeted by &part& of the drag node being over the Target
In strict mode, a Drop is targeted by the &entire& drag node being over the Target
value:'point'
S.extend(Draggable, Base, {
_init: function() {
var self = this,
node = self.get('node'),
handlers = self.get('handlers');
self.set(&dragNode&, node);
if (handlers.length == 0) {
handlers[0] =
for (var i = 0; i & handlers. i++) {
var hl = handlers[i];
hl = S.one(hl);
//ie 不能在其内开始选择区域
hl.unselectable();
if (self.get(&cursor&)) {
hl.css('cursor', 'move');
node.on('mousedown', self._handleMouseDown, self);
destroy:function() {
var self = this,
node = self.get('node'),
handlers = self.get('handlers');
for (var i = 0; i & handlers. i++) {
var hl = handlers[i];
if (hl.css(&cursor&) == &move&) {
hl.css(&cursor&, &auto&);
node.detach('mousedown', self._handleMouseDown, self);
self.detach();
_check: function(t) {
var handlers = this.get('handlers');
for (var i = 0; i & handlers. i++) {
var hl = handlers[i];
if (hl.contains(t)
//子区域内点击也可以启动
hl[0] == t[0])
* 鼠标按下时,查看触发源是否是属于 handler 集合,
* 保存当前状态
* 通知全局管理器开始作用
* @param ev
_handleMouseDown: function(ev) {
var self = this,
t = new Node(ev.target);
if (!self._check(t))
//chrome 阻止了 flash 点击??
//不组织的话chrome会选择
//if (!UA.webkit) {
//firefox 默认会拖动对象地址
ev.preventDefault();
self._prepare(ev);
_prepare:function(ev) {
var self =
DDM._start(self);
var node = self.get(&node&),
mx = ev.pageX,
my = ev.pageY,
nxy = node.offset();
self.startMousePos = self.mousePos = {
self.startNodePos =
self._diff = {
left:mx - nxy.left,
top:my - nxy.top
self.set(&diff&, self._diff);
_move: function(ev) {
var self = this,
diff = self.get(&diff&),
left = ev.pageX - diff.left,
top = ev.pageY - diff.
self.mousePos = {
left:ev.pageX,
top:ev.pageY
self.fire(&drag&, {
left:left,
DDM.fire(&drag&, {
left:left,
_end: function() {
this.fire(&dragend&);
DDM.fire(&dragend&, {
_start: function() {
this.fire(&dragstart&);
DDM.fire(&dragstart&, {
requires:[&ua&,&node&,&base&,&dd/ddm&]
+ * droppable for kissy
+ * @author:
+KISSY.add(&dd/droppable&, function(S, Node, Base, DDM) {
function Droppable() {
Droppable.superclass.constructor.apply(this, arguments);
this._init();
Droppable.ATTRS = {
setter:function(v) {
var n = Node.one(v);
n.addClass(DDM.get(&prefixCls&) + &drop&);
S.extend(Droppable, Base, {
* 用于被 droppable-delegate override
* @param {KISSY.EventObject} ev
getNodeFromTarget:function(ev) {
return this.get(&node&);
_init:function() {
DDM._regDrop(this);
_handleOut:function() {
var activeDrag = DDM.get(&activeDrag&);
this.get(&node&).removeClass(DDM.get(&prefixCls&) + &drop-over&);
this.fire(&dropexit&, {
drop:this,
drag:activeDrag
DDM.fire(&dropexit&, {
drop:this,
drag:activeDrag
activeDrag.get(&node&).removeClass(DDM.get(&prefixCls&) + &drag-over&);
activeDrag.fire(&dragexit&, {
drop:this,
drag:activeDrag
DDM.fire(&dragexit&, {
drop:this,
drag:activeDrag
_handleOver:function(ev) {
var oldDrop = DDM.get(&activeDrop&);
DDM.set(&activeDrop&, this);
var activeDrag = DDM.get(&activeDrag&);
this.get(&node&).addClass(DDM.get(&prefixCls&) + &drop-over&);
var evt = S.mix({
drag:activeDrag,
if (this != oldDrop) {
activeDrag.get(&node&).addClass(DDM.get(&prefixCls&) + &drag-over&);
//第一次先触发 dropenter,dragenter
activeDrag.fire(&dragenter&, evt);
this.fire(&dropenter&, evt);
DDM.fire(&dragenter&, evt);
DDM.fire(&dropenter&, evt);
activeDrag.fire(&dragover&, evt);
this.fire(&dropover&, evt);
DDM.fire(&dragover&, evt);
DDM.fire(&dropover&, evt);
destroy:function() {
DDM._unregDrop(this);
+}, { requires:[&node&,&base&,&dd/ddm&] });/**
+ * generate proxy drag object,
+ * @author:
+KISSY.add(&dd/proxy&, function(S) {
function Proxy() {
Proxy.superclass.constructor.apply(this, arguments);
Proxy.ATTRS = {
如何生成替代节点
@return {KISSY.Node} 替代节点
value:function(drag) {
var n = S.one(drag.get(&node&)[0].cloneNode(true));
n.attr(&id&, S.guid(&ks-dd-proxy&));
destroyOnEnd:{
* 是否每次都生成新节点/拖放完毕是否销毁当前代理节点
value:false
S.extend(Proxy, S.Base, {
attach:function(drag) {
var self =
drag.on(&dragstart&, function() {
var node = self.get(&node&);
var dragNode = drag.get(&node&);
if (!self.__proxy && S.isFunction(node)) {
node = node(drag);
node.addClass(&ks-dd-proxy&);
node.css(&position&, &absolute&);
self.__proxy =
dragNode.parent().append(self.__proxy);
self.__proxy.show();
self.__proxy.offset(dragNode.offset());
drag.set(&dragNode&, dragNode);
drag.set(&node&, self.__proxy);
drag.on(&dragend&, function() {
var node = self.__
drag.get(&dragNode&).offset(node.offset());
node.hide();
if (self.get(&destroyOnEnd&)) {
node.remove();
self.__proxy =
drag.set(&node&, drag.get(&dragNode&));
destroy:function() {
var node = this.get(&node&);
if (node && !S.isFunction(node)) {
node.remove();
+ * delegate all draggable nodes to one draggable object
+ * @author:
+KISSY.add(&dd/draggable-delegate&, function(S, DDM, Draggable, DOM) {
function Delegate() {
Delegate.superclass.constructor.apply(this, arguments);
S.extend(Delegate, Draggable, {
_init:function() {
var self = this,
handlers = self.get('handlers'),
node = self.get('container');
if (handlers.length == 0) {
handlers.push(self.get(&selector&));
node.on('mousedown', self._handleMouseDown, self);
* 得到适合 handler,从这里开始启动拖放,对于 handlers 选择器字符串数组
* @param target
_getHandler:function(target) {
var self = this,
node = this.get(&container&),
handlers = self.get('handlers');
while (target && target[0] !== node[0]) {
for (var i = 0; i & handlers. i++) {
var h = handlers[i];
if (DOM.test(target[0], h, node[0])) {
target = target.parent();
* 找到真正应该移动的节点,对应 selector 属性选择器字符串
* @param h
_getNode:function(h) {
var node = this.get(&container&),sel = this.get(&selector&);
while (h && h[0] != node[0]) {
if (DOM.test(h[0], sel, node[0])) {
h = h.parent();
* 父容器监听 mousedown,找到合适的拖动 handlers 以及拖动节点
* @param ev
_handleMouseDown:function(ev) {
var self =
var target = ev.
var handler = target && this._getHandler(target);
if (!handler)
var node = this._getNode(handler);
if (!node)
ev.preventDefault();
self.set(&node&, node);
self.set(&dragNode&, node);
self._prepare(ev);
* 用于委托的父容器
container:{
setter:function(v) {
return S.one(v);
* 实际拖放的节点选择器,一般用 tag.cls
selector:{
* 继承来的 handlers : 拖放句柄选择器数组,一般用 [ tag.cls ]
* 不设则为 [ selector ]
* handlers:{
requires:['./ddm','./draggable','dom']
+ * only one droppable instance for multiple droppable nodes
+ * @author:
+KISSY.add(&dd/droppable-delegate&, function(S, DDM, Droppable, DOM, Node) {
function DroppableDelegate() {
DroppableDelegate.superclass.constructor.apply(this, arguments);
S.extend(DroppableDelegate, Droppable, {
* 根据鼠标位置得到真正的可放目标,暂时不考虑 mode,只考虑鼠标
* @param ev
getNodeFromTarget:function(ev) {
var pointer = {
left:ev.pageX,
top:ev.pageY
var container = this.get(&container&),
selector = this.get(&selector&);
var allNodes = container.all(selector);
for (var i = 0; i & allNodes. i++) {
var n = new Node(allNodes[i]);
if (!n.hasClass(&ks-dd-proxy&) && DDM.inRegion(DDM.region(n), pointer)) {
this.set(&lastNode&, this.get(&node&));
this.set(&node&, n);
_handleOut:function() {
DroppableDelegate.superclass._handleOut.call(this);
this.set(&node&, null);
this.set(&lastNode&, null);
_handleOver:function(ev) {
var oldDrop = DDM.get(&activeDrop&);
DDM.set(&activeDrop&, this);
var activeDrag = DDM.get(&activeDrag&);
this.get(&node&).addClass(DDM.get(&prefixCls&) + &drop-over&);
var evt = S.mix({
drag:activeDrag,
var node = this.get(&node&),
lastNode = this.get(&lastNode&);
if (this != oldDrop
|| !lastNode
|| (lastNode && lastNode[0] !== node[0])
* 两个可 drop 节点相邻,先通知上次的离开
if (lastNode) {
this.set(&node&, lastNode);
DroppableDelegate.superclass._handleOut.call(this);
* 再通知这次的进入
this.set(&node&, node);
activeDrag.get(&node&).addClass(DDM.get(&prefixCls&) + &drag-over&);
//第一次先触发 dropenter,dragenter
activeDrag.fire(&dragenter&, evt);
this.fire(&dropenter&, evt);
DDM.fire(&dragenter&, evt);
DDM.fire(&dropenter&, evt);
activeDrag.fire(&dragover&, evt);
this.fire(&dropover&, evt);
DDM.fire(&dragover&, evt);
DDM.fire(&dropover&, evt);
* 上一个成为放目标的节点
lastNode:{
* 放目标节点选择器
selector:{
* 放目标所在区域
container:{
setter:function(v) {
return S.one(v);
return DroppableD
requires:['./ddm','./droppable','dom','node']
+ * auto scroll for drag object's container
+ * @author:
+KISSY.add(&dd/scroll&, function(S, Base, Node, DOM) {
function Scroll() {
Scroll.superclass.constructor.apply(this, arguments);
Scroll.ATTRS = {
setter:function(v) {
return Node.one(v);
value:[10,10]
value:[20,20]
function isWin(node) {
return !node || node ==
S.extend(Scroll, Base, {
getRegion:function(node) {
if (isWin(node)) {
width:DOM['viewportWidth'](),
height:DOM['viewportHeight']()
width:node[0].offsetWidth,
height:node[0].offsetHeight
getOffset:function(node) {
if (isWin(node)) {
left:DOM.scrollLeft(),
top:DOM.scrollTop()
return node.offset();
getScroll:function(node) {
if (isWin(node)) {
left:DOM.scrollLeft(),
top:DOM.scrollTop()
left:node[0].scrollLeft,
top:node[0].scrollTop
setScroll:function(node, r) {
if (isWin(node)) {
window.scrollTo(r.left, r.top);
node[0].scrollLeft = r.
node[0].scrollTop = r.
attach:function(drag) {
var self = this,
rate = self.get(&rate&),
diff = self.get(&diff&),
目前相对 container 的便宜,container 为 window 时,相对于 viewport
drag.on(&drag&, function(ev) {
if (ev.fake)
var node = self.get(&node&);
dxy = S.clone(drag.mousePos);
var offset = self.getOffset(node);
dxy.left -= offset.
dxy.top -= offset.
if (!timer) {
startScroll();
drag.on(&dragend&, function() {
clearTimeout(timer);
function startScroll() {
//S.log(&******* scroll&);
var node = self.get(&node&),
r = self.getRegion(node),
nw = r.width,
nh = r.height,
scroll = self.getScroll(node),
origin = S.clone(scroll);
var diffY = dxy.top -
//S.log(diffY);
var adjust =
if (diffY &= -diff[1]) {
scroll.top += rate[1];
var diffY2 = dxy.
//S.log(diffY2);
if (diffY2 &= diff[1]) {
scroll.top -= rate[1];
var diffX = dxy.left -
//S.log(diffX);
if (diffX &= -diff[0]) {
scroll.left += rate[0];
var diffX2 = dxy.
//S.log(diffX2);
if (diffX2 &= diff[0]) {
scroll.left -= rate[0];
if (adjust) {
self.setScroll(node, scroll);
timer = setTimeout(arguments.callee, 100);
// 不希望更新相对值,特别对于相对 window 时,相对值如果不真正拖放触发的 drag,是不变的,
// 不会因为程序 scroll 而改变相对值
event.fake =
if (isWin(node)) {
// 当使 window 自动滚动时,也要使得拖放物体相对文档位置随 scroll 改变
// 而相对 node 容器时,只需 node 容器滚动,拖动物体相对文档位置不需要改变
scroll = self.getScroll(node);
event.left += scroll.left - origin.
event.top += scroll.top - origin.
drag.fire(&drag&, event);
requires:['base','node','dom']
+ * dd support for kissy
+ * @author: 承玉&&
+KISSY.add(&dd&, function(S, DDM, Draggable, Droppable, Proxy, Delegate, DroppableDelegate, Scroll) {
var dd = {
Draggable:Draggable,
Droppable:Droppable,
Proxy:Proxy,
DraggableDelegate:Delegate,
DroppableDelegate:DroppableDelegate,
Scroll:Scroll
S.mix(S, dd);
requires:[&dd/ddm&,
&dd/draggable&,
&dd/droppable&,
&dd/proxy&,
&dd/draggable-delegate&,
&dd/droppable-delegate&,
&dd/scroll&]
Index: dd-min.js
===================================================================
--- dd-min.js (revision 0)
+++ dd-min.js (revision 2)
@@ -0,0 +1,30 @@
+Copyright 2011, KISSY UI Library v1.20dev
+MIT Licensed
+build time: ${build.time}
+KISSY.add(&dd/ddm&,function(j,k,h,e,i){function a(){a.superclass.constructor.apply(this,arguments);this._init()}function c(b,f,m){m=m||150;if(m===-1)return function(){b.apply(f,arguments)};var n=j.now();return function(){var p=j.now();if(p-n&m){n=p;b.apply(f,arguments)}}}function d(b){var f=b.offset();return{left:f.left,right:f.left+b[0].offsetWidth,top:f.top,bottom:f.top+b[0].offsetHeight}}function g(b,f){return b.left&=f.left&&b.right&=f.left&&b.top&=f.top&&b.bottom&=f.top}function l(b){if(b.top&=
+b.bottom||b.left&=b.right)return 0;return(b.right-b.left)*(b.bottom-b.top)}function o(b,f){return{left:Math.max(b.left,f.left),right:Math.min(b.right,f.right),top:Math.max(b.top,f.top),bottom:Math.min(b.bottom,f.bottom)}}var q=document,t=j.require(&node/node&);a.ATTRS={prefixCls:{value:&ks-dd-&},bufferTime:{value:200},activeDrag:{},activeDrop:{},drops:{value:[]}};j.extend(a,i,{_regDrop:function(b){this.get(&drops&).push(b)},_unregDrop:function(b){b=j.indexOf(b,this.get(&drops&));b!=-1&&this.get(&drops&).splice(b,
+1)},_init:function(){this._showShimMove=c(this._move,this,30)},_move:function(b){var f=this.get(&activeDrag&);if(f){b.preventDefault();f._move(b);this._notifyDropsMove(b)}},_notifyDropsMove:function(b){var f=this.get(&activeDrag&),m=f.get(&mode&),n=this.get(&drops&),p,s=0,v=d(f.get(&node&)),w=l(v);j.each(n,function(u){var r=u.getNodeFromTarget(b);if(!(!r||r[0]==f.get(&dragNode&)[0]))if(m==&point&){if(g(d(r),f.mousePos)){p=u;return false}}else if(m==&intersect&){r=l(o(v,d(r)));if(r&s){s=r;p=u}}else if(m==
+&strict&){r=l(o(v,d(r)));if(r==w){p=u;return false}}});(n=this.get(&activeDrop&))&&n!=p&&n._handleOut(b);if(p)p._handleOver(b);else{f.get(&node&).removeClass(this.get(&prefixCls&)+&drag-over&);this.set(&activeDrop&,null)}},_deactivateDrops:function(){var b=this.get(&activeDrag&),f=this.get(&activeDrop&);b.get(&node&).removeClass(this.get(&prefixCls&)+&drag-over&);if(f){var m={drag:b,drop:f};f.get(&node&).removeClass(this.get(&prefixCls&)+&drop-over&);f.fire(&drophit&,m);b.fire(&dragdrophit&,m);this.fire(&drophit&,
+m);this.fire(&dragdrophit&,m)}else{b.fire(&dragdropmiss&,{drag:b});this.fire(&dragdropmiss&,{drag:b})}},_start:function(b){var f=this,m=f.get(&bufferTime&)||0;f._registerEvent();if(m)f._bufferTimer=setTimeout(function(){f._bufferStart(b)},m);else f._bufferStart(b)},_bufferStart:function(b){this.set(&activeDrag&,b);b.get(&shim&)&&this._activeShim();b._start();b.get(&dragNode&).addClass(this.get(&prefixCls&)+&dragging&)},_end:function(b){var f=this.get(&activeDrag&);this._unregisterEvent();if(this._bufferTimer){clearTimeout(this._bufferTimer);
+this._bufferTimer=null}this._shim&&this._shim.css({display:&none&});if(f){f._end(b);f.get(&dragNode&).removeClass(this.get(&prefixCls&)+&dragging&);this._deactivateDrops(b);this.set(&activeDrag&,null);this.set(&activeDrop&,null)}},_activeShim:function(){var b=this._shim=(new t(&&div style='background-color:position:left:0;width:100%;top:0;cursor:z-index:999999;'&&/div&&)).appendTo(b.body);this._shim.css(&opacity&,0);this._activeShim=this._showSthis._showShim()},_showShim:function(){this._shim.css({display:&&,
+height:k.docHeight()})},_registerEvent:function(){h.on(q,&mouseup&,this._end,this);h.on(q,&mousemove&,this._showShimMove,this)},_unregisterEvent:function(){h.remove(q,&mousemove&,this._showShimMove,this);h.remove(q,&mouseup&,this._end,this)}});e=e.inRegion=g;e.region=d;return e},{requires:[&dom&,&event&,&node&,&base&]});
+KISSY.add(&dd/draggable&,function(j,k,h,e,i){function a(){a.superclass.constructor.apply(this,arguments);this._init()}a.POINT=&pointer&;a.INTERSECT=&intersect&;a.STRICT=&strict&;a.ATTRS={node:{setter:function(c){return h.one(c)}},dragNode:{},shim:{value:true},handlers:{value:[]},cursor:{value:&move&},mode:{value:&point&}};j.extend(a,e,{_init:function(){var c=this.get(&node&),d=this.get(&handlers&);this.set(&dragNode&,c);if(d.length==0)d[0]=c;for(var g=0;g&d.g++){var l=d[g];l=j.one(l);l.unselectable();
+this.get(&cursor&)&&l.css(&cursor&,&move&)}c.on(&mousedown&,this._handleMouseDown,this)},destroy:function(){for(var c=this.get(&node&),d=this.get(&handlers&),g=0;g&d.g++){var l=d[g];l.css(&cursor&)==&move&&&l.css(&cursor&,&auto&)}c.detach(&mousedown&,this._handleMouseDown,this);this.detach()},_check:function(c){for(var d=this.get(&handlers&),g=0;g&d.g++){var l=d[g];if(l.contains(c)||l[0]==c[0])return true}return false},_handleMouseDown:function(c){if(this._check(new h(c.target))){c.preventDefault();
+this._prepare(c)}},_prepare:function(c){i._start(this);var d=this.get(&node&),g=c.pageX;c=c.pageY;d=d.offset();this.startMousePos=this.mousePos={left:g,top:c};this.startNodePos=d;this._diff={left:g-d.left,top:c-d.top};this.set(&diff&,this._diff)},_move:function(c){var d=this.get(&diff&),g=c.pageX-d.d=c.pageY-d.this.mousePos={left:c.pageX,top:c.pageY};this.fire(&drag&,{left:g,top:d});i.fire(&drag&,{left:g,top:d,drag:this})},_end:function(){this.fire(&dragend&);i.fire(&dragend&,{drag:this})},
+_start:function(){this.fire(&dragstart&);i.fire(&dragstart&,{drag:this})}});return a},{requires:[&ua&,&node&,&base&,&dd/ddm&]});
+KISSY.add(&dd/droppable&,function(j,k,h,e){function i(){i.superclass.constructor.apply(this,arguments);this._init()}i.ATTRS={node:{setter:function(a){if(a){a=k.one(a);a.addClass(e.get(&prefixCls&)+&drop&);return a}}}};j.extend(i,h,{getNodeFromTarget:function(){return this.get(&node&)},_init:function(){e._regDrop(this)},_handleOut:function(){var a=e.get(&activeDrag&);this.get(&node&).removeClass(e.get(&prefixCls&)+&drop-over&);this.fire(&dropexit&,{drop:this,drag:a});e.fire(&dropexit&,{drop:this,drag:a});
+a.get(&node&).removeClass(e.get(&prefixCls&)+&drag-over&);a.fire(&dragexit&,{drop:this,drag:a});e.fire(&dragexit&,{drop:this,drag:a})},_handleOver:function(a){var c=e.get(&activeDrop&);e.set(&activeDrop&,this);var d=e.get(&activeDrag&);this.get(&node&).addClass(e.get(&prefixCls&)+&drop-over&);a=j.mix({drag:d,drop:this},a);if(this!=c){d.get(&node&).addClass(e.get(&prefixCls&)+&drag-over&);d.fire(&dragenter&,a);this.fire(&dropenter&,a);e.fire(&dragenter&,a);e.fire(&dropenter&,a)}else{d.fire(&dragover&,
+a);this.fire(&dropover&,a);e.fire(&dragover&,a);e.fire(&dropover&,a)}},destroy:function(){e._unregDrop(this)}});return i},{requires:[&node&,&base&,&dd/ddm&]});
+KISSY.add(&dd/proxy&,function(j){function k(){k.superclass.constructor.apply(this,arguments)}k.ATTRS={node:{value:function(h){h=j.one(h.get(&node&)[0].cloneNode(true));h.attr(&id&,j.guid(&ks-dd-proxy&));return h}},destroyOnEnd:{value:false}};j.extend(k,j.Base,{attach:function(h){var e=h.on(&dragstart&,function(){var i=e.get(&node&),a=h.get(&node&);if(!e.__proxy&&j.isFunction(i)){i=i(h);i.addClass(&ks-dd-proxy&);i.css(&position&,&absolute&);e.__proxy=i}a.parent().append(e.__proxy);e.__proxy.show();
+e.__proxy.offset(a.offset());h.set(&dragNode&,a);h.set(&node&,e.__proxy)});h.on(&dragend&,function(){var i=e.__h.get(&dragNode&).offset(i.offset());i.hide();if(e.get(&destroyOnEnd&)){i.remove();e.__proxy=null}h.set(&node&,h.get(&dragNode&))})},destroy:function(){var h=this.get(&node&);h&&!j.isFunction(h)&&h.remove()}});return k});
+KISSY.add(&dd/draggable-delegate&,function(j,k,h,e){function i(){i.superclass.constructor.apply(this,arguments)}j.extend(i,h,{_init:function(){var a=this.get(&handlers&),c=this.get(&container&);a.length==0&&a.push(this.get(&selector&));c.on(&mousedown&,this._handleMouseDown,this)},_getHandler:function(a){for(var c=this.get(&container&),d=this.get(&handlers&);a&&a[0]!==c[0];){for(var g=0;g&d.g++)if(e.test(a[0],d[g],c[0]))a=a.parent()}},_getNode:function(a){for(var c=this.get(&container&),
+d=this.get(&selector&);a&&a[0]!=c[0];){if(e.test(a[0],d,c[0]))a=a.parent()}},_handleMouseDown:function(a){var c=a.if(c=c&&this._getHandler(c))if(c=this._getNode(c)){a.preventDefault();this.set(&node&,c);this.set(&dragNode&,c);this._prepare(a)}}},{ATTRS:{container:{setter:function(a){return j.one(a)}},selector:{}}});return i},{requires:[&./ddm&,&./draggable&,&dom&]});
+KISSY.add(&dd/droppable-delegate&,function(j,k,h,e,i){function a(){a.superclass.constructor.apply(this,arguments)}j.extend(a,h,{getNodeFromTarget:function(c){c={left:c.pageX,top:c.pageY};var d=this.get(&container&),g=this.get(&selector&);d=d.all(g);for(g=0;g&d.g++){var l=new i(d[g]);if(!l.hasClass(&ks-dd-proxy&)&&k.inRegion(k.region(l),c)){this.set(&lastNode&,this.get(&node&));this.set(&node&,l);return l}}return null},_handleOut:function(){a.superclass._handleOut.call(this);this.set(&node&,
+null);this.set(&lastNode&,null)},_handleOver:function(c){var d=k.get(&activeDrop&);k.set(&activeDrop&,this);var g=k.get(&activeDrag&);this.get(&node&).addClass(k.get(&prefixCls&)+&drop-over&);c=j.mix({drag:g,drop:this},c);var l=this.get(&node&),o=this.get(&lastNode&);if(this!=d||!o||o&&o[0]!==l[0]){if(o){this.set(&node&,o);a.superclass._handleOut.call(this)}this.set(&node&,l);g.get(&node&).addClass(k.get(&prefixCls&)+&drag-over&);g.fire(&dragenter&,c);this.fire(&dropenter&,c);k.fire(&dragenter&,c);
+k.fire(&dropenter&,c)}else{g.fire(&dragover&,c);this.fire(&dropover&,c);k.fire(&dragover&,c);k.fire(&dropover&,c)}}},{ATTRS:{lastNode:{},selector:{},container:{setter:function(c){return j.one(c)}}}});return a},{requires:[&./ddm&,&./droppable&,&dom&,&node&]});
+KISSY.add(&dd/scroll&,function(j,k,h,e){function i(){i.superclass.constructor.apply(this,arguments)}i.ATTRS={node:{setter:function(a){return h.one(a)}},rate:{value:[10,10]},diff:{value:[20,20]}};j.extend(i,k,{getRegion:function(a){return!a||a==window?{width:e.viewportWidth(),height:e.viewportHeight()}:{width:a[0].offsetWidth,height:a[0].offsetHeight}},getOffset:function(a){return!a||a==window?{left:e.scrollLeft(),top:e.scrollTop()}:a.offset()},getScroll:function(a){return!a||a==window?{left:e.scrollLeft(),
+top:e.scrollTop()}:{left:a[0].scrollLeft,top:a[0].scrollTop}},setScroll:function(a,c){if(!a||a==window)window.scrollTo(c.left,c.top);else{a[0].scrollLeft=c.a[0].scrollTop=c.top}},attach:function(a){function c(){var b=d.get(&node&),f=d.getRegion(b),m=f.f=f.var n=d.getScroll(b),p=j.clone(n),s=if(q.top-f&=-l[1]){n.top+=g[1];s=true}if(q.top&=l[1]){n.top-=g[1];s=true}if(q.left-m&=-l[0]){n.left+=g[0];s=true}if(q.left&=l[0]){n.left-=g[0];s=true}if(s){d.setScroll(b,n);t=setTimeout(arguments.callee,
+100);o.fake=if(!b||b==window){n=d.getScroll(b);o.left+=n.left-p.o.top+=n.top-p.top}a.fire(&drag&,o)}else t=null}var d=this,g=d.get(&rate&),l=d.get(&diff&),o,q,t=a.on(&drag&,function(b){if(!b.fake){var f=d.get(&node&);o=b;q=j.clone(a.mousePos);b=d.getOffset(f);q.left-=b.q.top-=b.t||c()}});a.on(&dragend&,function(){clearTimeout(t);t=null})}});return i},{requires:[&base&,&node&,&dom&]});
+KISSY.add(&dd&,function(j,k,h,e,i,a,c,d){k={Draggable:h,Droppable:e,DDM:k,Proxy:i,DraggableDelegate:a,DroppableDelegate:c,Scroll:d};j.mix(j,k);return k},{requires:[&dd/ddm&,&dd/draggable&,&dd/droppable&,&dd/proxy&,&dd/draggable-delegate&,&dd/droppable-delegate&,&dd/scroll&]});
Index: uibase.js
===================================================================
--- uibase.js (revision 0)
+++ uibase.js (revision 2)
@@ -0,0 +1,1604 @@
+Copyright 2011, KISSY UI Library v1.20dev
+MIT Licensed
+build time: ${build.time}
+ * UIBase.Align
+ * @author: 承玉&&, 乔花&&
+KISSY.add('uibase/align', function(S, DOM) {
function Align() {
S.mix(Align, {
TL: 'tl',
TC: 'tc',
TR: 'tr',
CL: 'cl',
CC: 'cc',
CR: 'cr',
BL: 'bl',
BC: 'bc',
BR: 'br'
Align.ATTRS = {
node: null,
// 参考元素, falsy 值为可视区域, 'trigger' 为触发元素, 其他为指定元素
points: [AlignExt.CC, AlignExt.CC], // ['tr', 'tl'] 表示 overlay 的 tl 与参考节点的 tr 对齐
offset: [0, 0]
// 有效值为 [n, m]
* 获取 node 上的 align 对齐点 相对于页面的坐标
* @param node
* @param align
function getAlignOffset(node, align) {
var Node = S.require(&node/node&);
var V = align.charAt(0),
H = align.charAt(1),
offset, w, h, x,
if (node) {
node = Node.one(node);
offset = node.offset();
w = node[0].offsetW
h = node[0].offsetH
offset = { left: DOM.scrollLeft(), top: DOM.scrollTop() };
w = DOM['viewportWidth']();
h = DOM['viewportHeight']();
x = offset.
y = offset.
if (V === 'c') {
y += h / 2;
} else if (V === 'b') {
if (H === 'c') {
x += w / 2;
} else if (H === 'r') {
return { left: x, top: y };
Align.prototype = {
_uiSetAlign: function(v) {
if (S.isPlainObject(v)) {
this.align(v.node, v.points, v.offset);
* 对齐 Overlay 到 node 的 points 点, 偏移 offset 处
* @param {Element=} node 参照元素, 可取配置选项中的设置, 也可是一元素
* @param {Array.&string&} points 对齐方式
* @param {Array.&number&} offset 偏移
align: function(node, points, offset) {
var self = this,
//如果没有view,就是不区分mvc
el = (self.get(&view&) || self).get('el'),
offset = offset || [0,0];
xy = el.offset();
// p1 是 node 上 points[0] 的 offset
// p2 是 overlay 上 points[1] 的 offset
p1 = getAlignOffset(node, points[0]);
p2 = getAlignOffset(el, points[1]);
diff = [p2.left - p1.left, p2.top - p1.top];
xy.left - diff[0] + (+offset[0]),
xy.top - diff[1] + (+offset[1])
self.set('x', xy[0]);
self.set('y', xy[1]);
* 居中显示到可视区域, 一次性居中
center: function(node) {
this.set('align', {
node: node,
points: [Align.CC, Align.CC],
offset: [0, 0]
requires:[&dom&]
+ * @module
+ * @author
+KISSY.add('uibase/base', function (S, Base) {
var UI_SET = '_uiSet',
SRC_NODE = 'srcNode',
ATTRS = 'ATTRS',
HTML_PARSER = 'HTML_PARSER',
Node = S.require(&node/node&),
Attribute = S.require(&base/attribute&),
capitalFirst = Attribute.__capitalFirst,
noop = function() {
* UIBase for class-based component
function UIBase(config) {
Base.apply(this, arguments);
initHierarchy(this, config);
config && config.autoRender && this.render();
* 模拟多继承
* init attr using constructors ATTRS meta info
function initHierarchy(host, config) {
var c = host.
while (c) {
// 从 markup 生成相应的属性项
if (config &&
config[SRC_NODE] &&
c.HTML_PARSER) {
if ((config[SRC_NODE] = Node.one(config[SRC_NODE])))
applyParser.call(host, config[SRC_NODE], c.HTML_PARSER);
c = c.superclass && c.superclass.
callMethodByHierarchy(host, &initializer&, &constructor&);
function callMethodByHierarchy(host, mainMethod, extMethod) {
var c = host.constructor,
extChains = [],
while (c) {
// 收集扩展类
if ((exts = c.__ks_exts)) {
for (var i = 0; i & exts. i++) {
ext = exts[i];
if (ext) {
if (extMethod != &constructor&) {
//只调用真正自己构造器原型的定义,继承原型链上的不要管
if (ext.prototype.hasOwnProperty(extMethod)) {
ext = ext.prototype[extMethod];
ext && t.push(ext);
// 收集主类
// 只调用真正自己构造器原型的定义,继承原型链上的不要管 !important
//所以不用自己在 renderUI 中调用 superclass.renderUI 了,UIBase 构造器自动搜寻
if (c.prototype.hasOwnProperty(mainMethod) && (main = c.prototype[mainMethod])) {
t.push(main);
// 原地 reverse
if (t.length) {
extChains.push.apply(extChains, t.reverse());
c = c.superclass && c.superclass.
// 初始化函数
// 顺序:父类的所有扩展类函数 -& 父类对应函数 -& 子类的所有扩展函数 -& 子类对应函数
for (i = extChains.length - 1; i &= 0; i--) {
extChains[i] && extChains[i].call(host);
* 销毁组件
* 顺序:子类扩展 destructor -& 子类 destructor -& 父类扩展 destructor -& 父类 destructor
function destroyHierarchy(host) {
var c = host.constructor,
while (c) {
(d = c.prototype.destructor) && d.apply(host);
if ((exts = c.__ks_exts)) {
for (i = exts.length - 1; i &= 0; i--) {
d = exts[i] && exts[i].prototype.__
d && d.apply(host);
c = c.superclass && c.superclass.
function applyParser(srcNode, parser) {
var host = this, p,
// 从 parser 中,默默设置属性,不触发事件
for (p in parser) {
if (parser.hasOwnProperty(p)) {
v = parser[p];
if (S.isFunction(v)) {
host.__set(p, v.call(host, srcNode));
// 单选选择器
else if (S['isString'](v)) {
host.__set(p, srcNode.one(v));
// 多选选择器
else if (S.isArray(v) && v[0]) {
host.__set(p, srcNode.all(v[0]))
UIBase.HTML_PARSER = {};
UIBase.ATTRS = {
//渲染容器
valueFn:function() {
return document.
setter:function(v) {
if (S['isString'](v))
return Node.one(v);
//是否已经渲染过
rendered:{value:false}
S.extend(UIBase, Base, {
render: function() {
var self =
if (!self.get(&rendered&)) {
self._renderUI();
self.fire('renderUI');
callMethodByHierarchy(self, &renderUI&, &__renderUI&);
self.fire('afterRenderUI');
self._bindUI();
self.fire('bindUI');
callMethodByHierarchy(self, &bindUI&, &__bindUI&);
self.fire('afterBindUI');
self._syncUI();
self.fire('syncUI');
callMethodByHierarchy(self, &syncUI&, &__syncUI&);
self.fire('afterSyncUI');
self.set(&rendered&, true);
* 根据属性添加 DOM 节点
_renderUI: noop,
renderUI: noop,
* 根据属性变化设置 UI
_bindUI: function() {
var self = this,
attrs = self.__attrs,
for (attr in attrs) {
if (attrs.hasOwnProperty(attr)) {
m = UI_SET + capitalFirst(attr);
if (self[m]) {
// 自动绑定事件到对应函数
(function(attr, m) {
self.on('after' + capitalFirst(attr) + 'Change', function(ev) {
self[m](ev.newVal, ev);
})(attr, m);
bindUI: noop,
* 根据当前(初始化)状态来设置 UI
_syncUI: function() {
var self = this,
attrs = self.__getDefAttrs();
for (var a in attrs) {
if (attrs.hasOwnProperty(a)) {
var m = UI_SET + capitalFirst(a);
//存在方法,并且用户设置了初始值或者存在默认值,就同步状态
if (self[m] && self.get(a) !== undefined) {
self[m](self.get(a));
syncUI: noop,
destroy: function() {
destroyHierarchy(this);
this.fire('destroy');
this.detach();
* 根据基类以及扩展类得到新类
* @param {function} base 基类
* @param exts 扩展类
* @param {Object} px 原型 mix 对象
* @param {Object} sx 静态 mix 对象
UIBase.create = function(base, exts, px, sx) {
if (S.isArray(base)) {
base = UIB
base = base || UIB
if (S['isObject'](exts)) {
exts = [];
function C() {
UIBase.apply(this, arguments);
S.extend(C, base, px, sx);
if (exts) {
C.__ks_exts =
S.each(exts, function(ext) {
// 合并 ATTRS/HTML_PARSER 到主类
S.each([ATTRS, HTML_PARSER], function(K) {
if (ext[K]) {
C[K] = C[K] || {};
// 不覆盖主类上的定义
deepMix(C[K], ext[K]);
// 合并功能代码到主类,不覆盖
S.augment(C, ext, false);
function deepMix(r, s) {
for (var p in s) {
// 如果属性是对象,接着递归进行
if (S['isObject'](s[p]) && S['isObject'](r[p])) {
deepMix(r[p], s[p]);
} else if (!(p in r)) {
r[p] = s[p];
return UIB
requires:[&base&,&dom&,&node&]
+ * UIBase.Box
+ * @author: 承玉&&
+KISSY.add('uibase/box', function(S) {
function Box() {
Box.ATTRS = {
//其他属性
elOrder:{},
getter:function() {
return this.get(&view&)&&this.get(&view&).get(&el&);
Box.prototype = {};
+ * UIBase.Box
+ * @author: 承玉&&
+KISSY.add('uibase/boxrender', function(S, Node) {
function Box() {
S.mix(Box, {
Box.ATTRS = {
//容器元素
setter:function(v) {
var Node = S.require(&node/node&);
if (S['isString'](v))
return Node.one(v);
// 容器的 class
//容器的行内样式
elTagName:{
//生成标签名字
value:&div&
//其他属性
//插入容器位置
//0 : prepend
//1 : append
Box.construct = constructEl;
function constructEl(cls, style, width, height, tag, attrs) {
style = style || {};
if (width) {
style.width =
if (height) {
style.height =
var styleStr = '';
for (var s in style) {
if (style.hasOwnProperty(s)) {
styleStr += s + &:& + style[s] + &;&;
var attrStr = '';
for (var a in attrs) {
if (attrs.hasOwnProperty(a)) {
attrStr += & & + a + &='& + attrs[a] + &'& + & &;
var ret = &&& + tag + (styleStr ? (& style='& + styleStr + &' &) : &&)
+ attrStr + (cls ? (& class='& + cls + &' &) : &&)
Box.HTML_PARSER = {
el:function(srcNode) {
return srcN
Box.prototype = {
__renderUI:function() {
var self = this,
render = self.get(&render&),
el = self.get(&el&);
render = new Node(render);
if (!el) {
el = new Node(constructEl(self.get(&elCls&),
self.get(&elStyle&),
self.get(&width&),
self.get(&height&),
self.get(&elTagName&),
self.get(&elAttrs&)));
if (self.get(&elOrder&)) {
render.append(el);
render.prepend(el);
self.set(&el&, el);
_uiSetElAttrs:function(attrs) {
this.get(&el&).attr(attrs);
_uiSetElCls:function(cls) {
this.get(&el&).addClass(cls);
_uiSetElStyle:function(style) {
this.get(&el&).css(style);
_uiSetWidth:function(w) {
this.get(&el&).width(w);
_uiSetHeight:function(h) {
//S.log(&_uiSetHeight&);
var self =
self.get(&el&).height(h);
_uiSetHtml:function(c) {
this.get(&el&).html(c);
__destructor:function() {
//S.log(&box __destructor&);
var el = this.get(&el&);
el.detach();
el.remove();
requires:['node']
+ * close extension for kissy dialog
+ * @author: 承玉&&
+KISSY.add(&uibase/close&, function(S) {
function Close() {
Close.ATTRS = {
closable: {
// 是否需要关闭按钮
value: true,
Close.prototype = {
__bindUI:function() {
var self = this,
closeBtn = self.get(&view&).get(&closeBtn&);
closeBtn && closeBtn.on(&click&, function(ev) {
self.hide();
ev.halt();
+ * close extension for kissy dialog
+ * @author: 承玉&&
+KISSY.add(&uibase/closerender&, function(S) {
var CLS_PREFIX = 'ext-';
function Close() {
Close.ATTRS = {
closable: {
// 是否需要关闭按钮
value: true
closeBtn:{}
Close.HTML_PARSER = {
closeBtn:function(el) {
return el.one(&.& + this.get(&prefixCls&) + CLS_PREFIX + 'close');
Close.prototype = {
_uiSetClosable:function(v) {
var self = this,
closeBtn = self.get(&closeBtn&);
if (closeBtn) {
closeBtn.css(&display&, &&);
closeBtn.css(&display&, &none&);
__renderUI:function() {
var Node = S.require(&node/node&);
var self = this,
closeBtn = self.get(&closeBtn&),
el = self.get(&contentEl&);
if (!closeBtn &&
closeBtn = new Node(&&a & +
&href='#' & +
&class='& + this.get(&prefixCls&) +CLS_PREFIX + &close& + &'&& +
&&span class='& +
this.get(&prefixCls&) +CLS_PREFIX + &close-x& +
&'&X&/span&& +
.appendTo(el);
self.set(&closeBtn&, closeBtn);
__destructor:function() {
var self = this,
closeBtn = self.get(&closeBtn&);
closeBtn && closeBtn.detach();
+ * constrain extension for kissy
+ * @author: 承玉&&, 乔花&&
+KISSY.add(&uibase/constrain&, function(S, DOM) {
var Node = S.require(&node/node&);
function Constrain() {
Constrain.ATTRS = {
constrain:{
//true:viewport限制
//node:限制在节点范围
value:false
* 获取受限区域的宽高, 位置
* @return {Object | undefined} {left: 0, top: 0, maxLeft: 100, maxTop: 100}
function _getConstrainRegion(constrain) {
if (!constrain)
var el = this.get(&view&).get(&el&);
if (constrain !== true) {
constrain = Node.one(constrain);
ret = constrain.offset();
S.mix(ret, {
maxLeft: ret.left + constrain[0].offsetWidth - el[0].offsetWidth,
maxTop: ret.top + constrain[0].offsetHeight - el[0].offsetHeight
// 没有指定 constrain, 表示受限于可视区域
//不要使用 viewportWidth()
//The innerWidth attribute, on getting,
//must return the viewport width including the size of a rendered scroll bar (if any).
//On getting, the clientWidth attribute returns the viewport width
//excluding the size of a rendered scroll bar (if any)
if the element is the root element
var vWidth = document.documentElement.clientW
ret = { left: DOM.scrollLeft(), top: DOM.scrollTop() };
S.mix(ret, {
maxLeft: ret.left + vWidth - el[0].offsetWidth,
maxTop: ret.top + DOM['viewportHeight']() - el[0].offsetHeight
Constrain.prototype = {
__renderUI:function() {
//S.log(&_renderUIConstrain&);
var self = this,
attrs = self.__getDefAttrs(),
xAttr = attrs[&x&],
yAttr = attrs[&y&],
oriXSetter = xAttr[&setter&],
oriYSetter = yAttr[&setter&];
xAttr.setter = function(v) {
var r = oriXSetter && oriXSetter(v);
if (r === undefined) {
if (!self.get(&constrain&))
var _ConstrainExtRegion = _getConstrainRegion.call(
self, self.get(&constrain&));
return Math.min(Math.max(r,
_ConstrainExtRegion.left),
_ConstrainExtRegion.maxLeft);
yAttr.setter = function(v) {
var r = oriYSetter && oriYSetter(v);
if (r === undefined) {
if (!self.get(&constrain&))
var _ConstrainExtRegion = _getConstrainRegion.call(
self, self.get(&constrain&));
return Math.min(Math.max(r,
_ConstrainExtRegion.top),
_ConstrainExtRegion.maxTop);
self.addAttr(&x&, xAttr);
self.addAttr(&y&, yAttr);
requires:[&dom&,&node&]
+ * 里层包裹层定义,适合mask以及shim
+ * @author:
+KISSY.add(&uibase/contentbox&, function(S) {
function ContentBox() {
ContentBox.ATTRS = {
contentEl:{
getter:function() {
return this.get(&view&) && this.get(&view&).get(&contentEl&);
contentElAttrs:{
contentElStyle:{
contentTagName:{
ContentBox.prototype = {
return ContentB
+ * 里层包裹层定义,适合mask以及shim
+ * @author:
+KISSY.add(&uibase/contentboxrender&, function(S, Node, BoxRender) {
function ContentBox() {
ContentBox.ATTRS = {
//内容容器节点
contentEl:{},
contentElAttrs:{},
contentElStyle:{},
contentTagName:{value:&div&},
content:{}
ContentBox.HTML_PARSER = {
contentEl:function(el) {
return el.one(&.& + this.get(&prefixCls&) + &contentbox&);
var constructEl = BoxRender.
ContentBox.prototype = {
__renderUI:function() {
var self = this,
contentEl = self.get(&contentEl&),
el = self.get(&el&);
if (!contentEl) {
var elChildren = S.makeArray(el[0].childNodes);
contentEl = new Node(constructEl(this.get(&prefixCls&) + &contentbox&,
self.get(&contentElStyle&),
undefined,
undefined,
self.get(&contentTagName&),
self.get(&contentElAttrs&))).appendTo(el);
for (var i = 0; i & elChildren. i++) {
contentEl.append(elChildren[i]);
self.set(&contentEl&, contentEl);
_uiSetContentElAttrs:function(attrs) {
attrs && this.get(&contentEl&).attr(attrs);
_uiSetContentElStyle:function(v) {
v && this.get(&contentEl&).css(v);
_uiSetContent:function(c) {
if (S['isString'](c)) {
this.get(&contentEl&).html(c);
} else if (c !== undefined) {
this.get(&contentEl&).html(&&);
this.get(&contentEl&).append(c);
return ContentB
requires:[&node&,&./boxrender&]
+ * drag extension for position
+ * @author: 承玉&&
+KISSY.add(&uibase/drag&, function(S) {
function Drag() {
Drag.ATTRS = {
handlers:{value:[]},
draggable:{value:true}
Drag.prototype = {
_uiSetHandlers:function(v) {
if (v && v.length & 0 && this.__drag)
this.__drag.set(&handlers&, v);
__bindUI:function() {
var Draggable = S.require(&dd/draggable&);
var self = this,
el = self.get(&view&).get(&el&);
if (self.get(&draggable&) && Draggable)
self.__drag = new Draggable({
handlers:self.get(&handlers&)
_uiSetDraggable:function(v) {
var self = this,
d = self.__
d.detach(&drag&);
d.on(&drag&, self._dragExtAction, self);
d.detach(&drag&);
_dragExtAction:function(offset) {
this.set(&xy&, [offset.left,offset.top])
__destructor:function() {
//S.log(&DragExt __destructor&);
var d = this.__
d && d.destroy();
+ * loading mask support for overlay
+ * @author: 承玉&&
+KISSY.add(&uibase/loading&, function(S) {
function Loading() {
Loading.prototype = {
loading:function() {
this.get(&view&).loading();
unloading:function() {
this.get(&view&).unloading();
+ * loading mask support for overlay
+ * @author: 承玉&&
+KISSY.add(&uibase/loadingrender&, function(S, Node) {
function Loading() {
Loading.prototype = {
loading:function() {
var self =
if (!self._loadingExtEl) {
self._loadingExtEl = new Node(&&div & +
&class='& +
this.get(&prefixCls&) +
&ext-loading'& +
& style='position:& +
&border:& +
&width: 100%;& +
&top: 0;& +
&left: 0;& +
&z-index: 99999;& +
&height:100%;& +
&*height: expression(this.parentNode.offsetHeight);& + &'&&)
.appendTo(self.get(&el&));
self._loadingExtEl.show();
unloading:function() {
var lel = this._loadingExtEl;
lel && lel.hide();
requires:['node']
+ * mask extension for kissy
+ * @author: 承玉&&
+KISSY.add(&uibase/mask&, function(S) {
function Mask() {
Mask.ATTRS = {
value:false
Mask.prototype = {
_uiSetMask:function(v) {
var self =
self.on(&show&, self.get(&view&)._maskExtShow, self.get(&view&));
self.on(&hide&, self.get(&view&)._maskExtHide, self.get(&view&));
self.detach(&show&, self.get(&view&)._maskExtShow, self.get(&view&));
self.detach(&hide&, self.get(&view&)._maskExtHide, self.get(&view&));
+}, {requires:[&ua&]});/**
+ * mask extension for kissy
+ * @author: 承玉&&
+KISSY.add(&uibase/maskrender&, function(S) {
* 多 position 共享一个遮罩
function initMask() {
var UA = S.require(&ua&),Node = S.require(&node/node&),DOM = S.require(&dom&);
mask = new Node(&&div class='& +
this.get(&prefixCls&) + &ext-mask'&&).prependTo(document.body);
mask.css({
&position&:&absolute&,
width:UA['ie'] == 6 ? DOM['docWidth']() : &100%&,
&height&: DOM['docHeight']()
if (UA['ie'] == 6) {
mask.append(&&& + &iframe style='width:100%;& +
&height:expression(this.parentNode.offsetHeight);& +
&filter:alpha(opacity=0);& +
&z-index:-1;'&&);
function Mask() {
//S.log(&mask init&);
Mask.prototype = {
_maskExtShow:function() {
if (!mask) {
initMask.call(this);
mask.css({
&z-index&:this.get(&zIndex&) - 1
mask.css(&display&, &&);
_maskExtHide:function() {
if (num &= 0) num = 0;
mask && mask.css(&display&, &none&);
+}, {requires:[&ua&]});/**
+ * position and visible extension,可定位的隐藏层
+ * @author: 承玉&&
+KISSY.add(&uibase/position&, function(S, DOM, Event) {
var doc = document ,
KEYDOWN = &keydown&;
function Position() {
Position.ATTRS = {
view:true,
// 水平方向绝对位置
valueFn:function() {
//初始化 xy,结果调用了 set(&x&) 里面又调用了 get(&x&)
//这时还没有渲染,尚没有 view,必须判断
return this.get(&view&) && this.get(&view&).get(&x&);
view:true,
// 垂直方向绝对位置
// 水平方向绝对位置
valueFn:function() {
return this.get(&view&) && this.get(&view&).get(&y&);
// 相对 page 定位, 有效值为 [n, m], 为 null 时, 选 align 设置
setter: function(v) {
var self = this,
xy = S.makeArray(v);
属性内分发特别注意:
if (xy.length) {
xy[0] && self.set(&x&, xy[0]);
xy[1] && self.set(&y&, xy[1]);
* xy 纯中转作用
getter:function() {
return [this.get(&x&),this.get(&y&)];
visible:{}
Position.prototype = {
_uiSetVisible:function(isVisible) {
var self =
this.get(&view&).set(&visible&, isVisible);
self[isVisible ? &_bindKey& : &_unbindKey& ]();
self.fire(isVisible ? &show& : &hide&);
* 显示/隐藏时绑定的事件
_bindKey: function() {
Event.on(doc, KEYDOWN, this._esc, this);
_unbindKey: function() {
Event.remove(doc, KEYDOWN, this._esc, this);
_esc: function(e) {
if (e.keyCode === 27) this.hide();
* 移动到绝对位置上, move(x, y) or move(x) or move([x, y])
* @param {number|Array.&number&} x
* @param {number=} y
move: function(x, y) {
var self =
if (S.isArray(x)) {
self.set(&xy&, [x,y]);
* 显示 Overlay
show: function() {
this.render();
this.set(&visible&, true);
hide: function() {
this.set(&visible&, false);
requires:[&dom&,&event&]
+ * position and visible extension,可定位的隐藏层
+ * @author: 承玉&&
+KISSY.add(&uibase/positionrender&, function() {
function Position() {
Position.ATTRS = {
// 水平方向绝对位置
valueFn:function() {
return this.get(&el&) && this.get(&el&).offset().
// 垂直方向绝对位置
valueFn:function() {
return this.get(&el&) && this.get(&el&).offset().
value: 9999
visible:{}
Position.prototype = {
__renderUI:function() {
var el = this.get(&el&);
el.addClass(this.get(&prefixCls&) + &ext-position&);
display: &&,
left:-9999,
top:-9999,
bottom:&&,
_uiSetZIndex:function(x) {
this.get(&el&).css(&z-index&, x);
_uiSetX:function(x) {
this.get(&el&).offset({
_uiSetY:function(y) {
this.get(&el&).offset({
_uiSetVisible:function(isVisible) {
this.get(&el&).css(&visibility&, isVisible ? &visible& : &hidden&);
show:function() {
this.render();
this.set(&visible&, true);
hide:function() {
this.set(&visible&, false);
+});KISSY.add(&uibase/resize&, function(S) {
function Resize() {
Resize.ATTRS = {
Resize.prototype = {
__destructor:function() {
self.resizer && self.resizer.destroy();
_uiSetResize:function(v) {
var Resizable = S.require(&resizable&),self =
if (Resizable) {
self.resizer && self.resizer.destroy();
v.node = self.get(&view&).get(&el&);
v.autoRender =
if (v.handlers) {
self.resizer = new Resizable(v);
+ * shim for ie6 ,require box-ext
+ * @author: 承玉&&
+KISSY.add(&uibase/shimrender&, function(S) {
function Shim() {
//S.log(&shim init&);
Shim.ATTRS = {
value:true
Shim.prototype = {
_uiSetShim:function(v) {
var Node = S.require(&node/node&);
var self = this,el = self.get(&el&);
if (v && !self.__shimEl) {
self.__shimEl = new Node(&&& + &iframe style='position:& +
&border:& +
&width: expression(this.parentNode.offsetWidth);& +
&top: 0;& +
&opacity: 0;& +
&filter: alpha(opacity=0);& +
&left: 0;& +
&z-index: -1;& +
&height: expression(this.parentNode.offsetHeight);& + &'&&);
el.prepend(self.__shimEl);
} else if (!v && self.__shimEl) {
self.__shimEl.remove();
delete self.__shimEl;
+ * support standard mod for component
+ * @author: 承玉&&
+KISSY.add(&uibase/stdmod&, function(S) {
function StdMod() {
StdMod.ATTRS = {
getter:function() {
return this.get(&view&) && this.get(&view&).get(&header&);
getter:function() {
return this.get(&view&) && this.get(&view&).get(&body&);
getter:function() {
return this.get(&view&) && this.get(&view&).get(&footer&);
bodyStyle:{
footerStyle:{
headerStyle:{
headerContent:{
bodyContent:{
footerContent:{
StdMod.prototype = {};
return StdM
+ * support standard mod for component
+ * @author: 承玉&&
+KISSY.add(&uibase/stdmodrender&, function(S, Node, undefined) {
var CLS_PREFIX = &stdmod-&;
function StdMod() {
StdMod.ATTRS = {
bodyStyle:{
footerStyle:{
headerStyle:{
headerContent:{},
bodyContent:{},
footerContent:{}
StdMod.HTML_PARSER = {
header:function(el) {
return el.one(&.& + this.get(&prefixCls&) + CLS_PREFIX + &header&);
body:function(el) {
return el.one(&.& + this.get(&prefixCls&) + CLS_PREFIX + &body&);
footer:function(el) {
return el.one(&.& + this.get(&prefixCls&) + CLS_PREFIX + &footer&);
function renderUI(self, part) {
var el = self.get(&contentEl&),
partEl = self.get(part);
if (!partEl) {
partEl = new Node(&&div class='& + self.get(&prefixCls&) +CLS_PREFIX + part + &'&&)
.appendTo(el);
self.set(part, partEl);
StdMod.prototype = {
_setStdModContent:function(part, v) {
if (S['isString'](v)) {
this.get(part).html(v);
this.get(part).html(&&);
this.get(part).append(v);
_uiSetBodyStyle:function(v) {
this.get(&body&).css(v);
_uiSetHeaderStyle:function(v) {
this.get(&header&).css(v);
_uiSetFooterStyle:function(v) {
this.get(&footer&).css(v);
_uiSetBodyContent:function(v) {
this._setStdModContent(&body&, v);
_uiSetHeaderContent:function(v) {
this._setStdModContent(&header&, v);
_uiSetFooterContent:function(v) {
this._setStdModContent(&footer&, v);
__renderUI:function() {
renderUI(this, &header&);
renderUI(this, &body&);
renderUI(this, &footer&);
return StdM
requires:['node']
+});KISSY.add(&uibase&, function(S, UIBase, Align, Box, BoxRender, Close, CloseRender, Contrain, Contentbox, ContentboxRender, Drag, Loading, LoadingRender, Mask, MaskRender, Position, PositionRender, ShimRender, Resize, StdMod, StdModRender) {
Close.Render = CloseR
Loading.Render = LoadingR
Mask.Render = MaskR
Position.Render = PositionR
StdMod.Render = StdModR
Box.Render = BoxR
Contentbox.Render = ContentboxR
S.mix(UIBase, {
Align:Align,
Close:Close,
Contrain:Contrain,
Contentbox:Contentbox,
Drag:Drag,
Loading:Loading,
Mask:Mask,
Position:Position,
Render:ShimRender
Resize:Resize,
StdMod:StdMod
S.UIBase = UIB
return UIB
requires:[&uibase/base&,
&uibase/align&,
&uibase/box&,
&uibase/boxrender&,
&uibase/close&,
&uibase/closerender&,
&uibase/constrain&,
&uibase/contentbox&,
&uibase/contentboxrender&,
&uibase/drag&,
&uibase/loading&,
&uibase/loadingrender&,
&uibase/mask&,
&uibase/maskrender&,
&uibase/position&,
&uibase/positionrender&,
&uibase/shimrender&,
&uibase/resize&,
&uibase/stdmod&,
&uibase/stdmodrender&]
Index: demo/test.html
===================================================================
--- demo/test.html (revision 0)
+++ demo/test.html (revision 2)
@@ -0,0 +1,437 @@
+&!doctype html&
+&meta charset=&utf-8&/&
+&title&KISSY Editor Test&/title&
+&link href=&../editor/theme/base-min.css& rel=&stylesheet&/&
+&!--[if lt IE 8]&
+&link href=&../editor/theme/cool/editor-pkg-sprite-min.css& rel=&stylesheet&/&
+&![endif]--&
+&!--[if gte IE 8]&&!--&
+&link href=&../editor/theme/cool/editor-pkg-min-datauri.css& rel=&stylesheet&/&
+&!--&![endif]--&
+&h1&KISSY Editor Demo&/h1&
+&div style=&width: 90%; margin: 0 auto&&
&label for=&editor&&Editor Instance 1:&/label&
&button id='destroy1'&destroy实例&/button&
&button id='recover1'&重建实例&/button&
&textarea id=&editor& tabindex=&1& style=&width:100%;height:400margin:0&&
&script&alert(1);&/script&
我是虾米音乐
&embed height=&33& width=&257& allowscriptaccess=&never&
src=&/widget/6480/singlePlayer.swf&
title=&Can't+Compare&
type=&application/x-shockwave-flash&
wmode=&transparent&/&
&p&我是音乐:&/p&
&object height=&37&
width=&165&
codebase=&/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0&
classid=&clsid:D27CDB6E-AE6D-11cf-96B8-&&
value=&../src/plugins/music/niftyplayer.swf?file=../src/plugins/music/betty.mp3&
name=&movie&/&
&param value=&high& name=&quality&/&
&param name=&wmode& value=&transparent&/&
&param value=&#FFFFFF& name=&bgcolor&/&
&embed height=&37&
wmode=&transparent&
width=&165&
pluginspage=&/go/getflashplayer&
swliveconnect=&true&
type=&application/x-shockwave-flash&
bgcolor=&#FFFFFF&
quality=&high&
src=&../src/plugins/music/niftyplayer.swf?file=../src/plugins/music/betty.mp3&&
&p& 1 2 3 4 5 6 7 78 &a href=&&&我是google&/a& 1 1 1 &/p&
&p&我是段落 &span style=&background-color:&& 我是段落 我是段落 &/span& 我是段落 &img src=&/tps/i5/T117hGXndsXXXXXXXX-15-13.gif&& 我是段落 我是段落 &/p&
&p& 我是段落 我是段落 &br&&/p&
&p&我是图片 &img style=&width: 470 height: 150&
src=&/tps/i2/T1xjtKXmtrXXXXXXXX-470-150.jpg&
alt=&&&&/p&
&p&我是视频优酷&/p&
&object classid=&clsid:d27cdb6e-ae6d-11cf-96b8-& codebase=&/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0& height=&400& width=&480&&
&param name=&quality& value=&high&/&
&param name=&wmode& value=&transparent&/&
&param name=&movie& value=&/player.php/sid/XMjA0MTgwMjIw/v.swf&/&
&embed height=&400&
wmode=&transparent&
pluginspage=&/go/getflashplayer& quality=&high& src=&/player.php/sid/XMjA0MTgwMjIw/v.swf& type=&application/x-shockwave-flash& width=&480&/&
&p&我是表格,支持右键&/p&
&table style=&width: 200& border=&1& cellpadding=&1& cellspacing=&1&&
&td&1&/td&
&td&2&/td&
&td&3 &span&3.1&/span& 3.2 &span&3.3&/span&&/td&
&td&4&/td&
&td&5&/td&
&td&6&/td&
&p&我是段落 &span style=&background-color:&& 我是段落 我是段落 &/span& 我是段落 &img src=&/tps/i5/T117hGXndsXXXXXXXX-15-13.gif&& 我是段落 我是段落 &/p&
&p& 我是段落 我是段落 &br&&/p&
&p&我是flash:&/p&
&object class=&holiday-logo&
classid=&clsid:D27CDB6E-AE6D-11cf-96B8-&
height=&68& width=&300&&
&param name=&movie&
value=&/tps/i1/T12MVIXfVNXXXXXXXX.swf&/&
&param name=&wmode& value=&transparent&/&
&object class=&holiday-logo&
data=&/tps/i1/T12MVIXfVNXXXXXXXX.swf&
height=&68& name=&holiday-logo&
type=&application/x-shockwave-flash&
width=&300&&
&param name=&wmode&
value=&transparent&/&
&a href=&/&
style=&height: 43 margin-left: 56& target=&_top&&
&img alt=&淘宝网& height=&110& src=&/&
title=& - 阿里巴巴旗下网站& width=&167&/&
&li& 我是列表1&/li&
&li& 我是列表2
&li&&p&我是列表2.1&/p&&/li&
&li& 我是列表2.2&/li&
&li& 我是列表2.3&/li&
&li& 我是列表3&/li&
&li& 我是列表1&/li&
&li& 我是列表2
&li&&p&我是列表2.1&/p&&/li&
&li& 我是列表2.2&/li&
&li& 我是列表2.3&/li&
&li&&p&我是列表3&/p&&/li&
&/textarea&
+&div style=&width: 60%; margin: 50px auto&&
&label for=&editor2&&Editor Instance 2:&/label&
&textarea id=&editor2& style=&width:100%;height:400margin:0&&&/textarea&
+&script src=&../kissy-min.js&&&/script&
+&script src=&../uibase-min.js&&&/script&
+&script src=&../dd-min.js&&&/script&
+&script src=&../component-min.js&&&/script&
+&script src=&../overlay-min.js&&&/script&
+&script src=&../editor/editor-all-pkg-min.js?t=a&&&/script&
+&script src=&../editor/biz/ext/editor-plugin-pkg-min.js?t=a&&&/script&
+KISSY.ready(function(S) {
// just for test
S.use('editor', function() {
var KE = S.E
//编辑器内弹窗 z-index 底限,防止互相覆盖
KE.Config.baseZIndex = 10000;
var cfg = {
attachForm:true,
baseZIndex:10000,
//自定义样式
//customStyle:&p{color:}&,
//自定义外部样式
//customLink:[&http://localhost/customLink.css&,&http://xx.com/y2.css&],
//是否一开始自动聚焦
//focus:true,
pluginConfig: {
serverUrl:&/code/upload/web/upload.jsp&,
serverParams:{
waterMark:function() {
return S.one(&#ke_img_up_watermark_1&)[0].
surfix:&png,jpg,jpeg,gif&,
fileInput:&Filedata&,
sizeLimit:1000,//k
extraHtml:&&p style='margin-top:10'&&input type='checkbox' id='ke_img_up_watermark_1' checked='checked'& 图片加水印,防止别人盗用&/p&&
defaultWidth:&300&,
defaultHeight:&300&
&templates&: [
demo: &模板1效果演示html&
html: &&div style='border:1px solid red'&模板1效果演示html&/div&&p&&/p&&
demo: &模板2效果演示html&,
html: &&div style='border:1px solid red'&模板2效果演示html&/div&&
&font-size&:{
value:&14px&,
style:'position: border: 1px solid #DDDDDD; margin: 2 padding: 2'
& &span style='font-size:14px'&标准&/span&& +
&&span style='position:top:1right:3'&14px&/span&&
value:&16px&,
style:'position: border: 1px solid #DDDDDD; margin: 2 padding: 2'
& &span style='font-size:16px'&大&/span&& +
&&span style='position:top:1right:3'&16px&/span&&
value:&18px&,
style:'position: border: 1px solid #DDDDDD; margin: 2 padding: 2'
& &span style='font-size:18px'&特大&/span&& +
&&span style='position:top:1right:3'&18px&/span&&
value:&20px&,
style:'position: border: 1px solid #DDDDDD; margin: 2 padding: 2'
& &span style='font-size:20px'&极大&/span&& +
&&span style='position:top:1right:3'&20px&/span&&
width:&115px&
//&font-family&:false,
//&font-bold&:false,
// &font-italic&:false,
//&font-underline&:false,
//&font-strikeThrough&:false,
&multi-upload&:{
serverUrl:&/code/upload/upload.jsp&,
serverParams:{
waterMark:function() {
return S.one(&#ke_img_up_watermark_2&)[0].
//previewSuffix:&_60x60&,
previewWidth:&80px&,
sizeLimit:1000//k,
,numberLimit:15,
extraHtml:&&p style='margin-top:10'&& +
&&input type='checkbox' & +
&style='vertical-align:margin:0 5' & +
&id='ke_img_up_watermark_2'&& +
&&span style='vertical-align:'&图片加水印,防止别人盗用&/span&&/p&&
reg:/tudou\.com/i,
url:&http://bangpai.daily.taobao.net/json/getTudouVideo.htm?& +
&url=@url@&callback=@callback@&//&&rand=@rand@&
providers:[
reg:/youku\.com/i,
width:480,
height:400,
detect:function(url) {
var m = url.match(/id_([^.]+)\.html$/);
return &/player.php/sid/& + m[1] + &/v.swf&;
m = url.match(/v_playlist\/([^.]+)\.html$/);
//return &/player.php/sid/& + m[1] + &/v.swf&;
reg:/tudou\.com/i,
width:480,
height:400,
detect:function(url) {
reg:/ku6\.com/i,
width:480,
height:400,
detect:function(url) {
var m = url.match(/show[^\/]*\/([^.]+)\.html$/);
return &/refer/& + m[1] + &/v.swf&;
reg:/taobaocdn\.com/i,
width:480,
height:400,
detect:function(url) {
reg:/taobaocdn\.com/i,
width:480,
height:400,
detect:function(url) {
//必须和网址url同域而不是类库同域
musicPlayer:KE.Config.base + &music/niftyplayer.swf&
interval:5,
&style='width:200'&& +
&&div style='padding:5'&草稿箱能够自动保存您最新编辑的内容,& +
&如果发现内容丢失,& +
&请选择恢复编辑历史&/div&&/div&&
&resize&:{
direction:[&y&]
dragupload:{
surfix:&png,jpg,jpeg,gif&,
fileInput:&Filedata&,
sizeLimit:1000,
serverUrl:&/code/upload/web/upload.jsp&,
serverParams:{
waterMark:function() {
function test() {
window.editor2 = KE(&#editor&, S.clone(cfg)).use(&elementpaths,& +
&sourcearea,preview,& +
&checkbox-sourcearea,& +
&templates,separator,& +
&undo,separator,& +
&removeformat,font,forma

我要回帖

更多关于 jquery 遍历数组 的文章

 

随机推荐