03 24 2009
mootools的inline编辑
大家可能都见过这种效果,一点击网页中的特定文字,同时就进入编辑状态当编辑完成后。又把编辑后的文字保存到数据库中了。
我使用mootools来实现本次效果。
首先定义javasctipt函数
- function inlineEdit(el,u,id){
- var editing;
- el.addEvent('dblclick',function(){
- if(editing) return;
- editing = true;
- var before = el.get('html').trim();
- el.set('html','');
- var input = new Element('input', { 'value':before });
- input.setStyle('width','95%');
- input.addEvent('keydown', function(e) { if(e.key == 'enter') { this.fireEvent('blur'); } });
- input.inject(el).select();
- input.addEvent('blur', function() {
- val = input.get('value').trim();
- var name = el.get('rel');
- if(before != val){
- new Request({
- url:u,
- onSuccess: function(){el.set('text',val);},
- onFailure: function(){el.set('text',before);}
- }).send("id="+id+"&"+name+"="+val+"&colname="+name);
- }else{el.set('text',val);}
- editing = false;
- });
- });
- }
- window.addEvent('domready', function(){
- $$('.editable').each(function(el){
- inlineEdit(el,APP+'/User/update',$('uid').get('value'));
- });
- });
然后是html
- <tr>
- <td class="cellLabel" align="right" width="20%" >用户名:td>
- <td class="cellInfo" align="left" width="30%" >{$vo.account}td>
- <td class="cellLabel" align="right" width="20%" >昵称:td>
- <td class="cellInfo editable" align="left" width="30%" rel="nickname" >{$vo.nickname}td>
- tr>
- <tr>
- <td class="cellLabel" align="right" >状态:td>
- <td class="cellInfo"><select class="small bLeft" name="status">
- <option <eq name="vo.status" value="1" >selectedeq> value="1">启用option>
- <option <eq name="vo.status" value="0" >selectedeq> value="0">禁用option>
- select>td>
- <td class="cellLabel" align="right" >备注:td>
- <td class="cellInfo editable" align="left" rel="remark" >{$vo.remark}td>
- tr>
我使用的是ThinkPHP和MySQL
- public function update(){
- $colname = $_POST['colname'];
- if($colname){
- $dao = D('User');
- $data['id'] = $_POST['id'];
- $data[$colname] = $_POST[$colname];
- $dao->save($data);
- }else{
- parent::update();
- }
- }
完成了!所有的请求都是AJAX完成的。这里我就不再上传DEMO了。
给大家一张截图吧,有兴趣的朋友可以试试呀。
.png)
03 13 2009
mootools UI mochaui感觉更强大了
03 13 2009
mootools 1.2的新特性之一 Element Storage
直接存储属性
store可以给element存储客户自定义的属性,再通过retrieve返回属性值。
- var element = $('myElement');
- element.store('effectInstance', new Fx.Tween(element, 'color'));
- element.store('customProperty', 'someProperty');
- element.retrieve('effectInstance'); //the Fx.Tween instance
- element.retrieve('customProperty'); //'someProperty'
03 13 2009
一个用mootools写的俄罗斯方块
03 06 2009
ThinkPHP分页的Slider效果
用过ThinkPHP框架中有个Page类,可以帮助大家无忧的显示分页效果。
也可以自定义分页效果。这里有就不多讲了。
利用mootools框架,在分页时展示slider效果。可以参考本站最后的Slider分页效果。
thinkPHP的代码是
- $p = new Page($count,$listRows);
- .....
- $this->assign("nowPage", $p->nowPage);
- $this->assign("totalPages", $p->totalPages);
- window.addEvent('domready', function() {
- var page=$('nowPage').get('text').toInt()-1;
- new Slider('slider','knob',{
- wheel:false,
- steps:$('totalPages').get('text').toInt()-1,
- onChange:function(step){
- $('nowPage').set('text',step+1)
- },
- onComplete:function(step){
- if(step!=page){
- var p = step.toInt()+1;
- url=ACTION+'?p='+p;
- window.location.href=url;
- }
- }
- }).set(page);
- });
- <div id="slider" class="slider">
- <div id="knob" class="knob" style="position: relative; left: 0px;">div>
- div>
- <span style="float:left;height:22px;">Page <span id="nowPage" style="font-weight:bold;">{$nowPage}span> of <span id="totalPages">{$totalPages}span>span>
拖动knob在slider中滑动,就可以分页了。
02 25 2009
SimpleTabs的改进
我在使用mootools框架的同时,一直在找一个tabs的实例,最近找到一个SimpleTabs( digitarald.de/project/simple-tabs/1-0/showcase/tabbed/),可是使用过程中发现对IE的支持并不是很完美。表现在,等浏览器载入tabs后会有一个闪动。我做了些改动,消除了这个影响。并增加了一个皮肤。大家试试看了。
站内有一个实例:Categories 和 tags 的分页
- var SimpleTabs = new Class({
- Implements: [Events, Options],
- /**
- * Options
- */
- options: {
- show: 0,
- selector: '.tab-tab',
- classWrapper: 'tab-wrapper',
- classMenu: 'tab-menu',
- classContainer: 'tab-container',
- onSelect: function(toggle, container, index) {
- toggle.addClass('tab-selected');
- container.setStyle('display', '');
- },
- onDeselect: function(toggle, container, index) {
- toggle.removeClass('tab-selected');
- container.setStyle('display', 'none');
- },
- onRequest: function(toggle, container, index) {
- container.addClass('tab-ajax-loading');
- },
- onComplete: function(toggle, container, index) {
- container.removeClass('tab-ajax-loading');
- },
- onFailure: function(toggle, container, index) {
- container.removeClass('tab-ajax-loading');
- },
- onAdded: Class.empty,
- getContent: null,
- ajaxOptions: {},
- cache: true
- },
- /**
- * Constructor
- *
- * @param {Element} The parent Element that holds the tab elements
- * @param {Object} Options
- */
- initialize: function(element, options) {
- this.element = $(element);
- this.setOptions(options);
- this.selected = null;
- this.build();
- },
- build: function() {
- this.tabs = [];
- this.menu = new Element('ul', {'class': this.options.classMenu});
- this.wrapper = new Element('div', {'class': this.options.classWrapper});
- this.element.getElements(this.options.selector).each(function(el) {
- var content = el.get('href') || (this.options.getContent ? this.options.getContent.call(this, el) : el.getNext());
- this.addTab(el.innerHTML, el.title || el.innerHTML, content);
- }, this);
- this.element.empty().adopt(this.menu, this.wrapper);
- if (this.tabs.length) this.select(this.options.show);
- },
- /**
- * Add a new tab at the end of the tab menu
- *
- * @param {String} inner Text
- * @param {String} Title
- * @param {Element|String} Content Element or URL for Ajax
- */
- addTab: function(text, title, content) {
- var grab = $(content);
- var container = (grab || new Element('div'))
- .setStyle('display', 'none')
- .addClass(this.options.classContainer)
- .inject(this.wrapper);
- var pos = this.tabs.length;
- var evt = (this.options.hover) ? 'mouseenter' : 'click';
- var tab = {
- container: container,
- toggle: new Element('li', {'class': 'tab-tab'}).grab(new Element('a', {
- href: '#',
- title: title
- }).grab(
- new Element('span', {html: text})
- )).addEvent(evt, this.onClick.bindWithEvent(this, [pos])).inject(this.menu)
- };
- if (!grab && $type(content) == 'string') tab.url = content;
- this.tabs.push(tab);
- return this.fireEvent('onAdded', [tab.toggle, tab.container, pos]);
- },
- onClick: function(evt, index) {
- evt = new Event(evt).stop();
- this.select(index);
- return false;
- },
- /**
- * Select the tab via tab-index
- *
- * @param {Number} Tab-index
- */
- select: function(index) {
- if (this.selected === index || !this.tabs[index]) return this;
- if (this.ajax) this.ajax.cancel().removeEvents();
- var tab = this.tabs[index];
- var params = [tab.toggle, tab.container, index];
- if (this.selected !== null) {
- var current = this.tabs[this.selected];
- if (this.ajax && this.ajax.running) this.ajax.cancel();
- params.extend([current.toggle, current.container, this.selected]);
- this.fireEvent('onDeselect', [current.toggle, current.container, this.selected]);
- }
- this.fireEvent('onSelect', params);
- if (tab.url && (!tab.loaded || !this.options.cache)) {
- this.ajax = this.ajax || new Request.HTML();
- this.ajax.setOptions({
- url: tab.url,
- method: 'get',
- update: tab.container,
- onFailure: this.fireEvent.pass(['onFailure', params], this),
- onComplete: function(resp) {
- tab.loaded = true;
- this.fireEvent('onComplete', params);
- }.bind(this)
- }).setOptions(this.options.ajaxOptions);
- this.ajax.send();
- this.fireEvent('onRequest', params);
- }
- this.selected = index;
- return this;
- }
- });