存档

‘专题’ 分类的存档

jqGrid 3.6.2版中grid.subgrid.js文件95行存在bug

2009年12月24日 IT北瓜 1 条评论

jqGrid做得越来越强大了,并且完全结合了jQuery UI的界面,界面也很漂亮!最近正在做的一个项目中使用了这款表格插件!

今天再做subGrid的时候设置subgridtype为function,结果发现subGrid中的数据死活不出来,甚至url请求也并没有执行。在后发现grid.subgrid.js在对subgridtype进行判断的时候存在,具体位置在grid.subgrid.js文件95行,该行代码为:

ts.p.subgridtype = ts.p.subgridtype.toLowerCase();

当subgridtype为function的时候subgridtype不具备toLowerCase()方法,所以代码会终止执行。

解决方法:修改代码如下

第一步:

96行源代码:if($.isFunction(ts.p.subgridtype)) {ts.p.subgridtype(dp);}

改为:if($.isFunction(ts.p.subgridtype)) {ts.p.subgridtype(dp);}else{

第二步:

将95行的代码:ts.p.subgridtype = ts.p.subgridtype.toLowerCase();

放到97行代码:switch(ts.p.subgridtype) {

之前

第三步:

在115与116行之间加一个右大括号}这样就可以了。

分类: jQuery, jqGrid, 专题, 应用实例 标签:

jQuery学习笔记8——jQuery性能优化指南【转】

2009年11月12日 IT北瓜 没有评论

现在jquery应用的越来越多, 有些同学在享受爽快淋漓coding时就将性能问题忽略了,  比如我.  jquery虽在诸多的js类库中性能表现还算优秀, 但毕竟不是在用原生的javascript开发, 性能问题还是需要引起重视的. 在twitter上发现了<jQuery Performance Rules>这篇文章, 简单的摘译了一下:

  1. 总是从ID选择器开始继承
  2. 在class前使用tag
  3. 将jquery对象缓存起来
  4. 掌握强大的链式操作
  5. 使用子查询
  6. 对直接的DOM操作进行限制
  7. 冒泡
  8. 消除无效查询
  9. 推迟到 $(window).load
  10. 压缩js
  11. 全面掌握jquery库
1. 总是从ID选择器开始继承

在jquery中最快的选择器是ID选择器。因为它直接来自于Javascript的getElementById()方法.

<div id="content">
    <form method="post" action="/">
        <h2>Traffic Light</h2>
        <ul id="traffic_light">
            <li><input type="radio" class="on" name="light" value="red" /> Red</li>
            <li><input type="radio" class="off" name="light" value="yellow" /> Yellow</li>
            <li><input type="radio" class="off" name="light" value="green" /> Green</li>
        </ul>
        <input class="button" id="traffic_button" type="submit" value="Go" />
    </form>
</div>

像这样选择按钮是低效的:

var traffic_button = $('#content .button');

用ID直接选择按钮效率更高:

var traffic_button = $('#traffic_button');
选择多个元素

提到多元素选择其实是在说DOM遍历和循环,这些都是比较慢的东西。为了提高性能,最好从就近的ID开始继承

var traffic_lights = $('#traffic_light input');

2. 在class前使用tag

第二快的选择器是tag选择器($(’head’))。同理,因为它来自原生的getElementsByTagName()方法。

<div id="content">
    <form method="post" action="/">
        <h2>Traffic Light</h2>
        <ul id="traffic_light">
            <li><input type="radio" class="on" name="light" value="red" /> Red</li>
            <li><input type="radio" class="off" name="light" value="yellow" /> Yellow</li>
            <li><input type="radio" class="off" name="light" value="green" /> Green</li>
        </ul>
        <input class="button" id="traffic_button" type="submit" value="Go" />
    </form>
</div>

总是用一个tag name来限制(修饰)class (并且不要忘记就近的ID):

var active_light = $('#traffic_light input.on');

注意: 在jquery中Class是最慢的选择器。IE浏览器下它会遍历所有DOM节点不管它用在那里。

不要用用tag name来修饰ID。下面的例子将会遍历所有的div元素来查找id为’content’的哪一个节点:

var content = $('div#content');

用ID修饰ID也是画蛇添足:

var traffic_light = $('#content #traffic_light');

3.将jquery对象缓存起来

要养成将jquery对象缓存进变量的习惯。

永远不要这样做:

$('#traffic_light input.on).bind('click', function(){...});
$('#traffic_light input.on).css('border', '3px dashed yellow');
$('#traffic_light input.on).css('background-color', 'orange');
$('#traffic_light input.on).fadeIn('slow');

最好先将对象缓存进一个变量然后再操作:

var $active_light = $('#traffic_light input.on');
$active_light.bind('click', function(){...});
$active_light.css('border', '3px dashed yellow');
$active_light.css('background-color', 'orange');
$active_light.fadeIn('slow');

为了记住我们本地变量是jquery的封装, 通常用一个$作为变量前缀. 记住,永远不要让相同的选择器在你的代码里出现多次。

缓存jquery结果,备用

如果你打算将jquery结果对象用在程序的其它部分,或者你的function会多次执行, 那么就将他们缓存到一个全局变量中。

定义一个全局容器来存放jquery结果,我们就可以在其它函数引用它们:

// 在全局范围定义一个对象 (例如: window对象)
window.$my = {
    //初始化所有可能会不止一次要使用的查询
    head: $('head'),
    traffic_light: $('#traffic_light'),
    traffic_button: $('#traffic_button')
};
function do_something() {
    //现在你可以引用存储的结果并操作它们
    var script = document.createElement('script');
    $my.head.append(script);

    // 当你在函数内部操作是, 可以继续将查询存入全局对象中去.
    $my.cool_results = $('#some_ul li');
    $my.other_results = $('#some_table td');

    //将全局函数作为一个普通的jquery对象去使用.
    $my.other_results.css('border-color', 'red');
    $my.traffic_light.css('border-color', 'green');
}

4. 掌握强大的链式操作

上面的例子也可以写成这样:

var $active_light = $('#traffic_light input.on');
$active_light.bind('click', function(){...})
    .css('border', '3px dashed yellow')
    .css('background-color', 'orange')
    .fadeIn('slow');

这样可以写更少的代码, 让我们的js更轻量。

5.使用子查询

jQuery 允许我们对一个已包装的对象使用附加的选择器操作。因为我们已经在保存了一个父级对象在变量里,这样大大提高对其子元素的操作:

<div id="content">
    <form method="post" action="/">
        <h2>Traffic Light</h2>
        <ul id="traffic_light">
            <li><input type="radio" class="on" name="light" value="red" /> Red</li>
            <li><input type="radio" class="off" name="light" value="yellow" /> Yellow</li>
            <li><input type="radio" class="off" name="light" value="green" /> Green</li>
        </ul>
        <input class="button" id="traffic_button" type="submit" value="Go" />
    </form>
</div>

例如,我们可以用子查询的方法来抓取到亮或不亮的灯,并缓存起来以备后续操作。

var $traffic_light = $('#traffic_light'),
    $active_light = $traffic_light.find('input.on'),
    $inactive_lights = $traffic_light.find('input.off');

提示:你可以用逗号分隔的方法一次声明多个局部变量–节省字节数

6.对直接的DOM操作进行限制

这里的基本思想是在内存中建立你确实想要的东西,然后更新DOM。这并不是一个jQuery最佳实践,但必须进行有效的JavaScript操作。直接的DOM操作速度很慢。

例如,你想动态的创建一组列表元素,千万不要这么做:

var top_100_list = [...], // 假设这里是100个独一无二的字符串
    $mylist = $('#mylist'); // jQuery 选择到 <ul> 元素

for (var i=0, l=top_100_list.length; i<l; i++) {
    $mylist.append('<li>' + top_100_list[i] + '</li>');
}

我们应该将整套元素字符串在插入进dom中之前全部创建好:

var top_100_list = [...], // 假设这里是100个独一无二的字符串
    $mylist = $('#mylist'), // jQuery selects our <ul> element
    top_100_li = ""; // 这个变量将用来存储我们的列表元素

for (var i=0, l=top_100_list.length; i<l; i++) {
    top_100_li += '<li>' + top_100_list[i] + '</li>';
}
$mylist.html(top_100_li);

我们在插入之前将多个元素包裹进一个单独的父级节点会更快:

var top_100_list = [...], // 假设这里是100个独一无二的字符串
    $mylist = $('#mylist'),  // jQuery 选择到 <ul> 元素
    top_100_ul = '<ul id="#mylist">'; // 这个变量将用来存储我们的列表元素

for (var i=0, l=top_100_list.length; i<l; i++){
    top_100_ul += '<li>' + top_100_list[i] + '</li>';
}
top_100_ul += '</ul>'; //关闭无序列表

$mylist.replaceWith(top_100_ul);

如果你做了以上几条还是担心有性能问题,那么:

试试jquery的 clone() 方法,它会创建一个节点树的副本,它允许以”离线”的方式进行dom操作,当你操作完成后再将其放回到节点树里。

使用DOM DocumentFragments。正如jQuery作者所言,它的性能要明显优于直接的dom操作。

7. 冒泡

除非在特殊情况下,否则每一个js事件(例如:click, mouseover, 等)都会冒泡到父级节点。当我们需要给多个元素调用同个函数时这点会很有用。

代替这种效率很差的多元素事件监听的方法就是,你只需向它们的父节点绑定一次,并且可以计算出哪个节点触发了事件。

例如,我们要为一个拥有很多输入框的表单绑定这样的行为:当输入框被选中时为它添加一个class

像这样绑定事件是低效的:

$('#entryform input).bind('focus', function(){
    $(this).addClass('selected');
}).bind('blur', function(){
    $(this).removeClass('selected');
});

我们需要在父级监听获取焦点和失去焦点的事:

$('#entryform).bind('focus', function(e){
    var cell = $(e.target);  // e.target grabs the node that triggered the event.
    cell.addClass('selected');
}).bind('blur', function(e){
    var cell = $(e.target);
    cell.removeClass('selected');
});

父级元素扮演了一个调度员的角色,它可以基于目标元素绑定事件。如果你发现你给很多元素绑定了同一个事件监听,那么你肯定哪里做错了。

8.消除无效查询

尽管jquery可以很优雅的处理没有匹配元素的情况,但它还是需要花费时间去寻找。如果你整站只有一个全局js,那么极有可能把所有的jquery函数塞进$(document)ready(function(){//所有你引以为傲的代码})里。

只运行在页面里用到的函数。大多数有效的方法就是使用行内初始化函数,这样你的模板就能准确的控制何时何处该执行js。

例如,你的”文章”页面模板,你可能会引用如下的代码在body结束处:

<script type="text/javascript>
    mylib.article.init();
</script>
</body>

如果你的页面模板包含一些多变的模块可能不会出现在页面中,或者为了视觉呈现的原因你需要它们能够快速加载,你可以将初始化函数紧跟在模块之后。

<ul id="traffic_light">
    <li><input type="radio" class="on" name="light" value="red" /> Red</li>
    <li><input type="radio" class="off" name="light" value="yellow" /> Yellow</li>
    <li><input type="radio" class="off" name="light" value="green" /> Green</li>
</ul>
<script type="text/javascript>
    mylib.traffic_light.init();
</script>

你的全局js库可能会是这样子的:

var mylib = {
    article_page: {
        init : function() {
            // Article 特有的jQuery函数.
        }
    },
    traffic_light: {
        init: function() {
            // Traffic light 特有的jQuery函数.
        }
    }
}

9. 推迟到 $(window).load

jquery对于开发者来说有一个很诱人的东西,可以把任何东西挂到$(document).ready下冒充事件。在大多数例子中你都会发现这样的情况。

尽管$(document).rady 确实很有用,它可以在页面渲染时,其它元素还没下载完成就执行。如果你发现你的页面一直是载入中的状态,很有可能就是$(document).ready函数引起的。

你可以通过将jquery函数绑定到$(window).load 事件的方法来减少页面载入时的cpu使用率。它会在所有的html(包括<iframe>)被下载完成后执行。

$(window).load(function(){
    // 页面完全载入后才初始化的jQuery函数.
});

多余的功能例如拖放,视觉特效和动画,预载入隐藏图像,等等。都是适合这种技术的场合。

10. 压缩js

推荐一个js在线压缩地址:http://dean.edwards.name/packer/

11. 全面掌握jquery库

知己知彼,百战百胜。只有更深入的了解jQuery才能更灵活的使用它。这里提供一个jQuery的速查手册,可以打印出来随身携带。要是有能力将jQuery源码通读一遍那就更好了。

本文转自:Time Machine – 前端开发

原文地址:http://rlog.cn/?p=350&cpage=1#comment-349

jQuery学习笔记7——jQuery 1.3.3 新功能预览

2009年11月12日 IT北瓜 没有评论

      1、增强的toggleClass()

     1)toggleClass也可以和addClass一样,用空格分隔多个class名称了

.toggleClass("a b") == .toggleClass("a").toggleClass("b")

      2)无参数时,自动删除、恢复全部class,也可以传递一个布尔值,true为恢复class,false为删除class

      3)也可以第一个参数为class名,第二个参数为布尔值,具体用法如下

// 原始代码
// <div class="a b c"></div>

// 删除、恢复全部class
$('div').toggleClass();        // <div class=""/>
$('div').toggleClass();        // <div class="a b c"/>
$('div').toggleClass( false ); // <div class=""/>
$('div').toggleClass( true );  // <div class="a b c"/>

// 删除、恢复多个 class
$('div').toggleClass("a b");          // <div class="c"/>
$('div').toggleClass("a c");          // <div class="a"/>
$('div').toggleClass("a b c", false); // <div class=""/>
$('div').toggleClass("a b c", true);  // <div class="a b c"/>

      2、简化的hover()

      1.3.3中,hover绑定事件可仅传递一个函数,将默认用做mouseenter/mouseleave公用的函数

//旧代码:
$('li').hover(function() {
    $(this).addClass('test');
}, function() {
    $(this).removeClass('test');
});

//新代码:
$('li').hover(function() {
    $(this).toggleClass('test');
});

      3、live冒泡事件支持预设参数

// 预设参数
var eventConfig = {
     selectedClass: "selected"
};

$("li").live("click", eventConfig, function( event ) {
    // 绑定函数的参数event的data属性即为传递的预设参数
    var selectedClass = event.data.selectedClass;
});

      4、更好的支持其它windows、document对象

//通过.contents()获得其它框架的document对象
var iframeDoc = $('iframe').contents().get(0);

//这样就可以获取其height/width/CSS属性或绑定事件
// 获得框架宽度
$(iframeDoc).width();

// 获得框架高度
$(iframeDoc).height();

// 绑定事件
$(iframeDoc).bind('click', function( event ) {
    // do something
});

// 获得CSS属性值
$('div', iframeDoc).css('backgroundColor');

      注意,如果要处理框架内部网页元素,请使用此插件(配合jQuery 1.3.3/+),和以下语法:

$('iframe').win().bind('load', fn);
$('iframe').doc().find('a').click(fn);

      5、增强的index()

      两个变化,第一个,支持传递selector作为参数

//旧代码:
$("img").index($("img.selected"));

//新代码
$("img").index(".selected");

      第二个,无参数传递,直接查找在同级元素中的位置

//旧代码:
var $this = $(".selected");
$this.parent().children().index($this);

//新代码:
$(".selected").index();

      6、自行指定this对象

      在1.3.3中,可以在bind/live绑定事件时,自行指定this参数代表的对象。这个用法需求不多,而且可用event.target,event.currentTarget代替

jQuery学习笔记6——jQuery 1.2.6 与 1.3 的主要区别

2009年11月12日 IT北瓜 没有评论

      2009年01月14日jQuery 1.3正式发布,1.3相比1.2.6在性能和浏览器兼容方面都做了不少改进,如:更为强大的选择器重写了Offset()等等。这里仅引用jQuery官方的几个测试图片,详细信息请查看http://docs.jquery.com/Release:jQuery_1.3

本文要说的区别着重点不在性能的提升和浏览器的兼容,而是方法的差异和功能的新增。

在实际使用中,Leeo感觉1.3与1.2.6最大的不同有两个:

1:取消了@符号

/*
例如:获取一个name为leeo的input的值
*/
/*
1.2.6的写法
*/
$('input[@name="leeo"]').val();
/*
1.3的写法
*/
$('input[name="leeo"]').val();

2:新能live()和die()方法

/*
live(type, fn)
type:事件类型
目前支持
click, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, keydown, keypress, keyup。 
还不支持
blur, focus, mouseenter, mouseleave, change, submit
fn:欲绑定的事件处理函数
*/
/*
实例:在1.2.6版本中加入我们用append()方法向DOM追加一个按钮
*/
$('#newBtn').click(function(){
    alert("IT北瓜");
});
$('#appendButton').append('<input type="button" id="newBtn" name="newBtn" />');
//我们会发现当点击按钮的时候并没有弹出我们想要的信息,因为click事件并没有绑定到newBtn上
//而1.3新增的live(type, fn)方法却可以轻松的做到这一点
$('#newBtn').live('click', function(){
        alert("IT北瓜");
});
$('#appendButton').append('<input type="button" id="newBtn" name="newBtn" />');

/*
die([type], [fn])方法是与live(type, fn)相反的方法
type (可选):要解除绑定的live事件
fn (可选):要解除绑定的特定处理函数
*/
/*
实例:给按钮解除click事件
*/
function dieClick() {
     alert("IT北瓜");
}
$('#newBtn').live('click', function(){
    dieClick();
    $('#newBtn').die("click", dieClick);
});

当然,除了以上说到的两点,1.3中还有其他新增的方法,如:jQuery.support等等…

漫画:混乱的标记语言XHTML2/HTML5【转】

2009年11月12日 IT北瓜 没有评论

点击下方图片或者混乱的标记语言漫画链接,可以打开更大、更清晰的大图。

混乱的标记语言漫画
混乱的标记语言XHTML2/HTML5漫画

漫画中提到两个链接地址:

本文转自:Yes! B/S !

原文地址:http://www.cnblogs.com/JustinYoung/archive/2009/07/30/misunderstanding-markup-xhtml-2-comic-strip.html

分类: HTML 标签: , ,

10种新的、有前途的JavaScript框架【转】

2009年11月12日 IT北瓜 没有评论

目前比较流行的JavaScript框架/库有jQuery,MooTools,Prototype,和YUI。但是除了这些流行的框架,还有很多很好的框架也值得我们去关注。以下列出的是10种被认为很有前途的JavaScript框架。  

1. SproutCore

SproutCore强调自身的独特之处是,具有桌面应用程序的功能(bringing desktop application functionalities on the web.)。

SproutCore官网

SproutCore文档

SproutCore的Google Group

SproutCore 示例: Photos, Sample Controls

2. Spry

Spry是Adode的Ajax框架,Spry的其中一个最显著的特性是与Adobe的产品集成,如Dreamweaver,Flash和AIR。像其它的Adobe的产品一样,它已经有大量的文档。

Spry 示例: Photo Gallery, RSS Reader, Form Validation Widgets

3.  JavaScriptMVC

JavaScriptMVC应用了模型-视图-控制器架构模式,把业务逻辑和表示分离,使得代码更加模块化。

JavaScriptMVC 示例: Error Demo, History Demo, Todo Demo

4.  Qooxdoo

   Qooxdoo是一个面向对象的Ajax应用框架。它使你能够使用JavaScript来构建应用程序,而不用关心HTML,CSS和DOM。而且它是一个很好的图形用户界面的工具(有点像YUI),内建支持键盘,拖动等功能。

Qooxdoo 示例: demo browser, Feed Reader

5. midori

midori是一个轻量的JavaScript框架。即使没有压缩,它也只有45KB,而相比之下,jQuery压缩后也有54KB。不过它的轻量并不意味着它缺乏复杂的JavaScript功能。Midori提供了包括跨浏览器的Ajax功能,CSS选择器等等这些JavaScript框架一般都具有的功能。

midori 示例: drag and drop, popups, toggle

6. Archetype JavaScript Framework

Archetype JavaScript Framework与Prototype有很多共同点。它有一个独立的管理系统,能够只初始化页面需要的组件。而且Archetype强调代码易读性,和HTML/CSS/JavaScript分离的最优方法。

Archetype 示例: Slidy Presentation

7.  June Framework

June Framework从Core library中获取灵感,应用了模块设计模式。如果你使用MS Visual Studio 2008的话,你会爱上它提供的文档,因为它使用了Visual Studio的代码格式。

June Framework 示例: setOpacity, highlight, getKeyName

8. UIZE

UIZE(发音: you eyes)是另一个强调RIA的JavaScript框架。它提供了很多Widget,比如日期选择器,表格过滤器,进度条,颜色选择器等。

UIZE 示例: Slideshow With Wipes, Marquee and Image Port

9. SimpleJS

SimpleJS是一个简单,轻量的,但很特别的JavaScript框架。它提供了Ajax函数和动态效果。它使用一个很像jQuery和MooTools的插件系统,可以很容易地扩展这个框架。对只需要基本Ajax功能和动态效果的开发者来说,它是一个完美的解决方案。

SimpleJS 示例: 官网 http://simplejs.bleebot.com/  右边导航的Functions下

10.  Fleegix.js

Fleegix.js是一个很好的事件系统,使你能够很容易地监听,操作,触发DOM事件。它有一个功能,能够将JavaScript对象序列化为JSON格式(fleegix.jason.serialize),也有一些丰富的动态效果

总结:
      这么多的JavaScript框架,肯定有一款适合你或者你的项目的。

本文转自:OurJs

原文地址:http://www.ourjs.cn/show.php?id=465

ie7-js

2009年11月12日 IT北瓜 没有评论

      众所周知,万恶的IE浏览器向来对W3C标准的支持很让前端开发者头疼!

      ie7-js是一个JavaScript库,使Microsoft Internet Explorer也能表现得像一个符合标准的浏览器。 它修复了许多HTML和CSS问题,并且解决了在IE5和IE6下PNG图片的透明问题。

      项目地址: http://code.google.com/p/ie7-js/
      Demo地址: http://ie7-js.googlecode.com/svn/test/index.html

      使用方法:

      IE7.js——使得IE5-6与IE7兼容

<!--[if lt IE 7]>
<script src="http://ie7-js.googlecode.com/svn/version/2.0(beta3)/IE7.js" type="text/javascript"></script>
<![endif]-->

      IE8.js——给IE5-7增加一些只有IE8才有的CSS特性

<!--[if lt IE 8]>
<script src="http://ie7-js.googlecode.com/svn/version/2.0(beta3)/IE8.js" type="text/javascript"></script>
<![endif]—>

      PNG——只会修正以 *-trans.png 命名的PNG图像。可惜,透明的背景图片像不能使用background-repeat平铺,也不可以用background-position定位。

9 个基于JavaScript 和 CSS 的 Web 图表框架【转】

2009年11月11日 IT北瓜 没有评论

      jQuery, MooTools, Prototype 等优秀的 JavaScript 框架拥有各种强大的功能,包括绘制 Web 图表,使用这些框架以及相应插件,我们可以非常轻松地实现曲线图,圆饼图,柱状图等 Web 图表的绘制,而不必象以往那样通过复杂的 Flash 技术实现。本文介绍了9个优秀的基于 JavaScript 与 CSS 的 Web 图表框架。

1. Flot

9 个基于JavaScript 和 CSS 的 Web 图表框架

图1

      Flot 是一个纯粹的 jQuery JavaScript 绘图库,可以在客户端即时生成图形,使用非常简单,支持放大缩小以及鼠标追踪等交互功能。该插件支持 IE6/7/8, Firefox 2.x+, Safari 3.0+, Opera9.5+ 以及 Konqueror 4.x+。使用的是 Safari 最先引入的 Canvas 对象,目前所有主流浏览器都支持该对象,除了 IE, 因此在 IE中使用 JavaScript 进行模拟。这里有一些实例。

2. JS Charts

9 个基于JavaScript 和 CSS 的 Web 图表框架
图2

      JS Charts 是一个免费的基于 JavaScript 的图表生成器,表格绘制非常简单,几乎不需要编码,也不需要插件和服务器模块,使用XML 或 JavaScript 数组缓存数据。

3. TableToChart

      TableToChart 是一个 MooTools 脚本,可以将 HTML Table 对象中存储的数据绘制成图表。你可以使用 table 标签生成图表,柱状图,曲线图,圆饼图等。

4. PlotKit

      PlotKit 是一个 JavaScript 绘图库,支持 HTML Canvas 标签,也支持 SVG。

5. Yahoo UI Charts Control

9 个基于JavaScript 和 CSS 的 Web 图表框架
图3

      YUI Charts Control 可以在网页上将表格数据转换为图表,支持柱状图,曲线图以及圆饼图。支持 DataSource 工具,可设置的轴,鼠标盘旋提示,图表组合,以及皮肤等功能。

6. ProtoChart

9 个基于JavaScript 和 CSS 的 Web 图表框架
图4

      ProtoChart 是一个基于 Prototype 和 Canvas 标签的开源库,这个库深受 Flot, Flotr, Plotkit 等启发,支持曲线图,柱状图,圆饼图等,可以在同一个图表上显示多套数据,支持可定制的图例,网格,边界以及背景图。支持 IE6/7, Firefox 2/3 以及 Safari,甚至支持iPhone.

7. EJSChart

      EJSChart 支持鼠标追踪,鼠标事件,按键追踪与事件,缩放,滚动,交互等功能,将用户体验上升到一个新高度。支持曲线图,面积图,离散图,圆饼图,柱状图等形式,拥有完备文档的属性和方法可以帮助实现很好的定制。

9 个基于JavaScript 和 CSS 的 Web 图表框架
图5

8. fgCharting

      fgCharting 是一个很出色的 jQuery 插件,支持多种图形。

9. Pure Css Data Chart

9 个基于JavaScript 和 CSS 的 Web 图表框架
图6

      以往的数据展示往往通过 flash 实现,现在,我们可以通过纯粹的 CSS 实现类似的功能。CSSGlobe 有一个非常实用的教程帮你实现基于 CSS 的绘图,甚至不需要 JavaScript。

        本文转自:锐商企业 官方网站
      原文地址:http://www.comsharp.com/GetKnowledge.aspx?Culture=zh-CN&ActivePageMenuName=TeamBlogTimothyPage&KnowledgeID=751&PrintFriendly=true&Keyword=9+%E4%B8%AA%E5%9F%BA%E4%BA%8EJavaScript+%E5%92%8C+CSS+%E7%9A%84+Web+%E5%9B%BE%E8%A1%A8%E6%A1%86%E6%9E%B6

Background JavaScript UI 库(背光JS框架)

2009年11月11日 IT北瓜 没有评论

    今天无意中看到的一个JS UI框架,背光JS框架,做得很漂亮,请看下图:

(CSS专题)页面布局

2009年11月10日 IT北瓜 没有评论

(PS:还是来自于Neo翻译的HTML Dog CSS Tutorials中文版的内容,假如你有兴趣你可以阅读不良标签标准要点两篇文章…一口气看完了Neo翻译的HTML Dog CSS Tutorials的中文版HTML和CSS网页标准指南,真的不错,建议各位可以抽空看看~~~)

CSS 来布局很容易。如果你已经习惯用表格布局的话,起先会感觉比较困难。其实不难,只不过动机不同,并且在实践中更有意义。

你可以把这一页面的各个部分当作独立的版块来看待,无论你选择哪一块。你可以绝对或相对地用彼块取代此块。

定位

定位属性position用于定义一个元素是否absolute(绝对),relative(相对),static(静态),或者fixed(固定)。

static值是元素的默认值,它会按照普通顺序生成,就如它们在HTML的出现一般。

relative很像static,但可用toprightbottomleft属性来偏移原始位置。

absolute使元素从HTML普通流中分离出来,并把它送到一个完全属于自己的定位世界。在这个稍微疯狂的世界,这个绝对的元素可以放置到任何地方,只要设置了toprightbottomleft的值。

fixed的行为也很像absolute,但参考于浏览器窗口相对于页面而放置绝对的元素,所以,理论上,当页面滚动的时候,固定元素完全保持在浏览器视区中。为什么说理论上的?不为别的,在Mozilla和Opera中工作得很好,但IE不会。

用绝对定位布局

你可以用绝对定位来创建一个传统两列布局,只要在HTML中使用如下面的类似规则:

<div id="navigation">
    <ul>
        <li><a href="this.html">This</a></li>
        <li><a href="that.html">That</a></li>
        <li><a href="theOther.html">The Other</a></li>
    </ul>
</div>
<div id="content">
    <h1>Ra ra banjo banjo</h1>
    <p>Welcome to the Ra ra banjo banjo page. Ra ra banjo banjo. Ra ra banjo banjo. Ra ra banjo banjo. Ra ra banjo banjo.</p>
    <p>(Ra ra banjo banjo)</p>
</div>

并且应用如下的CSS:

#navigation {
    position: absolute;
    top: 0;
    left: 0;
    width: 10em;
}
#content {
    margin-left: 10em;
}

你将看到,长度为10em的导航条被设置在左边。因为导航是绝对定位的,对页面的其他部分的流动不会有任何影响,所以所需要做的只是把内容区域的左边界宽度设置为与导航条宽度一样就可以了。

实在是太容易了!然而你并不受这个两列方法的限制。用精明的定位,你可以布置你所如你所需的更多的块。比如,你需要增加第三列,你可以为HTML增加“navigation2”块并且应用如下CSS:

#navigation {
    position: absolute;
    top: 0;
    left: 0;
    width: 10em;
}
#navigation2 {
    position: absolute;
    top: 0;
    right: 0;
    width: 10em;
}
#content {
    margin: 0 10em; /* setting top and bottom margin to 0 and right and left margin to 10em */
}

绝对定位元素的唯一副作用是,因为它们生活自己的世界里,没有办法精确决定它们在哪儿结束。如果你使用上面的例子在一个少导航和多内容区域,没有什么问题,但是,特别是使用长度和宽度的相对值时,你经常得放弃在下面放置任何事物如脚注的希望。如果你真的要做,与其绝对定位它们,不如浮动它们。

浮动

浮动将移动一个元素到同一线上的左边或者右边,而周围也会有内容浮动。

浮动经常用在定位一个页面内的小型的元素(在本站的原始默认CSS中HTML初级指南CSS初级指南的“下一页”连接就是浮动到右边的。同样参阅伪元素中的:first-letter例子),但同样可以用在更大的块中,比如导航列。

拿下面的HTML例子,你可以应用随后的CSS:

#navigation {
    float: left;
    width: 10em;
}
#navigation2 {
    float: right;
    width: 10em;
}
#content {
    margin: 0 10em;
}

如果你不希望下一个元素环绕浮动对象,你可以使用clear(清除)属性。clear: left将清除左边元素,clear: right将清除右边元素,而clear: both会清除左边和右边。所以,举个例子,你需要一个页面脚注,你可以用id“footer”为HTML增加一个块,然后使用如下的CSS:

#footer {clear: both;}

嗯,你已经搞定了。一个脚注会出现在所有列的下边,不管任何一个列有多长。

/*
注意
我们已经大体上介绍了地位和浮动,着重强调了页面的“大”块,但请记住,这些方法也可以用在这些块内的任何元素。综合定位、浮动、边界、补白和边框,你可以再现任何的版式设计,在布局方面,没有CSS完成不了表格所能完成的的事情。

使用表格布局的唯一理由是你试图适应古老的浏览器。这也是CSS实际上显示其先进的地方──在文件大小上,高易用性的页面只相当基于表格的页面的一小部分。
*/