02 28 2010
MooTools Events Calendar 带事件的日历控件

- MooTools 1.2.3 Core
-
MooTools 1.2.3.1 More
- Tips
- Scroller
- Date
这是很好的一款事件日历插件,可以作为日程使用,正在做它的应用。
只需要声明:
new Calendar({calContainer:'calBody'});
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 16 2009
想做SEO,先来摸清baidu和google的脉搏
本文介绍Google和百度两大搜索引擎的网页收录习惯、网页排名习惯等,帮助站长合理优化自己的网页,达到Google百度两面笑的目的。
Google搜索引擎习惯
Google作为全球最大的多语言搜索引擎在发展历史过程中形成了自己的网页收录习惯,也建立起自己的一套标准。研究Goolge收录网页的习惯有利于更好迎合Google搜索引擎的口味,达到提高网页收录量和收录排名的目的。
我们暂且不研究Google对其他语言的收录,就汉语而言,Google收录有以下特点:
1、敏感度较高,反应较快
Google对新建的网站具有较高的查知性,当然,新建的网站必须要有外部链接或者向Google递交过网站登录信息。否则,即使 Google的搜索技术再厉害,一个只有站长一个人看得见的网站是很难被Google发现的。Google收录新建网站的两个途 径是:第一,通过网站的外部链接;第二,通过向Google提交网站登录数据。一般而言,后者的收录速度相对较快,而前者则要视 Google对新建网站的外部链接网站的收录频率而定。如果Google对外部链接网站的评价高、收录频率高那么其发现新站的速度也相应 地高,新建网站被收录的日期就会被提前。
2、并重相关性和重要性
Google 使用 PageRank 技术检查整个网络链接结构,并确定哪些网页重要性最高。然后进行超文本匹配分析,以确定哪些网页与正在执行的特定搜索相关。在综合考虑整体重要性以及与特 定查询的相关性之后,Google 才将最相关最可靠的搜索结果放在首位。这也是Google收录网页的特点之一。
3、变化较快、机动性较高
Google 漫游器会定期抓取 Web,将大量网页列入索引。稍后完成的下一次抓取会注意到新网站、对现有网站的更改以及失效的链接,并对内容的变化在搜索结果中加以调整。
4、较重视链接的文字描述
Google会将链接的文字描述作为关键词加以索引,所以我们在作友情链接时千万要仔细设计链接的文字描述,使之既符合网站的定位又不失相关性,以此博得Google的信任。
5、较重视网页标记的描述
大多数时候Google显示搜索结果时会把网页的Deion显示出来,并占有较重的篇幅。
Google使用的技术:
PageRank 技术:PageRank 能够对网页的重要性做出客观的评价。PageRank 并不计算直接链接的数量,而是将从网页 A 指向网页 B 的链接解释为由网页 A 对网页B 所投的一票。这样,PageRank 会根据网页 B 所收到的投票数量来评估该页的重要性。
超文本匹配分析:Google 的搜索引擎同时也分析网页内容。然而,Google 的技术并不采用单纯扫描基于网页的文本(网站发布商可以通过元标记控制这类文本)的方式,而是分析网页的全部内容以及字体、分区及每个文字精确位置等因 素。Google 同时还会分析相邻网页的内容,以确保返回与用户查询最相关的结果。
百度搜索引擎收录习惯
百度是全球最大的中文搜索引擎,对中文网页的搜索技术在某种程度上领先于Google,百度在某些方面与Google有相同或相似之处外它还有以下特点:
1、较重视第一次收录印象
网站给百度的第一印象比较重要,相对Google而言,百度搜索引擎的人为参与度较高,也就是说在某些层面上可能由人来决定是否收录网页而不是 由机器来决定。所以,网站在登录百度搜索引擎之前最好把内容做得丰富点、原创内容多一点、网页关键词与内容的相关度高一点,这样才能给百度较好的初次印 象。
2、对网页的更新较敏感
百度对网页的更新相对Google而言更加敏感,可能这与百度的本土性格有关。百度搜索引擎每周更新,网页视重要性有不同的更新率,频率在几天至一月之间。所以在百度的搜索结果中基本上都标明了收录时间。
3、较重视首页
百度对首页的重视程度要比Google高得多,这与上面提到的“较重视第一次收录印象”一脉相承。百度在显示搜索结果时也常常把网站首页显示出来,而不具体到某个内容页(当其认为不够重要时)。相对而言,其用户体验打了折扣,而增加了其“百度快照”的用户量。
4、较重视绝对地址的链接
百度在收录网页时比较重视绝对地址的收录,百度提供的网页快照功能也没有解析相对地址的绝对路径,不知这是百度技术的疏忽还是其偏好的一大体现。
5、较重视收录日期
百度对网页的收录日期非常看重,也是其搜索结果排名的参考点,被收录得越早排名会较高,有时甚至不考虑相关性地把它认为比较重要的内容放在首位,而点击进入之后才发现是早已过时的信息或者垃圾信息。这是百度需要改进的技术。
百度使用的技术:
百度使用以下技术:“一种互联网上镜像和准镜像网站的识别方法”,这个方法解决了搜索引擎对雷同信息的重复获取,节省网络资源和本地资源,提高系统 服务的质量和效率;“一种基于词汇的计算机索引和检索方法”,该方法对一段连续的文字信息,经过词汇分析处理后,通过添加隐形词汇的手段,实现对基于词汇 索引和检索系统的检索质量提升,使用户获得更加准确的检索结果;“一种使用快照的方式实现对网上信息进行记录和分析的方法”,该方法是通过对互联网上一个 特定信息,多次进行快照的方式,将信息当时的状态进行保留。并通过对一系列快照信息的分析,得到有效数据,方便地得到网上信息的变动情况。
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写的俄罗斯方块
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;
- }
- });