java内存分配详解
Java 把内存划分成两种:一种是栈内存,另一种是堆内存。在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的
栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动
释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。
堆内存用来存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理。在堆中产生了一个数
组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个
变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是为
数组或者对象起的一个名称。引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组
和对象本身在堆中分配,即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会
被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放,在随后的一个不确定
的时间被垃圾回收器收走(释放掉)。这也是 Java 比较占内存的原因。
实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!
http协议详解
HTTP 是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系
统。它于1990 年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW 中使用的是HTTP/1.0
的第六版,HTTP/1.1 的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的
建议已经提出。
HTTP 协议的主要特点可概括如下:
1.支持客户/服务器模式。
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、
POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP 协议简单,使得HTTP 服务器的程序规
模小,因而通信速度很快。
3.灵活:HTTP 允许传输任意类型的数据对象。正在传输的类型由Content-Type 加以标记。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的
应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着
如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在
服务器不需要先前信息时它的应答就较快。
一、HTTP协议详解之URL篇
http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP 的
连接方式,HTTP1.1 版本中给出一种持续连接的机制,绝大多数的Web 开发,都是构建在HTTP 协议之
上的Web 应用。
HTTP URL (URL 是一种特殊类型的URI,包含了用于查找某个资源的足够的信息)的格式如下:
http://host[":"port][abs_path]
http 表示要通过HTTP 协议来定位网络资源;host 表示合法的Internet 主机域名或者IP 地址;
port 指定一个端口号,为空则使用缺省端口80;abs_path 指定请求资源的URI;如果URL 中没有给
出abs_path,那么当它作为请求URI 时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。
eg:
1、输入:www.guet.edu.cn
浏览器自动转换成:http://www.guet.edu.cn/
2、http:192.168.0.116:8080/index.jsp
ChartDirector
//Name of demo program
public String toString() { return "Glass Bar Shading"; }
//Number of charts produced in this demo
public int getNoOfCharts() { return 1; }
//Main code for creating charts
public void createChart(ChartViewer viewer, int index)
{
// The data for the bar chart
double[] data = {450, 560, 630, 800, 1100, 1350, 1600, 1950, 2300, 2700};
// The labels for the bar chart
String[] labels = {"1996", "1997", "1998", "1999", "2000", "2001", "2002",
"2003", "2004", "2005"};
// Create a XYChart object of size 600 x 360 pixels
XYChart c = new XYChart(600, 360);
// Set the plotarea at (60, 40) and of size 480 x 280 pixels. Use a vertical
// gradient color from light blue (eeeeff) to deep blue (0000cc) as
// background. Set border and grid lines to white (ffffff).
c.setPlotArea(60, 40, 480, 280, c.linearGradientColor(60, 40, 60, 280,
0xeeeeff, 0x0000cc), -1, 0xffffff, 0xffffff);
// Add a title to the chart using 18pts Times Bold Italic font
c.addTitle("Annual Revenue for Star Tech", "Times New Roman Bold Italic", 18)
;
// Add a multi-color bar chart layer using the supplied data. Use glass
// lighting effect with light direction from the left.
c.addBarLayer3(data).setBorderColor(Chart.Transparent, Chart.glassEffect(
Chart.NormalGlare, Chart.Left));
// Set the x axis labels
c.xAxis().setLabels(labels);
// Show the same scale on the left and right y-axes
c.syncYAxis();
// Set the left y-axis and right y-axis title using 10pt Arial Bold font
c.yAxis().setTitle("USD (millions)", "Arial Bold", 10);
c.yAxis2().setTitle("USD (millions)", "Arial Bold", 10);
// Set all axes to transparent
c.xAxis().setColors(Chart.Transparent);
c.yAxis().setColors(Chart.Transparent);
c.yAxis2().setColors(Chart.Transparent);
// Set the label styles of all axes to 8pt Arial Bold font
c.xAxis().setLabelStyle("Arial Bold", 8);
c.yAxis().setLabelStyle("Arial Bold", 8);
c.yAxis2().setLabelStyle("Arial Bold", 8);
// output the chart
viewer.setImage(c.makeImage());
//include tool tip for the chart
viewer.setImageMap(c.getHTMLImageMap("clickable", "",
"title='Year {xLabel}: US$ {value}M'"));
EZDML压缩版
用于设计表结构的工具,可以自动导入到数据库,很好用!
mes-Servlet.xml
mes-Servlet.xml
spring lib j2ee
#1 定義了兩個輸出端 level = LOG,INFO,WARN,ERROR,FATAL
###定義某個包下的所有類錯誤級別
log4j.rootLogger = INFO,A1
log4j.addivity.org.apache=true
log4j.logger.com.ibatis = ERROR
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource = ERROR
#log4j.logger.com.ibatis.common.jdbc.ScriptRunner = ERROR
#log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate = ERROR
#log4j.logger.java.sql.Connection = INFO
#log4j.logger.java.sql.Statement = DEBUG
#log4j.logger.java.sql.PreparedStatement = DEBUG
#log4j.logger.java.sql.ResultSet = DEBUG
#2 定義A1輸出到控制器
log4j.appender.A1 = org.apache.log4j.ConsoleAppender
#3 定義A1的佈局模式?PatternLayout
log4j.appender.A1.layout = org.apache.log4j.PatternLayout
#4 定義A1的輸出格式
log4j.appender.A1.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} [%p] %m%n
spring applicationContext 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<description>Spring公共配置文件</description>
<!-- mes 的數據庫 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="oracle.jdbc.driver.OracleDriver"/>
<property name="jdbcUrl" value="jdbc:oracle:thin:@10.142.252.132:1521:mestest"/>
<property name="maxPoolSize" value="10"></property>
<property name="maxIdleTime" value="1800"></property>
<property name="minPoolSize" value="1"></property>
<property name="initialPoolSize" value="1"></property>
<property name="properties">
<ref bean="mesDatasourcePropertiesFactory" />
</property>
</bean>
<!-- c3p0数据源的一个专有属性,只可以存放密码和用户名 -->
<bean id="mesDatasourcePropertiesFactory" class="com.ccc.db.impl.DatasourcePropertiesFactory" factory-method="getProperties">
<!-- userName-->
<constructor-arg type="java.lang.String">
<value>jxg/Qr4VbxU=</value>
</constructor-arg>
<!-- password -->
<constructor-arg type="java.lang.String">
<value>jxg/Qr4VbxU=</value>
</constructor-arg>
<!-- 生产环境模式 ,才特殊处理加密密码-->
<constructor-arg type="java.lang.String">
<value>true</value>
</constructor-arg>
</bean>
<!-- ptc windchill的數據庫 -->
<bean id="dataSourcePdm" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="oracle.jdbc.driver.OracleDriver"/>
<property name="jdbcUrl" value="jdbc:oracle:thin:@10.142.252.132:1521:mesdev"/>
<property name="maxPoolSize" value="10"></property>
<property name="maxIdleTime" value="1800"></property>
<property name="minPoolSize" value="1"></property>
<property name="initialPoolSize" value="1"></property>
<property name="properties">
<ref bean="ptcDatasourcePropertiesFactory" />
</property>
</bean>
<!-- c3p0数据源的一个专有属性,只可以存放密码和用户名 -->
<bean id="ptcDatasourcePropertiesFactory" class="com.ccc.db.impl.DatasourcePropertiesFactory" factory-method="getProperties">
<!-- userName-->
<constructor-arg type="java.lang.String">
<value>WgDH/SDIJfs=</value>
</constructor-arg>
<!-- password -->
<constructor-arg type="java.lang.String">
<value>WgDH/SDIJfs=</value>
</constructor-arg>
<!-- 生产环境模式 ,才特殊处理加密密码-->
<constructor-arg type="java.lang.String">
<value>true</value>
</constructor-arg>
</bean>
<!-- mes數據源代理 -->
<bean id="dataSourceProxy"
class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy"
p:targetDataSource-ref="dataSource"/>
<!-- 对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能-->
<context:component-scan base-package="com.ccc"/>
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"
p:order="0" />
<!-- 配置事务管理器 針對MES數據庫-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager "
p:dataSource-ref="dataSourceProxy"/>
<!-- 配置事务的传播特性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- 那些类的哪些方法参与事务 -->
<aop:config>
<aop:pointcut id="allManagerMethod" expression="execution(* com.ccc..*.*(..))"/>
<aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice"/>
</aop:config>
<!-- 配置事务管理器,這個事務性是爭對pdm數據庫的 -->
<bean id="transactionManagerPdm" class="org.springframework.jdbc.datasource.DataSourceTransactionManager "
p:dataSource-ref="dataSourcePdm"/>
<!-- 配置事务的传播特性 -->
<tx:advice id="txAdvicePdm" transaction-manager="transactionManagerPdm">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- 那些类的哪些方法参与事务 -->
<aop:config>
<aop:pointcut id="allManagerMethodPdm" expression="execution(* com.ccc.pdm..*.*(..))"/>
<aop:advisor pointcut-ref="allManagerMethodPdm" advice-ref="txAdvicePdm"/>
</aop:config>
<!-- ibatis插件 -->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean" p:dataSource-ref="dataSourceProxy">
<property name="configLocation">
<value>classpath:SqlMapConfig.xml</value>
</property>
</bean>
<bean id="sqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate">
<property name="sqlMapClient">
<ref bean="sqlMapClient" />
</property>
</bean>
<!-- 配置要拦截的url,防止2次提交或做其他數據統計用
<bean id="doubleSubmitInterceptor" class="com.ccc.filter.DoubleSubmitInterceptor">
<property name="mappingURL" value=".html" />
<property name="viewURL" value=".html" />
</bean>
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" p:order="0">
<property name="interceptors">
<list>
<ref bean="doubleSubmitInterceptor"/>
</list>
</property>
</bean>
-->
<!-- JDBC template注入及事務配置 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource"><ref bean="dataSourceProxy"/></property>
</bean>
</beans>
spring jdbctemplate 封裝
package com.ccc.db.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import java.util.regex.PatternSyntaxException;
import javax.sql.DataSource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.rowset.ResultSetWrappingSqlRowSet;
import org.springframework.jdbc.support.rowset.SqlRowSet;
import org.springframework.jdbc.support.rowset.SqlRowSetMetaData;
import org.springframework.stereotype.Service;
import com.ccc.db.JdbcTemplateManager;
import com.ccc.db.page.OraclePageOptimize;
import com.ccc.tag.page.Page;
import com.ccc.tag.page.PagerTag;
import com.ccc.util.BeanUtil;
import com.ccc.util.StringUtil;
javascrip 分頁組件
//用戶自定義ID(目的:在同一個jsp頁面同時使用該分頁js)
this.nowPage = typeof(options.nowPage)=="undefined" ? "nowPage" : options.nowPage;
this.page_pageNo = typeof(options.page_pageNo)=="undefined" ? "page_pageNo" : options.page_pageNo;
this.page_pageCount = typeof(options.page_pageCount)=="undefined" ? "page_pageCount" : options.page_pageCount;
this.perPage = typeof(options.perPage)=="undefined" ? "perPage" : options.perPage;
this.page_recordCount = typeof(options.page_recordCount)=="undefined" ? "page_recordCount" : options.page_recordCount;
this.page_firstPage = typeof(options.page_firstPage)=="undefined" ? "page_firstPage" : options.page_firstPage;
this.page_prePage = typeof(options.page_prePage)=="undefined" ? "page_prePage" : options.page_prePage;
this.page_nextPage = typeof(options.page_nextPage)=="undefined" ? "page_nextPage" : options.page_nextPage;
this.page_lastPage = typeof(options.page_lastPage)=="undefined" ? "page_lastPage" : options.page_lastPage;
this.page_selectPage = typeof(options.page_selectPage)=="undefined" ? "page_selectPage" : options.page_selectPage;
this.page_toPage = typeof(options.page_toPage)=="undefined" ? "page_toPage" : options.page_toPage;
this.page_pageSpan = typeof(options.page_pageSpan)=="undefined" ? "page_pageSpan" : options.page_pageSpan;
this.pageDiv = typeof(options.pageDiv)=="undefined" ? "pageDiv" : options.pageDiv;
HTC G10完整刷机教程
刷机,简单的说,就是通过一系列步骤,把手机里面的一些固有的程序替换掉的一个过程。
通过刷机,我们可以提升权限,可以得到更新版的操作系统,或者是改良后的系统驱动,等等。这样,我们可以让手机运行在更好的一个状态下。
通过官方提供的升级包,自己手动来给手机升级的,也是一种刷机,只不过这是在官方授权允许的情况下进行的就是了。
后面即将要讲到的rooting,也是一种简单的刷机,我们往手机里面放进了两个程序,然后我们就取得了系统的最高权限。
再后面我们要讲到的,怎么去替换系统程序,怎么把第三方、甚至是自己修改的刷机包刷进我们的手机,同样都是刷机。
基於dwr的不刷新的分頁組件
一款自己創造的基於dwr的不刷新分頁組件,增強了用戶體驗!
部份代碼:
//換頁
Page.prototype.changePage = function(params, functionName){
var toPageNo = 0;
//首頁
if(params=="first"){
toPageNo = 1;
}
//上一頁
if(params=="pre"){
toPageNo = 1*pageNo-1;
}
//下一頁
if(params=="next"){
toPageNo = 1*pageNo+1
}
//尾頁
if(params=="last"){
toPageNo = pageCount;
}
//下拉選框跳轉
if(params=="select"){
toPageNo = pageNo = $("#page_selectPage").val();
}
//文本框跳轉
if(params=="to"){
//輸入頁數不能大於最大頁數
var toPage = $.trim($("#page_toPage").val());
if(toPage>pageCount){
var str = "<font color='red'>您輸入的頁數超過了總頁數</font>";
$("#page_pageSpan").html(str);
$("#page_pageSpan").show();
$("#page_pageSpan").fadeOut(3000);
$("#page_toPage").focus();
$("#page_toPage").select();
return;
}else{
$("#page_pageSpan").hide();
toPageNo = pageNo = $.trim($("#page_toPage").val());
}
}
//更新每頁顯示記錄數
if(params=="per"){
toPageNo = 1;
}
$("#page_pageSpan").hide();
//輸入每頁記錄數不能大於每頁記錄數的上限
var pageSize = $.trim($("#perPage").val());
if(pageSize>maxPageSize){
var str = "<font color='red'>您輸入的每頁記錄數超過了每頁記錄數上限"+ maxPageSize +"</font>";
$("#page_pageSpan").html(str);
$("#page_pageSpan").show();
$("#page_pageSpan").fadeOut(5000);
$("#perPage").focus();
$("#perPage").select();
return;
}
//執行分頁查找
eval(functionName+"("+toPageNo+");");
};
基於jQuery的自動補全組件
自己寫的基於jquery的好用的自動補全組件,只要聽說過javascript的都能使用!
使用方法:$(document).ready(function(){
//設置延時,降低數據庫的負荷
var s;
$("#materialNo").keyup(function(){
//按鍵碼
var e = event.keyCode;
if(e!=40&&e!=38&&e!=13){
//清除延時
window.clearTimeout(s);
//設定延時
s = setTimeout("query('"+ e +"')", 500);
}else{
query(e);
}
});
});
//自動補全模號
query = function(e){
/**
* 描述:實例化自動補全類
* 參數:搜索文本框的ID,搜索DIV的ID
*/
var auto = new Autocomplete("materialNo","materialDiv");
//上方向鍵,下方向鍵,回車鍵
if(e!=40&&e!=38&&e!=13){
//var moldNo = $.trim($("#moldNo").val());
//$.post("errController.html?method=moldNoCompleteAuto",
//{
//moldNo:moldNo
//},
//function(data){
var data = "Q5888-40077,Q5888-40077,Q5888-40077,Q5888-40077,Q5888-40077,Q5888-40077";
/**
* 描述:自動補全方法
* 參數:查詢出的補全信息,文本框的ID,按鍵事件的keyCode
*/
auto.autocomplete(data, 'materialNo', e);
//});
}else{
/**
* 描述:不查詢數據,僅添加按鍵事件
* 參數:按鍵事件的keyCode,搜索文本框的ID
*/
auto.keyEvents(e, "materialNo");
}
};
xFire經典透析
1.SOAP 是一种轻量级协议,用于在分散型、分布式环境中交换结构化信息。 SOAP 利用 XML 技术定义一种可扩展的消息处理框架,它提供了一种可通过多种底层协议进行交换的消息结构。 这种框架的设计思想是要独立于任何一种特定的编程模型和其他特定实现的语义。
2.WSDL描述web服务的三个基本属性:服务做些什么?服务所提供的操作(方法);如何访问服务?数据格式以及访问服务操作的必要协议;服务位于何处?由特定协议决定的网络地址,如URL。
Web Service
1.Web service經典開發文檔!
2.它是一個軟件系統﹐為了支持跨網絡的機器間相相互交互而設計。Web Service服務通常被定義為一組模塊化的API﹐它們可以通過網絡進行調用﹐來執行遠程系統的請求服務。
3.XFire 是 codeHaus 組織提供的一個開源框架,它構建了 POJO 和 SOA 之間的橋樑,主要特性就是支持將 POJO 通過非常簡單的方式發佈成 Web 服務,這種處理方式不僅充分發揮了 POJO 的作用,簡化了 Java 應用轉化為 Web 服務的步驟和過程,也直接降低了 SOA 的實現難度,為企業轉向 SOA 架構提供了一種簡單可行的方式。
oracle实用教程PPT
oracle实用教程PPT
spring源码剖析
在认真学习Rod.Johnson的三部曲之一:<<Professional Java Development with the spring framework>>,顺便也看了看源代码想知道
个究竟,抛砖引玉,有兴趣的同志一起讨论研究吧!
以下内容引自博客:http://jiwenke-spring.blogspot.com/,欢迎指导:)
在Spring中,IOC容器的重要地位我们就不多说了,对于Spring的使用者而言,IOC容器实际上是什么呢?我们可以说BeanFactory就是
我们看到的IoC容器,当然了Spring为我们准备了许多种IoC容器来使用,这样可以方便我们从不同的层面,不同的资源位置,不同的形
式的定义信息来建立我们需要的IoC容器。
在Spring中,最基本的IOC容器接口是BeanFactory - 这个接口为具体的IOC容器的实现作了最基本的功能规定
photoshop水晶字
photoshop水晶字
photoshop发光按钮
photoshop发光按钮
csdn资源上传进度条
<form id="uploadForm" runat="server" enctype="multipart/form-data">
<div id="uploadfield" height:500px">
<input id="File1" type="file" runat="server" />
<asp:Button ID="Button1" runat="server" Text="上传" />
<p>文件上传进度条</p>
<p>文件上传进度条</p>
<p>文件上传进度条</p>
<p>文件上传进度条</p>
<p>文件上传进度条</p>
<p>文件上传进度条</p>
<p>文件上传进度条</p>
</div>
<div id="ui" >
<div id="output" > </div>
<div id="progressbar"class="ui-progressbar ui-widget ui-widget-content ui-corner-all" height:20px;"></div>
<input id="btn_cancel" type="button" value="取消上传" />
</div>
</form> js: var inte;
$(function() {
$('#uploadForm').submit(function() {
return false;
});
$('#uploadForm').ajaxForm({ //这里调用jquery.form.js表单注册方法
beforeSubmit: function(a, f, o) {//提交前的处理
o.dataType = "json";
$('#uploadfield').block({ message: $('#ui'), css: { width: '300px', border: '#b9dcfe 1px solid',padding: '0.5em 0.2em' }
});
inte = self.setInterval("getprogress()", 500);
}
});
$('#btn_cancel').click(function() {
var uploadid = $("#UploadID").val();
$.ajax({
type: "POST",
dataType: "json",
async: false, //ajax的请求时同步 只有一个线程
url: "upload_ajax.ashx",
data: "UploadID=" + uploadid + "&cancel=true",
success: function(obj) {
$("#output").html(obj.msg);
inte = self.clearInterval(inte);
$('#uploadfield').unblock();
}
});
});
});
function getprogress() {
var uploadid = $("#UploadID").val()
$.ajax({
type: "POST",
dataType: "json",
async: false,
url: "upload_ajax.ashx",
data: "UploadID=" + uploadid,
success: function(obj) {
var p = obj.msg.Readedlength / obj.msg.TotalLength * 100;
var info = "<FONT color=Green> 当前上传文件:</FONT>" + obj.msg.CurrentFile;
info += "<br><FONT color=Green>" + obj.msg.FormatStatus + ":</FONT>" + obj.msg.Status;
info += "<br><FONT color=Green>文件大小:</FONT>" + obj.msg.TotalLength;
info += "<br><FONT color=Green>速度:</FONT>" + obj.msg.FormatRatio;
info += "<br><FONT color=Green>剩余时间:</FONT>" + obj.msg.LeftTime;
$("#output").html(info);
$("#progressbar").progressbar({ value: 0 }); //初始化
$("#progressbar").progressbar("option", "value", p);
$("#progressbar div").html(p.toFixed(2) + "%");
$("#progressbar div").addClass("percentText");
if (obj.msg.Status == 4) {
inte = self.clearInterval(inte);
$('#uploadfield').unblock();
}
}
});
}
图片放大镜
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Magnifier</title>
<style type="text/css">
#magnifier{
width:320px;
height:280px;
position:absolute;
border:1px solid #000;
text-align:center;
line-height:280px;
overflow:hidden;
}
#img{
width:300px;
height:260px;
}
#Browser{
border:1px solid #000;
z-index:100;
position:absolute;
background:#555;
}
#mag{
border:1px solid #000;
overflow:hidden;
z-index:100;
}
</style>
[removed]
function getEventObject(W3CEvent) { //事件标准化函数
return W3CEvent || window.event;
}
function getPointerPosition(e) { //兼容浏览器的鼠标x,y获得函数
e = e || getEventObject(e);
var x = e.pageX || (e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft));
var y = e.pageY || (e.clientY + (document.documentElement.scrollTop || document.body.scrollTop));
return { 'x':x,'y':y };
}
function setOpacity(elem,level) { //兼容浏览器设置透明值
if(elem.filters) {
elem.style.filter = 'alpha(opacity=' + level * 100 + ')';
} else {
elem.style.opacity = level;
}
}
function css(elem,prop) { //css设置函数,可以方便设置css值,并且兼容设置透明值
for(var i in prop) {
if(i == 'opacity') {
setOpacity(elem,prop[i]);
} else {
elem.style[i] = prop[i];
}
}
return elem;
}
var magnifier = {
m : null,
init:function(magni){
var m = this.m = magni || {
cont : null, //装载原始图像的div
img : null, //放大的图像
mag : null, //放大框
scale : 15 //比例值,设置的值越大放大越大,但是这里有个问题就是如果不可以整除时,会产生些很小的白边,目前不知道如何解决
}
css(m.img,{
'position' : 'absolute',
'width' : (m.cont.clientWidth * m.scale) + 'px', //原始图像的宽*比例值
'height' : (m.cont.clientHeight * m.scale) + 'px' //原始图像的高*比例值
})
css(m.mag,{
'display' : 'none',
'width' : m.cont.clientWidth +90 + 'px', //m.cont为原始图像,与原始图像等宽
'height' : m.cont.clientHeight + 'px',
'position' : 'absolute',
'left' : m.cont.offsetLeft + m.cont.offsetWidth + 10 + 'px', //放大框的位置为原始图像的右方远10px
'top' : m.cont.offsetTop + 'px'
})
var borderWid = m.cont.getElementsByTagName('div')[0].offsetWidth - m.cont.getElementsByTagName('div')[0].clientWidth; //获取border的宽
css(m.cont.getElementsByTagName('div')[0],{ //m.cont.getElementsByTagName('div')[0]为浏览框
'display' : 'none', //开始设置为不可见
'width' : m.cont.clientWidth / m.scale - borderWid + 'px', //原始图片的宽/比例值 - border的宽度
'height' : m.cont.clientHeight / m.scale - borderWid + 'px', //原始图片的高/比例值 - border的宽度
'opacity' : 0.5 //设置透明度
})
m.img.src = m.cont.getElementsByTagName('img')[0].src; //让原始图像的src值给予放大图像
m.cont.style.cursor = 'crosshair';
m.cont.onmouseover = magnifier.start;
},
start:function(e){
if(document.all){ //只在IE下执行,主要避免IE6的select无法覆盖
magnifier.createIframe(magnifier.m.img);
}
this.onmousemove = magnifier.move; //this指向m.cont
this.onmouseout = magnifier.end;
},
move:function(e){
var pos = getPointerPosition(e); //事件标准化
this.getElementsByTagName('div')[0].style.display = '';
css(this.getElementsByTagName('div')[0],{
'top' : Math.min(Math.max(pos.y - this.offsetTop - parseInt(this.getElementsByTagName('div')[0].style.height) / 2,0),this.clientHeight - this.getElementsByTagName('div')[0].offsetHeight) + 'px',
'left' : Math.min(Math.max(pos.x - this.offsetLeft - parseInt(this.getElementsByTagName('div')[0].style.width) / 2,0),this.clientWidth - this.getElementsByTagName('div')[0].offsetWidth) + 'px' //left=鼠标x - this.offsetLeft - 浏览框宽/2,Math.max和Math.min让浏览框不会超出图像
})
magnifier.m.mag.style.display = '';
css(magnifier.m.img,{
'top' : - (parseInt(this.getElementsByTagName('div')[0].style.top) * magnifier.m.scale) + 'px',
'left' : - (parseInt(this.getElementsByTagName('div')[0].style.left) * magnifier.m.scale) + 'px'
})
},
end:function(e){
this.getElementsByTagName('div')[0].style.display = 'none';
magnifier.removeIframe(magnifier.m.img); //销毁iframe
magnifier.m.mag.style.display = 'none';
},
createIframe:function(elem){
var layer = document.createElement('iframe');
layer.tabIndex = '-1';
layer.src = '[removed]false;';
elem[removed].appendChild(layer);
layer.style.width = elem.offsetWidth + 'px';
layer.style.height = elem.offsetHeight + 'px';
},
removeIframe:function(elem){
var layers = elem[removed].getElementsByTagName('iframe');
while(layers.length >0){
layers[0][removed].removeChild(layers[0]);
}
}
}
window.onload = function(){
magnifier.init({
cont : document.getElementById('magnifier'),
img : document.getElementById('magnifierImg'),
mag : document.getElementById('mag'),
scale : 3
});
}
[removed]
</head>
iphone folder效果
iphone folder效果
firefox12绿色免安装版
firefox12绿色免安装版
CSS使用特效
*{
margin: 0;
padding: 0;
border: 0 none;
outline: 0;
}
body{
font-family: "Lucida Grande", "Verdana", sans-serif;
font-size: 12px;
}
p{
margin: 20px 0 40px 0;
}
h1{
font-size: 30px;
font-family: "Myriad Pro", "Lucida Grande", "Verdana", sans-serif;
padding: 0;
margin: 0;
}
h2{
font-size: 20px;
}
#container{
width: 900px;
margin-left: auto;
margin-right: auto;
padding: 50px 0 0 0;
position: relative;
}
img{
display: block;
}
#gallery, #thumbs{
float: left;
}
#gallery{
width: 800px;
height: 300px;
overflow: hidden;
}
#gallery img{
position: absolute;
}
#thumbs{
width: 100px;
height: 300px;
overflow: hidden;
}
#next{
display: block;
width: 47px;
height: 43px;
background: url(img/arrow.png);
position: relative;
top: 257px;
left: 855px;
}
#next:hover{
background: url(img/arrowmo.png);
}
.clear{
clear: both;
}
kitJs源代码
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="refresh" content="0;url=KitJs/index.html" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>中文javascript组件库--Kit</title>
</head>
<body>
</body>
</html>
纯css带箭头div
<head>
<title>纯CSS无图片带箭头的DIV方框</title>
<style>
div.container{position:absolute;
top:30px;
left:40px;
font-size: 9pt;
display:block;
height:100px;
width:200px;
background-color:transparent;
*border:1px solid #666;
}
s{
position:absolute;
top:-20px;
*top:-22px;
left:20px;
display:block;
height:0;
width:0;
font-size: 0;
line-height: 0;
border-color:transparent transparent #666 transparent;
border-style:dashed dashed solid dashed;
border-width:10px;
}
i{position:absolute;
top:-9px;
*top:-9px;
left:-10px;
display:block;
height:0;
width:0;
font-size: 0;
line-height: 0;
border-color:transparent transparent #fff transparent;
border-style:dashed dashed solid dashed;
border-width:10px;
}
.content{
border:1px solid #666;
-moz-border-radius:3px;
-webkit-border-radius:3px;
position:absolute;
background-color:#fff;
width:100%;
height:100%;
padding:5px;
*top:-2px;
*border-top:1px solid #666;
*border-top:1px solid #666;
*border-left:none;
*border-right:none;
*height:102px;
box-shadow: 3px 3px 4px #999;
-moz-box-shadow: 3px 3px 4px #999;
-webkit-box-shadow: 3px 3px 4px #999;
/* For IE 5.5 - 7 */
filter: progid:DXImageTransform.Microsoft.Shadow(Strength=4, Direction=135, Color="#999999');
/* For IE 8 */
-ms-filter: "progid:DXImageTransform.Microsoft.Shadow(Strength=4, Direction=135, Color='#999999')";
}
</style>
</head>
<body>
这是框中的文字,可动态显示。高度自动增加,应该不错吧^_^
</body>
</html>
jquery插件使用方法大全
Jquery是继prototype之后又一个优秀的Javascrīpt框架。它是轻量级的js库(压缩后只有21k) ,它兼容CSS3,还兼容各种浏览器 (IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+)。jQuery使用户能更方便地处理HTML documents、events、实现动画效果,并且方便地为网站提供AJAX交互。jQuery还有一个比较大的优势是,它的文档说明很全,而且各种应用也说得很详细,同时还有许多成熟的插件可供选择。jQuery能够使用户的html页保持代码和html内容分离,也就是说,不用再在html里面插入一堆js来调用命令了,只需定义id即可。
目录
简介
找到你了!
Jquery对象
代替body标签的onload
事件机制
同一函数实现get\set
ajax
渐入淡出
plugin
历史版本
1、新的事件.on() .off()
3、动画的改进
1.42版介绍
JQuery插件
让Dreamweaver支持提示代码功能
引入JQuery简介
找到你了!
Jquery对象
代替body标签的onload
事件机制
同一函数实现get\set
ajax
渐入淡出
plugin历史版本1、新的事件.on() .off()3、动画的改进1.42版介绍JQuery插件让Dreamweaver支持提示代码功能引入JQuery展开编辑本段简介
jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多javascript高手加入其team,包括来自德国的Jörn Zaefferer,罗马尼亚的Stefan Petre等等。jQuery是继prototype之后又一个优秀的Javascrīpt框架。其宗旨是——WRITE LESS,DO MORE,写更少的代码,做更多的事情。 由于目前高校基本尚未开JavaScript的相关课程,目前jQuery的学习,使用,研究都仅限于在职Web程序员之间。 用jq的前提,首先要引用一个有jq的文件 [removed][removed] 这个是jquery官方最新的地址。可用在自己网站里加个这个,就能使用jquery了。 但仍然建议下载到本地服务器上。
编辑本段找到你了!
在编写js库代码时候,你一定经常和“$”美元符号打交道吧?无论prototype还是DWR都使用了$代替频繁的document.getElementById()操作。jQuery也这样做了,但是,它的功能远非如此,瞧瞧以下的jQuery代码,你就会发现它的美丽: 代码 var someElement = $("#myId"); 看起来比其他两个框架的要多了一个#,好,看看下面的用法: 代码 $("div p"); // (1) $("div.container"); // (2) $("div #msg"); // (3) $("table a",context); // (4) 在prototype里看过这样的写法吗?第一行代码得到所有div标签下的p元素。第二行代码得到class 为container的div元素,第三行代码得到标签下面id为msg的div元素(不过最好别这样写,因为jQuery需要遍历所有的div元素,对于带id的元素,直接用$("#id"))。第四行代码得到context为上下文的table里面所有的链接元素。 如果你熟悉CSS,你会觉得这些写法很眼熟!对了。正是。看出奥妙了吧。jQuery就是如此强大,你可以轻易地找到DOM中的任何元素,而这也是jQuery设计之初query的真实含义(查询)。
编辑本段Jquery对象
jquery提供了很多便利的函数,如each(fn),但是使用这些函数的前提是:你使用的对象是Jquery对象。使一个Dom对象成为一个Jquery对象很简单,通过下面一些方式(只是一部分): 代码 var a = $("#cid"); var b = $("<p>hello</p>"); var c = document.createElement("table"); var tb = $(c);
编辑本段代替body标签的onload
这个惯例,也许是除了$()之外,用得最多的地方了。下面一段代码: 代码 $(document).ready(function(){ alert("hello"); });(1) <body>(2) <body>这里的alert('hello');要等到页面全部加载完毕才执行,注意是全部加载,包括dom,图片等其它资源。 而$(document).ready(function(){ alert("hello"); });(1) 当dom加载完就可以执行了。 代码1同时做到表现和逻辑分离。并且可以在不同的js文件中做相同的操作,即$(document).ready (fn)可以在一个页面中重复出现,而不会冲突。基本上Jquery的很多plugin都是利用这个特性,正因为这个特性,多个plugin共同使用起来,在初始化时不会发生冲突。 当使用jquery时,推荐使用代码1。
编辑本段事件机制
我们大量使用的事件可能就是button的onclick了。以前习惯在input 元素上写onclick = "fn()",使用jquery可以使javascrīpt代码与html代码分离,保持HTML的清洁,还可以很轻松地绑定事件,甚至你可以不知道“事件”这个名词。 代码 $(document).ready(function() { $("#clear").click(function(){ alert("i am about to clear the table"); }); $("form[12]").submit(validate); }); function validate(){ //do some form validation }
编辑本段同一函数实现get\set
代码 $("selector").load(url,data,function(response,status,xhr)) 该方法是最简单的从服务器获取数据的方法。它几乎与 $.get(url, data, success) 等价,不同的是它不是全局函数,并且它拥有隐式的回调函数。当侦测到成功的响应时(比如,当 textStatus 为 "success" 或 "notmodified" 时),.load() 将匹配元素的 HTML 内容设置为返回的数据。这意味着该方法的大多数使用会非常简单。
编辑本段ajax
这是一个ajax横行的时代。多少人,了不了解ajax的都跟着用上一把。呵。使用jquery实现ajax同样异常简单 代码 (1) $.get("search. do",{id:1},rend); function rend(xml){ alert(xml); } (2) $.post("search. do",{id:1},rend); function rend(xml){ alert(xml); } (3) $("#msg").ajaxStart(function(){ this.html("正在加载。。。。"); }); (4) $("#msg").ajaxSuccess(function(){ this.html("加载完成!"); }); 这些都是较常用的方法,get和post用法一样。第一个参数是异步请求的url,第二个为参数,第三个回调方法。 (4)的方法会在指定的Dom对象上绑定响应ajax执行的事件。 (5)同步加载数据。发送请求时锁住浏览器。需要锁定用户交互操作时使用同步方式。 var html = $.ajax({ url: "some.php", async: false }).responseText; (6) 保存数据到服务器,成功时显示信息。 $.ajax({ type: "POST", url: "some.php", data: "name=John&location=Boston", success: function(msg){ alert( "Data Saved: " + msg ); } });
编辑本段渐入淡出
代码 $("#msg").show("fast"); $("#msg").hide("slow"); $("#msg").fadeIn(); $("#msg").fadeOut(); 没错,上面两行代码已经分别实现了一个id为Msg的jquery对象的渐入和淡出。做一个像Gmail一样的动态加载通知条,用jquery就那么简单。两个函数接受的参数除了快慢等,还可以接收整型,作为渐入或淡出的完成时间,单位为MS。
编辑本段plugin
这也是一个插件的时代。 jquery插件给我的感觉清一色的清洁,简单。如Jtip,要使用它的功能,只需要在你的元素的class上加上Jtip,并引入jtip.js及其样式即可以了。其他事情插件全包。我喜欢jquery的一个重要原因是发现她已经有了很多很好,很精彩的插件。 写得很烂。可能大家看不出jquery的好处。嗯,光听是没用的,试用一下吧。你会发觉很有趣。 暂时告一段落吧。待有新的发现再来分享。 加一些Jquery的资源: http://www.visualjquery. com/index.xml 很好的API查询站点 http://jquery. com/demo/thickbox/ 知道lightBox吧,看看Jquery是怎样实现相同的东西 http://jquery. org. cn/visual/cn/index.xml //不错的JQUERY 中文学习 推荐 微软的visual studio 2008 sp1支持对jquery的动态提示,只要在代码页导入对应的vsdoc脚本就可以。 目前为止,jQuery的最新版本为1.7.2。
编辑本段历史版本
jQuery 1.0(2006年8月):该库的第一个稳定版本,已经具有了对CSS选择符、事件处理和AJAX交互的稳健支持。 jQuery 1.1(2007年1月):这一版大幅简化了API。许多较少使用的方法被合并,减少了需要掌握和解释的方法数量。 jQuery 1.1.3(2007年7月):这次小版本变化包含了对jQuery选择符引擎执行速度的显著提升。从这个版本开始,jQuery的性能达到了Prototype、Mootools以及Dojo等同类JavaScript库的水平。 jQuery 1.2(2007年9月):这一版去掉了对XPath选择符的支持,原因是相对于CSS语法它已经变得多余了。这一版能够支持对效果的更灵活定制,而且借助新增的命名空间事件,也使插件开发变得更容易。 jQuery UI(2007年9月):这个新的插件套件是作为曾经流行但已过时的Interface插件的替代项目而发布的。jQuery UI中包含大量预定义好的部件(widget),以及一组用于构建高级元素(例如可拖放的界面元素)的工具。 jQuery 1.2.6(2008年5月):这一版主要是将Brandon Aaron开发的流行的Dimensions插件的功能移植到了核心库中。 jQuery 1.3(2009年1月):这一版使用了全新的选择符引擎Sizzle,库的性能也因此有了极大提升。这一版正式支持事件委托特性。 jQuery 1.3.2(2009年2月):这次小版本升级进一步提升了库的性能,例如改进了:visible/:hidden选择符、.height()/.width()方法的底层处理机制。另外,也支持查询的元素按文档顺序返回。 jQuery 1.4(2010年1月14号对)代码库进行了内部重写组织,开始建立一些风格规范。老的core.js文件被分为attribute.js, css.js, data.js, manipulation.js, traversing.js和queue.js;CSS和attribute的逻辑分离。 jQuery 1.5(2011年1月31日):该版本修复了83个bug,解决了460个问题。重大改进有:重写了Ajax模块;新增延缓对像(Deferred Objects);jQuery替身——jQuery.sub();增强了遍历相邻节点的性能;jQuery开发团队构建系统的改进。 1.4重要新特性: ·常用方法的性能大幅提升:重写了大部分较早期的函数; ·更容易使用的设置函数(setter function):为所有对象新增了许多易用的设置函数; ·对Ajax的改进:引入了许多Ajax和JSON处理方面的更新,包括HTML5元素的序列化; ·attribute(改进了.attr()的性能)、jQuery()核心函数、CSS(.css()性能有两倍提升)、特效和事件、DOM操作等也有显著改进 1.5 美国时间1月31日John Resig在jQuery官方博客发表文章,宣布jQuery 1.5正式版已经如期开发完成,可以下载使用。压缩版本jQuery Minified29KB,不压缩版本jQuery Regular(用于阅读和调试)207KB。由于jQuery已经成为目前最流行的JavaScript库,得到广泛的支持,新版本的发布当然非常引人注目。 重要变化: 1. Ajax重写Ajax模块完全进行了重写。新增一个jXHR对象,为不同浏览器内置的XMLHttpRequest提供了一致的超集。对于XMLHttpRequest之外的传输机制,比如JSONP请求,jXHR对象也可以进行处理。(详情可以参见:jQuery.ajax文档) 此外,系统的可扩展性大大增强,可以附加各种数据处理器、过滤器和传输机制,为开发新的Ajax插件提供了方便。 2. 延迟对象 延迟对象(Deferred Object,jQuery.Deferred对象)是一个可链接的(chainable)实用工具对象,实现了Promise接口,可以在回调队列中注册多个回调、调用回调队列并转发任何同步/异步函数的成败状态。正如Using Deferreds in jQuery 1.5一文中说明的,其结果是在jQuery中能够将依赖于某个任务(事件)结果的逻辑与任务本身解耦了。这一点在JavaScript中其实并不新鲜,Mochikit和Dojo等已经实现有些日子了。由于jQuery 1.5的Ajax模块内置使用了延迟对象,因此现在通过jQuery编写Ajax程序将自动获得这一功能。 开发人员借此可以使用无法立即获得的返回值(如异步Ajax请求的返回结果),而且第一次能够附加多个事件处理器。 例如,使用了新的jQuery内部Ajax API就可以实现下面的代码了: // Assign handlers immediately after making the request, // and remember the jxhr object for this request var jxhr = $.ajax({ url: "example.php" }) .success(function() { alert("success"); }) .error(function() { alert("error"); }) .complete(function() { alert("complete"); });// perform other work here ... // Set another completion function for the request above jxhr.complete(function(){ alert("second complete"); }); 此外,使用jQuery.Deferred还可以开发自己的延迟对象。更多详情参见:延迟对象文档。 3. jQuery.sub() jQuery 1.5提供了一种创建和修改jQuery副本的方式。可以用来添加不向外部公开的方法,或者对jQuery的某些方法进行重新定义以提供新功能,或者提供更好的封装、避免名称空间冲突。当然,也可以用来开发插件,但Resig强烈建议在开发插件之前,先考虑jQuery UI widget工厂。 值得注意的是,sub函数并不提供真正的隔离,所有方法、数据、调用仍然依靠jQuery本身来支持。 4. 遍历性能提高 在新版本中.children(), .pre(), .next()几个常用的遍历函数性能有了显著提高。 5. 内部开发系统 John Resig还特别提到了jQuery团队内部开发系统的两点改变:一是服务器端用Node.js替换了老的Java/Rhino系统,使得团队可以专注于JavaScript环境的新变化;二是所用的代码优化程序从Google Closure切换到UglifyJS,新工具的压缩效果非常令人满意。 有意思的是,此前UglifyJS开发者曾经公布过自己的测试结果,表明对jQuery的压缩结果UglifyJS要比Closure略大(都在72KB左右),但运行速度快得多,而且Closure不太安全。看来,这段时间UglifyJS的进展也很快啊。 jQuery 1.5.2 在1.5的基础上修正的大量的bug 1,7b 2011年09月29日jQuery 1.7 的第一个 beta 测试版本,该版本修复了超过 50 个的问题以及带来一些新特性。 2011年11月-04日jQuery1.7正式版发布。 新版本包含了很多新的特征,特别提升了事件委派时的性能尤其是在IE7下。 新增及改进项: 1. 新的事件 APIs: .on() and .off(); 2. 提升了事件委派时的性能有了大幅度的提升,尤其是在IE7下; 3. 更好的在 IE 6/7/8 上支持 HTML5; 4. 切换动画更加直观; 5. 匿名模块定义 AWD 6. jQuery.Deferred 7. jQuery.isNumeric() 被删除的方法: event.layerX and event.layerY jQuery.isNaN() 2012年03月24日jQuery 1.7.2正式版发布。 该版本在1.7.1的基础上修复了大量的bug,并改进了部分功能。而相比于1.7.2 RC1,只修复了一个bug。值得注意的是:如果你正在使用jQuery Mobile,请使用最新的jQuery 1.7.2和jQuery Mobile 1.1这两个版本,因为之前的jQuery Mobile版本还基于jQuery core 1.7.1或更早的版本。
编辑本段1、新的事件.on() .off()
旧的 API(jQuery 1.7之前) 新的 API(jQuery 1.7)
$(elems).bind(events, fn) $(elems).on(events, fn)
$(elems).bind(events, { mydata: 42 }, fn) $(elems).on(events, { mydata: 42 }, fn)
$(elems).unbind(events, fn) $(elems).off(events, fn)
$(elems).delegate(events, selector, fn) $(elems).on(events, selector, fn)
$(elems).undelegate(events, selector, fn) $(elems).off(events, selector, fn)
$(selector).live(events, fn) $(document).on(events, selector, fn)
$(selector).die(events, fn) $(document).off(events, selector, fn)
编辑本段3、动画的改进
在jQuery 1.7版之前,如果你在完成前停止动画,它可以创建的情况下被动画的元素永远不会返回到其全尺寸,它基本上停留在高度,这是停止动画时。 我们记住的原始尺寸固定,动画开始之前,让他们以后可以使用。 这消除了一大烦恼,尤其是在使用一定的动画切换的。
编辑本段1.42版介绍
jQuer1.4.2版本修复了1.4版本的一些错误和优化了一些不错的改进,速度比1.4.1版本又提升
了一倍,该版本对性能做了一些改进,同时增加了一些api ( .delegate() and .undelegate(). ),右图是JQuery各个版本的性能比较: jquery1.42新特性: 加了两个新方法:.delegate() 和.undelegate(). 是对.live() and .die() 的补充. 这两个方法对特定的事件的起到简化。 范例: $("table").delegate("td", "hover", function(){ $(this).toggleClass("hover"); }); 等于使用 .live(): $("table").each(function(){ $("td", this).live("hover", function(){ $(this).toggleClass("hover"); }); }); 另外,以下代码中,.live() 基本上等同于 .delegate(). $(document).delegate("td", "hover", function(){ $(this).toggleClass("hover"); }); 变更 大量代码进行了重写, 提升了性能及修正了一些长期存在的问题。 提升性能 每次开发新的jquery版本,我们都努力去持续优化性能,以保证你能用到最高性能的javascript代码。 在Taskspeed benchmark 的测试中,1.4.2比1.4.1快1倍,比1.3.2快2倍。 主要是在下面4个方面进行了提升: .bind() 和 .unbind(). .empty(), .remove(), 和 .html(). 插入单个DOM 节点到 document. $("body") 在测试用例中,比较多的用到了 $("body"), .bind(), .unbind()方法,因此测试结果提升比较明显。 v重写事件 event handlers 不再作为一个对象属性保存在 jQuery的内部对象里。现在是保存在一个内部的对象数组里。v 现在可以通过调用.data("events") , 将会返回一个对象包含的所有事件类型。 现在可以使用不同的数据、命名空间、事件类型绑定在同一个handler 在一个handler清除自己之后,事件handler会继续执行 不用关联数据或者命名空间到事件handler 不用再使用代理方法 事件执行的顺序在所有浏览器中得到保证,Google Chrome 中出现的对象循环逻辑问题已经得到解决.
编辑本段JQuery插件
【基础】 a)样式 很 多人会认为样式是个很复杂的东西,需要沉着冷静的心态加上非凡的审美观才能设计出赏心悦目的UI,抛开图片设计不说,其实css也就是那么些属 性:position,margin,padding,width,height,left,top,float,border,background… UI设计的漂亮与否在很大程度上依赖于设计人员对配色的把握和整体效果的协调。 b)脚本 我们同样需要对javascript有着深刻的理解,对dom, xhr, Regex, call-apply, prototype等都应该有一定的了解。 有人会说要这些有啥用啊,对dom的操作其实通过getElementById, getElementsByTagName以及其他的API都可以轻松的完成,这话是没错,当思路确定后,思想才是重点,一段代码是精华还是糟粕很容易就 可以区分出来,究其原因还是取决你自己 【实践】 jQuery开发或使用,更多的灵感是来自实践,而不是copy||paste(奉行拿来主义的同学可以离开了)。 那么在这里我会用一个简单的例子来阐述jQuery插件开发的流程,能否举一反三就看各位看官了。 【目的】 开发一个插件之前我们需要对自己的目的有一个清醒的认识,有很明确的方向感,那么此次我作为示例插件的目的,就是呈现一个用于UI的Slider – 滑动条,常年从事于或暂时专注于win32开发的同学应该比较了解。 【草图】 真正动手编码之前我们还需要有一个草图来描述自己插件的“长相”(事件驱动或API封装的可以忽略)。 很多的同学在做UI开发前往往会忙于搜集各种小图片(非精通ps或iconworkshop人士),其实漂亮的图标的确可以美化我们的UI,不过我一般的处理方式是编写易于扩展的css,前期的UI呈现尽量少使用图片,多用线条完成。 【编码】 开发jQuery UI/Effect 插件在很多时候都需要与UI交互,因此在呈现上需要提供Html tree来绘制我们的插件,最终通过js dom来输出,那么在绘制简单的dom结构的时候我会直接用js来完成,不过如果嵌套比较复杂的话,我们还是应该先用html来完成,然后转变成js输 出。 【扩展】 有的时候用户却不是那么容易满足,于是有人高呼:“我要自己设置value,为什么不提供这个功能?”。 那么这时我们就需要为用户公开一个方法,用于设置jSlider的value,首先考虑的是作为方法需要一个作用对象(jSlider),那么此时我又不 想将作用对象作为参数传入,那么我们还是将这个方法作为插件来开发,我们将方法命名为setSliderValue,开放2个参数,v(value值)和 callback(设置完成后的回调函数)。 【插件】 其实网上已经有成百上千种插件了,应该可以满足大家的需求了。 【小结】 通篇到这里就结束了,简单的介绍了一款jQuery插件的开发流程,以及开发中应该注意的细节,那么在下一篇的文章中我会向大家介绍如何打造一个通用型的 自动完成 插件。
编辑本段让Dreamweaver支持提示代码功能
要让Dreamweaver支持jQuery自动提示代码功能,方法很简单,下载一个插件—jQuery_API.mxp,以及cs4的jQuery语法提示插件 (详细步骤见参考资料 [1])。 在Dreamweaver里依次选择“命令” -> “扩展管理” -> “安装扩展” -> …,就会自动安装了。 成功后重启Dreamweaver,就大功告成了。
编辑本段引入JQuery
在head标签内加入这个 [removed][removed] 这里的src是你的jQuery库文件的位置,可以到jquery官网下载。 这样就引入了jquery,就可以使用了。在代码中,遇到$一般就表示用了jquery。为什么要说一般呢?因为除了jquery,javascript还有一个库,用的也是$符(property库)。 jquery也给出了在遇到这种情况的解决办法,所以jquery是个很强大、开放、友好的js库。 下面举例: [removed] $(document).ready(function(){ //write your code here }) [removed] 上面代码中$(document).ready(function()中的$就是jquery的简写,可以用jquery代替。这个ready函数是在DOM就绪后发生,他比传统的javascript方法更合理。 jquery在选取节点方面非常强大,jquery有一系列的选择器可供使用,非常简洁、高效。 基本选择器(3种): $("标签名"),如$("p")是选取了所有的p标签节点 $("#id名"),如$("#test")是选取了id为test的标签节点 $(".class名"),如$(".test")是选取了所有class为test的标签节点 上面的$("标签名")和$(".class名")返回的都是所有满足的节点,至于进一步筛选可以添加一些函数,如eq,gt,lt等等。 当然,jquery还有很多选择器
百度自動補全組件
CCC_AutoComplete.prototype.queryData = function(){
var keyVal = event.keyCode;
var ccc = this;
ccc.keyVal = keyVal;
var url = this.url;
var params = this.params;
if(keyVal*1!=38&&keyVal;*1!=13&&keyVal;*1!=40){
window.clearTimeout(CCC_AOTO_COMPLETE_TIMEOUT);
CCC_AOTO_COMPLETE_TIMEOUT = setTimeout(function(){
$.ajax({
type: "POST",
url: url,
data: params,
async: false,
success: function(data){
if(data.lastIndexOf(",")==data.length-1){
data = data.substring(0, data.lastIndexOf(","));
}
ccc.msg = data.split(",");
}
});
ccc.run();
}, 500);
}else{
this.setAutoDivStyle();
this.addEvent();
}
};
日期時間控件及用法
一、 只選擇日期:
<input id="request_date" name="request_date" class="Wdate" type="text"
value=""/>
二、 選擇今天之后(含今天)的日期:
<input id="request_date" name="request_date" class="Wdate" type="text"
value=""/>
三、 選擇今天之前(含今天)的日期
<input id="request_date" name="request_date" class="Wdate" type="text"
value=""/>
四、 選擇日期同時觸發函數:
<input id="request_date" name="request_date" class="Wdate" type="text"
value=""/>
五、 選擇日期和時間(時,分,秒)
<input id="request_date" name="request_date" class="Wdate" type="text"
readonly="readonly" value=""/>
六、 選擇當前時間之后的時間(時,分,秒)
<input id="request_date" name="request_date" class="Wdate" type="text" readonly="readonly" value=""/>
七、 選擇當前時間之錢后的時間(時,分,秒)
<input id="request_date" name="request_date" class="Wdate" type="text" readonly="readonly" value=""/>
java的传值与传引用详解
1. 简单类型是按值传递的
Java 方法的参数是简单类型的时候,是按值传递的 (pass by value)。这一点我们可以通过一个简单的例子来说明:
/* 例 1 */
/**
* @(#) Test.java
* @author fancy
*/
public class Test {
public static void test(boolean test) {
test = ! test;
System.out.println("In test(boolean) : test = " + test);
}
public static void main(String[] args) {
boolean test = true;
System.out.println("Before test(boolean) : test = " + test);
test(test);
System.out.println("After test(boolean) : test = " + test);
}
}
运行结果:
Before test(boolean) : test = true
In test(boolean) : test = false
After test(boolean) : test = true
不难看出,虽然在 test(boolean) 方法中改变了传进来的参数的值,但对这个参数源变量本身并没有影响,即对 main(String[]) 方法里的 test 变量没有影响。那说明,参数类型是简单类型的时候,是按值传递的。以参数形式传递简单类型的变量时,实际上是将参数的值作了一个拷贝传进方法函数的,那么在方法函数里再怎么改变其值,其结果都是只改变了拷贝的值,而不是源值。
2. 什么是引用
Java 是传值还是传引用,问题主要出在对象的传递上,因为 Java 中简单类型没有引用。既然争论中提到了引用这个东西,为了搞清楚这个问题,我们必须要知道引用是什么。
简单的说,引用其实就像是一个对象的名字或者别名 (alias),一个对象在内存中会请求一块空间来保存数据,根据对象的大小,它可能需要占用的空间大小也不等。访问对象的时候,我们不会直接是访问对象在内存中的数据,而是通过引用去访问。引用也是一种数据类型,我们可以把它想象为类似 C 语言中指针的东西,它指示了对象在内存中的地址——只不过我们不能够观察到这个地址究竟是什么。
如果我们定义了不止一个引用指向同一个对象,那么这些引用是不相同的,因为引用也是一种数据类型,需要一定的内存空间来保存。但是它们的值是相同的,都指示同一个对象在内存的中位置。比如
String a = "Hello";
String b = a;
这里,a 和 b 是不同的两个引用,我们使用了两个定义语句来定义它们。但它们的值是一样的,都指向同一个对象 "Hello"。也许你还觉得不够直观,因为 String 对象的值本身是不可更改的 (像 b = "World"; b = a; 这种情况不是改变了 "World" 这一对象的值,而是改变了它的引用 b 的值使之指向了另一个 String 对象 a)。那么我们用 StringBuffer 来举一个例子:
/* 例 2 */
/**
* @(#) Test.java
* @author fancy
*/
public class Test {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("Hello");
StringBuffer b = a;
b.append(", World");
System.out.println("a is " + a);
}
}
运行结果:
a is Hello, World
这个例子中 a 和 b 都是引用,当改变了 b 指示的对象的值的时候,从输出结果来看,a 所指示的对象的值也改变了。所以,a 和 b 都指向同一个对象即包含 "Hello" 的一个 StringBuffer 对象。
这里我描述了两个要点:
引用是一种数据类型,保存了对象在内存中的地址,这种类型即不是我们平时所说的简单数据类型也不是类实例(对象);
不同的引用可能指向同一个对象,换句话说,一个对象可以有多个引用,即该类类型的变量。
3. 对象是如何传递的呢
关于对象的传递,有两种说法,即“它是按值传递的”和“它是按引用传递的”。这两种说法各有各的道理,但是它们都没有从本质上去分析,即致于产生了争论。
既然现在我们已经知道了引用是什么东西,那么现在不妨来分析一下对象作是参数是如何传递的。还是先以一个程序为例:
/* 例 3 */
/**
* @(#) Test.java
* @author fancy
*/
public class Test {
public static void test(StringBuffer str) {
str.append(", World!");
}
public static void main(String[] args) {
StringBuffer string = new StringBuffer("Hello");
test(string);
System.out.println(string);
}
}
运行结果:
Hello, World!
test(string) 调用了 test(StringBuffer) 方法,并将 string 作为参数传递了进去。这里 string 是一个引用,这一点是勿庸置疑的。前面提到,引用是一种数据类型,而且不是对象,所以它不可能按引用传递,所以它是按值传递的,它么它的值究竟是什么呢?是对象的地址。
由此可见,对象作为参数的时候是按值传递的,对吗?错!为什么错,让我们看另一个例子:
/* 例 4 */
/**
* @(#) Test.java
* @author fancy
*/
public class Test {
public static void test(String str) {
str = "World";
}
public static void main(String[] args) {
String string = "Hello";
test(string);
System.out.println(string);
}
}
运行结果:
Hello
为什么会这样呢?因为参数 str 是一个引用,而且它与 string 是不同的引用,虽然它们都是同一个对象的引用。str = "World" 则改变了 str 的值,使之指向了另一个对象,然而 str 指向的对象改变了,但它并没有对 "Hello" 造成任何影响,而且由于 string 和 str 是不同的引用,str 的改变也没有对 string 造成任何影响,结果就如例中所示。
其结果是推翻了参数按值传递的说法。那么,对象作为参数的时候是按引用传递的了?也错!因为上一个例子的确能够说明它是按值传递的。
结果,就像光到底是波还是粒子的问题一样,Java 方法的参数是按什么传递的问题,其答案就只能是:即是按值传递也是按引用传递,只是参照物不同,结果也就不同。
4. 正确看待传值还是传引用的问题
要正确的看待这个问题必须要搞清楚为什么会有这样一个问题。
实际上,问题来源于 C,而不是 Java。
C 语言中有一种数据类型叫做指针,于是将一个数据作为参数传递给某个函数的时候,就有两种方式:传值,或是传指针,它们的区别,可以用一个简单的例子说明:
/* 例 5 */
/**
* @(#) test.c
* @author fancy
*/
void SwapValue(int a, int b) {
int t = a;
a = b;
b = t;
}
void SwapPointer(int * a, int * b) {
int t = * a;
* a = * b;
* b = t;
}
void main() {
int a = 0, b = 1;
printf("1 : a = %d, b = %d/n", a, b);
SwapValue(a, b);
printf("2 : a = %d, b = %d/n", a, b);
SwapPointer(&a, &b);
printf("3 : a = %d, b = %d/n", a, b);
}
运行结果:
1 : a = 0, b = 1
2 : a = 0, b = 1
3 : a = 1, b = 0
大家可以明显的看到,按指针传递参数可以方便的修改通过参数传递进来的值,而按值传递就不行。
当 Java 成长起来的时候,许多的 C 程序员开始转向学习 Java,他们发现,使用类似 SwapValue 的方法仍然不能改变通过参数传递进来的简单数据类型的值,但是如果是一个对象,则可能将其成员随意更改。于是他们觉得这很像是 C 语言中传值/传指针的问题。但是 Java 中没有指针,那么这个问题就演变成了传值/传引用的问题。可惜将这个问题放在 Java 中进行讨论并不恰当。
讨论这样一个问题的最终目的只是为了搞清楚何种情况才能在方法函数中方便的更改参数的值并使之长期有效。
Java 中,改变参数的值有两种情况,第一种,使用赋值号“=”直接进行赋值使其改变,如例 1 和例 4;第二种,对于某些对象的引用,通过一定途径对其成员数据进行改变,如例 3。对于第一种情况,其改变不会影响到方法该方法以外的数据,或者直接说源数据。而第二种方法,则相反,会影响到源数据——因为引用指示的对象没有变,对其成员数据进行改变则实质上是改变的该对象。
5. 如何实现类似 swap 的方法
传值还是传引用的问题,到此已经算是解决了,但是我们仍然不能解决这样一个问题:如果我有两个 int 型的变量 a 和 b,我想写一个方法来交换它们的值,应该怎么办?
结论很让人失望——没有办法!因此,我们只能具体情况具体讨论,以经常使用交换方法的排序为例:
/** 例 6 */
/**
* @(#) Test.java
* @author fancy
*/
public class Test {
public static void swap(int[] data, int a, int b) {
int t = data[a];
data[a] = data[b];
data[b] = t;
}
public static void main(String[] args) {
int[] data = new int[10];
for (int i = 0; i < 10; i++) {
data[i] = (int) (Math.random() * 100);
System.out.print(" " + data[i]);
}
System.out.println();
for (int i = 0; i < 9; i++) {
for (int j = i; j < 10; j++) {
if (data[i] > data[j]) {
swap(data, i, j);
}
}
}
for (int i = 0; i < 10; i++) {
System.out.print(" " + data[i]);
}
System.out.println();
}
}
运行结果(情况之一):
78 69 94 38 95 31 50 97 84 1
1 31 38 50 69 78 84 94 95 97
swap(int[] data, int a, int b) 方法在内部实际上是改变了 data 所指示的对象的成员数据,即上述讨论的第二种改变参数值的方法。希望大家能够举一反三,使用类似的方法来解决相关问题。