Java北京java培训机构排行榜 构有哪些?

properties配备资源文件处理_javascript 惯用代码大全_javascript:prototype原形(转)__脚本百事通
稍等,加载中……
^_^请注意,有可能下面的2篇文章才是您想要的内容:
properties配备资源文件处理
javascript 惯用代码大全
javascript:prototype原形(转)
properties配备资源文件处理
properties配置资源文件处理除了自己实现java文本处理properties配置资源文件这个坏习惯之外,使用JDK自带类库读取Properties文件的方法主要有三种
ClassLoader.getResourceAsStream ("some/pkg/resource.properties");
Class.getResourceAsStream ("/some/pkg/resource.properties");
ResourceBundle.getBundle ("some.pkg.resource");
下面使用示例分别讲解这些方法的应用。建立一个包config,在config包下建一个文件a.properties,并在a.properties下添加如下信息:
# key = value
name = kaka
建立一个包prop,在prop包下建立一个名为 PropertiesWithStream 的java类文件。由于前两种方法的实现非常类似:
import java.io.IOE
import java.io.InputS
import java.util.P
// 參考 /text/1824271.html
public class PropertiesWithStream {
public static void main(String[] args) throws IOException {
PropertiesWithStream propLoader = new PropertiesWithStream();
System.out.println("--- Properties from Class.getResourceAsStream ---");
// 注意,class里的getResourceAsStream()方法里参数的类路径一定要在前面加上"/",否则会报错
InputStream in = propLoader.getClass().getResourceAsStream(
"/config/a.properties");
displayAllProperties(getPropertiesFromInputStream(in));
System.out.println("--- Properties from ClassLoader.getResourceAsStream ---");
// 注意,ClassLoader的getResourceAsStream()方法里参数的类路径一定不要在前面加上"/",否则会报错,是不是很奇怪。
in = propLoader.getClass().getClassLoader().getResourceAsStream(
"config/a.properties");
displayAllProperties(getPropertiesFromInputStream(in));
private static Properties getPropertiesFromInputStream(InputStream in)
throws IOException {
Properties prop = new Properties();
prop.load(in);
private static void displayAllProperties(Properties prop) {
for (Object key : prop.keySet())
System.out.println(key + " : " + prop.getProperty(key.toString()));
这里将properties文件的内容读在了一个Properties类中,Properties文件时Hashtable的一个子类,用来处理配置文件的键值对。上面的示例介绍了Properties的load方法,和遍历方法,下面介绍它的另一些有用的方法:
// 获取 color 的属性值,如没有将以 green 的默认值替代
String color = prop.getProperty("color", "gray");
// 设定 color 的属性值为 red
prop.setProperty("color", "red");
// 将Properties存辉一个配置文件中
prop.store(new FileOutputStream(configfilePath), "MyApp Config File");
另一种方式是使用 ResourceBundle 类来处理这类资源,其使用方法非常简单,而且还有利于本地化的实现,下面举例说明一下。
我们在 a 的相同路径下创建一个 a_en_UK.properties,其内容与a.properties一样为:
# key = value
name = kaka
再创建一个 a_zh.properties,使用native2ascii命令或类似工具将“卡卡”这样的非西欧字符转换成ascii码文件格式,其内容为:
# key = value
使用 ResourceBundle 只需要几行就能完成资源的绑定工作,可以看到这个资源的命名可以使用'.'或'/'分隔,效果是一样的。这里还使用了不同的Locale的不同显示效果,
其中具体的后缀名可以使用getLanguage 和 getCountry 来确定,例如Locale.UK 的
language和country分别是en 和 UK,所以Locale.UK对应的资源文件是a_en_UK.properties
import java.util.L
import java.util.ResourceB
// /java/doc/26940.html
public class TestProperties
public static void main(String []args) {
System.out.println("--- Default Locale ---");
ResourceBundle resource = ResourceBundle.getBundle("config/a");
displayResourceBundle(resource);
System.out.println("--- Locale.UK ---");
resource = ResourceBundle.getBundle("config.a", Locale.UK);
displayResourceBundle(resource);
private static void displayResourceBundle(ResourceBundle resource) {
for (Object key : resource.keySet())
System.out.println(key + " : " + resource.getString(key.toString()));
当配置的使用更加复杂时,我们可能需要更多提供更多的功能,此时可以使用Apache Commons Configuration
来帮助管理我们的配置文件。Apache
Commons Configuration提供了丰富的功能来处理配置工作,不好的地方是需要在工程中引入好几个jar文件才能够正常工作,具体的 Runtime Dependencies 见这里
http://commons.apache.org/configuration/dependencies.html
这里举一个简单的例子来说明Apache Commons Configuration的使用方法。首先在config包下建一个文件application.properties,并在文件中添加如下信息:
application.name = Killer App
application.version = 1.6.2
application.title = ${application.name} ${application.version}
注意到这里使用了变量代换的语法,下面是一个java示例,可以看到Apache Commons Configuration不仅对property加了类型转换,还能处理队列的形式,并且能很容易做出与XML文件类型的转换
import java.util.I
import java.util.L
import java.util.P
import mons.configuration.ConfigurationC
import mons.configuration.ConfigurationU
import mons.configuration.PropertiesC
import mons.configuration.XMLC
public class ApacheConfigurationTest {
* @throws ConfigurationException
* @param args
public static void main(String[] args) throws Exception{
PropertiesConfiguration config = new PropertiesConfiguration("config/application.properties");
// Using Variable Interpolation
System.out.println(config.getString("application.title"));
// Get a Properties object with the Configuration
Properties prop = ConfigurationConverter.getProperties(config);
Iterator iterator =
config.getKeys();
while(iterator.hasNext()) {
String key = iterator.next().toString();
System.out.println(key + " : " + config.getProperty(key));
config.setListDelimiter('/');
// Change the list delimiter character to a slash
// Now add some properties
config.addProperty("magicnumber", 42);
config.addProperty("colors.pie",
new String[] { "#FF0000", "#00FF00", "#0000FF" });
config.addProperty("colors.graph", "#FFCC/#6422FF");
// Access data
int magic = config.getInt("magicnumber");
List&String& colPie = config.getList("colors.pie");
String firstPieColor = config.getString("colors.pie");
String[] colGraph = config.getStringArray("colors.graph");
// Notice 当文件路径中包含中文字符时可能会有乱码文件夹出现
config.save("config/app.properties");
// get the XML configuration file
XMLConfiguration hc =
new XMLConfiguration( ConfigurationUtils.convertToHierarchical(config));
hc.save(System.out);
除了对配置文件的处理,Apache Commons Configuration还能对不同的配置源进行整合处理,这里就不再介绍了,感兴趣的请参考其主页。
javascript 惯用代码大全
javascript 常用代码大全
javascript 常用代码大全 //打开模式对话框 function doSelectUser(txtId) {
strFeatures="dialogWidth=500dialogHeight=360center=middle=help=status=scroll=no";
var url,strR
url="selUser.aspx";
strReturn=window.showModalDialog(url,'',strFeatures);
}//返回模式对话框的值 function okbtn_onclick() { var commstr='';
window.returnValue=
window.close() ; } 全屏幕打开 IE 窗口 var winWidth=screen.availW var winHeight=screen.availHeight-20; window.open("main.aspx","surveyWindow","toolbar=no,width="+ winWidth
+",height="+ winHeight
+",top=0,left=0,scrollbars=yes,resizable=yes,center:yes,statusbars=yes"); break //脚本中中使用xml function initialize() {
var xmlDoc
var xslDoc
xmlDoc = new ActiveXObject('Microsoft.XMLDOM')
xmlDoc.async =
xslDoc = new ActiveXObject('Microsoft.XMLDOM')
xslDoc.async =
xmlDoc.load("tree.xml")
xslDoc.load("tree.xsl")
folderTree.innerHTML = xmlDoc.documentElement.transformNode(xslDoc) } 一、验证类 1、数字验证内
1.2 大于0的整数 (用于传来的ID的验证)
1.3 负整数的验证
1.4 整数不能大于iMax
1.5 整数不能小于iMin 2、时间类
2.1 短时间,形如 (13:04:06)
2.2 短日期,形如 ()
2.3 长时间,形如 ( 13:04:06)
2.4 只有年和月。形如(2003-05,或者2003-5)
2.5 只有小时和分钟,形如(12:03) 3、表单类
3.1 所有的表单的值都不能为空
3.2 多行文本框的值不能为空。
3.3 多行文本框的值不能超过sMaxStrleng
3.4 多行文本框的值不能少于sMixStrleng
3.5 判断单选框是否选择。
3.6 判断复选框是否选择.
3.7 复选框的全选,多选,全不选,反选
3.8 文件上传过程中判断文件类型 4、字符类
4.1 判断字符全部由a-Z或者是A-Z的字字母组成
4.2 判断字符由字母和数字组成。
4.3 判断字符由字母和数字,下划线,点号组成.且开头的只能是下划线和字母
4.4 字符串替换函数.Replace(); 5、浏览器类
5.1 判断浏览器的类型
5.2 判断ie的版本
5.3 判断客户端的分辨率
6.1 email的判断。
6.2 手机号码的验证
6.3 身份证的验证
二、功能类1、时间与相关控件类
1.2 时间控件
1.3 万年历
1.4 显示动态显示时钟效果(文本,如OA中时间)
1.5 显示动态显示时钟效果 (图像,像手表) 2、表单类
2.1 自动生成表单
2.2 动态添加,修改,删除下拉框中的元素
2.3 可以输入内容的下拉框
2.4 多行文本框中只能输入iMax文字。如果多输入了,自动减少到iMax个文字(多用于短信发送)
3.1 打印控件 4、事件类
4.1 屏蔽右键
4.2 屏蔽所有功能键
4.3 --& 和&-- F5 F11,F9,F1
4.4 屏蔽组合键ctrl+N 5、网页设计类
5.1 连续滚动的文字,图片(注意是连续的,两段文字和图片中没有空白出现)
5.2 html编辑控件类
5.3 颜色选取框控件
5.4 下拉菜单
5.5 两层或多层次的下拉菜单
5.6 仿IE菜单的按钮。(效果如的导航栏目)
5.7 状态栏,title栏的动态效果(例子很多,可以研究一下)
5.8 双击后,网页自动滚屏 6、树型结构。
6.1 asp+SQL版
6.2 asp+xml+sql版
6.3 java+sql或者java+sql+xml 7、无边框效果的制作 8、连动下拉框技术 9、文本排序 10,画图类,含饼、柱、矢量贝滋曲线 11,操纵客户端注册表类 12,DIV层相关(拖拽、显示、隐藏、移动、增加) 13,TABLAE相关(客户端动态增加行列,模拟进度条,滚动列表等) 14,各种&object classid=&相关类,如播放器,flash与脚本互动等 16, 刷新/模拟无刷新 异步调用类(XMLHttp或iframe,frame) 一、验证类 1、数字验证内
/^(-|\+)?\d+$/.test(str)
1.2 大于0的整数 (用于传来的ID的验证)
/^\d+$/.test(str)
1.3 负整数的验证
/^-\d+$/.test(str) 2、时间类
2.1 短时间,形如 (13:04:06)
function isTime(str)
var a = str.match(/^(\d{1,2})(:)?(\d{1,2})\2(\d{1,2})$/);
if (a == null) {alert('输入的参数不是时间格式');}
if (a[1]&24 || a[3]&60 || a[4]&60)
alert("时间格式不对");
return false
2.2 短日期,形如 ()
function strDateTime(str)
var r = str.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/);
if(r==null)
var d= new Date(r[1], r[3]-1, r[4]);
return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]);
2.3 长时间,形如 ( 13:04:06)
function strDateTime(str)
var reg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/;
var r = str.match(reg);
if(r==null)
var d= new Date(r[1], r[3]-1,r[4],r[5],r[6],r[7]);
return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]&&d.getHours()==r[5]&&d.getMinutes()==r[6]&&d.getSeconds()==r[7]);
2.4 只有年和月。形如(2003-05,或者2003-5)
2.5 只有小时和分钟,形如(12:03) 3、表单类
3.1 所有的表单的值都不能为空
&input onblur="if(this.value.replace(/^\s+|\s+$/g,'')=='')alert('不能为空!')"&
3.2 多行文本框的值不能为空。
3.3 多行文本框的值不能超过sMaxStrleng
3.4 多行文本框的值不能少于sMixStrleng
3.5 判断单选框是否选择。
3.6 判断复选框是否选择.
3.7 复选框的全选,多选,全不选,反选
3.8 文件上传过程中判断文件类型 4、字符类
4.1 判断字符全部由a-Z或者是A-Z的字字母组成
&input onblur="if(/[^a-zA-Z]/g.test(this.value))alert('有错')"&
4.2 判断字符由字母和数字组成。
&input onblur="if(/[^0-9a-zA-Z]/g.test(this.value))alert('有错')"&
4.3 判断字符由字母和数字,下划线,点号组成.且开头的只能是下划线和字母
/^([a-zA-z_]{1})([\w]*)$/g.test(str)
4.4 字符串替换函数.Replace(); 5、浏览器类
5.1 判断浏览器的类型
window.navigator.appName
5.2 判断ie的版本
window.navigator.appVersion
5.3 判断客户端的分辨率
window.screen.
window.screen.
6.1 email的判断。
function ismail(mail)
return(new RegExp(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/).test(mail));
6.2 手机号码的验证
6.3 身份证的验证
function isIdCardNo(num)
if (isNaN(num)) {alert("输入的不是数字!");}
var len = num.length,
if (len == 15)
re = new RegExp(/^(\d{6})()?(\d{2})(\d{2})(\d{2})(\d{3})$/);
else if (len == 18)
re = new RegExp(/^(\d{6})()?(\d{4})(\d{2})(\d{2})(\d{3})(\d)$/);
else {alert("输入的数字位数不对!");}
var a = num.match(re);
if (a != null)
if (len==15)
var D = new Date("19"+a[3]+"/"+a[4]+"/"+a[5]);
var B = D.getYear()==a[3]&&(D.getMonth()+1)==a[4]&&D.getDate()==a[5];
var D = new Date(a[3]+"/"+a[4]+"/"+a[5]);
var B = D.getFullYear()==a[3]&&(D.getMonth()+1)==a[4]&&D.getDate()==a[5];
if (!B) {alert("输入的身份证号 "+ a[0] +" 里出生日期不对!");}
} 画图: &OBJECT id=S style="LEFT: 0 WIDTH: 392 TOP: 0 HEIGHT: 240px" height=240 width=392 classid="clsid:-D7AC-11D0-89D5-00A0C90833E6"& &/OBJECT& &SCRIPT& S.DrawingSurface.ArcDegrees(0,0,0,30,50,60); S.DrawingSurface.ArcRadians(30,0,0,30,50,60); S.DrawingSurface.Line(10,10,100,100); &/SCRIPT& 写注册表: &SCRIPT& var WshShell = WScript.CreateObject("WScript.Shell"); WshShell.RegWrite ("HKCU\\Software\\ACME\\FortuneTeller\\", 1, "REG_BINARY"); WshShell.RegWrite ("HKCU\\Software\\ACME\\FortuneTeller\\MindReader", "Goocher!", "REG_SZ"); var bKey =
WshShell.RegRead ("HKCU\\Software\\ACME\\FortuneTeller\\"); WScript.Echo (WshShell.RegRead ("HKCU\\Software\\ACME\\FortuneTeller\\MindReader")); WshShell.RegDelete ("HKCU\\Software\\ACME\\FortuneTeller\\MindReader"); WshShell.RegDelete ("HKCU\\Software\\ACME\\FortuneTeller\\"); WshShell.RegDelete ("HKCU\\Software\\ACME\\"); &/SCRIPT& TABLAE相关(客户端动态增加行列) &HTML& &SCRIPT LANGUAGE="JScript"& function numberCells() {
var count=0;
for (i=0; i & document.all.mytable.rows. i++) {
for (j=0; j & document.all.mytable.rows(i).cells. j++) {
document.all.mytable.rows(i).cells(j).innerText =
} } &/SCRIPT& &BODY onload="numberCells()"& &TABLE id=mytable border=1& &TR&&TH&&&/TH&&TH&&&/TH&&TH&&&/TH&&TH&&&/TH&&/TR& &TR&&TD&&&/TD&&TD&&&/TD&&TD&&&/TD&&TD&&&/TD&&/TR& &TR&&TD&&&/TD&&TD&&&/TD&&TD&&&/TD&&TD&&&/TD&&/TR& &/TABLE& &/BODY& &/HTML& 1.身份证严格验证:&script& var aCity={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"}
function cidInfo(sId){ var iSum=0 var info="" if(!/^\d{17}(\d|x)$/i.test(sId)) sId=sId.replace(/x$/i,"a"); if(aCity[parseInt(sId.substr(0,2))]==null)return "Error:非法地区"; sBirthday=sId.substr(6,4)+"-"+Number(sId.substr(10,2))+"-"+Number(sId.substr(12,2)); var d=new Date(sBirthday.replace(/-/g,"/")) if(sBirthday!=(d.getFullYear()+"-"+ (d.getMonth()+1) + "-" + d.getDate()))return "Error:非法生日"; for(var i = 17;i&=0;i --) iSum += (Math.pow(2,i) % 11) * parseInt(sId.charAt(17 - i),11) if(iSum%11!=1)return "Error:非法证号"; return aCity[parseInt(sId.substr(0,2))]+","+sBirthday+","+(sId.substr(16,1)%2?"男":"女") } document.write(cidInfo("300016"),"&br/&"); document.write(cidInfo("300019"),"&br/&") document.write(cidInfo("111111"),"&br/&") document.write(cidInfo("01001x"),"&br/&"); &/script& 2.验证IP地址 &SCRIPT LANGUAGE="JavaScript"& function isip(s){ var check=function(v){try{return (v&=255 && v&=0)}catch(x){return false}}; var re=s.split(".") return (re.length==4)?(check(re[0]) && check(re[1]) && check(re[2]) && check(re[3])):false } var s="202.197.78.129"; alert(isip(s)) &/SCRIPT& 3.加sp1后还能用的无边框窗口!! &HTML XMLNS:IE& &meta http-equiv="Content-Type" content="text/ charset=gb2312"& &IE:Download ID="include" STYLE="behavior:url(#default#download)" /& &title&Chromeless Window&/title& &SCRIPT LANGUAGE="JScript"& /*--- Special Thanks For andot ---*/ /*
This following code are designed and writen by Windy_sk &&
You can use it freely, but u must held all the copyright items! */ /*--- Thanks For andot Again ---*/var CW_width= 400; var CW_height= 300; var CW_top= 100; var CW_left= 100; var CW_url= "/"; var New_CW= window.createPopup(); var CW_Body= New_CW.document. var content= ""; var CSStext= "margin:1color: border:2border-style:expression(onmouseout=onmouseup=function(){this.style.borderStyle='outset'}, onmousedown=function(){if(event.button!=2)this.style.borderStyle='inset'});background-color:width:16height:14font-size:12line-height:11cursor:D"; //Build Window include.startDownload(CW_url, function(source){content=source}); function insert_content(){ var temp = ""; CW_Body.style.overflow= "hidden"; CW_Body.style.backgroundColor= "white"; CW_Body.style.border=
"solid black 1px"; content = content.replace(/&a ([^&]*)&/g,"&a onclick='parent.open(this.href);return false' $1&"); temp += "&table width=100% height=100% cellpadding=0 cellspacing=0 border=0&"; temp += "&tr style=';font-size:12background:#0099CC;height:20;cursor:default' ondblclick=\"Max.innerText=Max.innerText=='1'?'2':'1';parent.if_max=!parent.if_parent.show_CW();\" onmouseup='parent.drag_up(event)' onmousemove='parent.drag_move(event)' onmousedown='parent.drag_down(event)' onselectstart='return false' oncontextmenu='return false'&"; temp += "&td style='color:#padding-left:5px'&Chromeless Window For IE6 SP1&/td&"; temp += "&td style='color:#padding-right:5' align=right&"; temp += "&span id=Help
onclick=\"alert('Chromeless Window For IE6 SP1
Ver 1.0\\n\\nCode By Windy_sk\\n\\nSpecial Thanks For andot')\" style=\""+CSStext+"font-family:Spadding-right:2\"&?&/span&"; temp += "&span id=Min
onclick='parent.New_CW.hide();parent.blur()' style=\""+CSStext+"font-family:W\" title='Minimum'&0&/span&"; temp += "&span id=Max
onclick=\"this.innerText=this.innerText=='1'?'2':'1';parent.if_max=!parent.if_parent.show_CW();\" style=\""+CSStext+"font-family:W\" title='Maximum'&1&/span&"; temp += "&span id=Close onclick='parent.opener=parent.close()' style=\""+CSStext+"font-family:Spadding-right:2\" title='Close'&x&/span&"; temp += "&/td&&/tr&&tr&&td colspan=2&"; temp += "&div id=include style='overflow:overflow-x:overflow-y: HEIGHT: 100%; width:"+CW_width+"'&"; temp += temp += "&/div&"; temp += "&/td&&/tr&&/table&"; CW_Body.innerHTML = } setTimeout("insert_content()",1000);var if_max = function show_CW(){ window.moveTo(1); if(if_max){ New_CW.show(CW_top, CW_left, CW_width, CW_height); if(typeof(New_CW.document.all.include)!="undefined"){ New_CW.document.all.include.style.width = CW_ New_CW.document.all.Max.innerText = "1"; } }else{ New_CW.show(0, 0, screen.width, screen.height); New_CW.document.all.include.style.width = screen. } } window.onfocus
= show_CW; window.onresize = show_CW; // Move Window var drag_x,drag_y,draging=false function drag_move(e){ if (draging){ New_CW.show(e.screenX-drag_x, e.screenY-drag_y, CW_width, CW_height);
} } function drag_down(e){ if(e.button==2) if(New_CW.document.body.offsetWidth==screen.width && New_CW.document.body.offsetHeight==screen.height) drag_x=e.clientX; drag_y=e.clientY; draging= e.srcElement.setCapture(); } function drag_up(e){ draging= e.srcElement.releaseCapture(); if(New_CW.document.body.offsetWidth==screen.width && New_CW.document.body.offsetHeight==screen.height) CW_top
= e.screenX-drag_x; CW_left = e.screenY-drag_y; } &/SCRIPT& &/HTML& 贴两个关于treeview的
&script language="javascript"& &!-- //初始化选中节点 function initchecknode() {
var node=TreeView1.getTreeNode("1");
node.setAttribute("Checked","true");
setcheck(node,"true");
FindCheckedFromNode(TreeView1); } //oncheck事件 function tree_oncheck(tree) {
var node=tree.getTreeNode(tree.clickedNodeIndex);
var Pchecked=tree.getTreeNode(tree.clickedNodeIndex).getAttribute("checked");
setcheck(node,Pchecked);
document.all.checked.value="";
document.all.unchecked.value="";
FindCheckedFromNode(TreeView1); } //设置子节点选中 function setcheck(node,Pc) {
var ChildNode=new Array();
ChildNode=node.getChildren();
if(parseInt(ChildNode.length)==0)
for(i=0;i&ChildNode.i++)
cNode=ChildNode[i];
if(parseInt(cNode.getChildren().length)!=0)
setcheck(cNode,Pc);
cNode.setAttribute("Checked",Pc);
} } //获取所有节点状态 function FindCheckedFromNode(node) {
var i = 0;
var nodes = new Array();
nodes = node.getChildren();
for (i = 0; i & nodes. i++) {
cNode=nodes[i];
if (cNode.getAttribute("Checked"))
AddChecked(cNode);
AddUnChecked(cNode);
if (parseInt(cNode.getChildren().length) != 0 ) {
FindCheckedFromNode(cNode);
} } //添加选中节点 function AddChecked(node) {
document.all.checked.value += node.getAttribute("NodeData");
document.all.checked.value += ','; } //添加未选中节点 function AddUnChecked(node) {
document.all.unchecked.value += node.getAttribute("NodeData");
document.all.unchecked.value += ','; } //--&
&/script& treeview中如何在服务器端得到客户端设置后的节点选中状态
&script language="C#" runat="server"&
private void Button1_Click(object sender, System.EventArgs e)
Response.Write(TreeView1.Nodes[0].Checked);
&script language="javascript"&
function set_check()
var nodeindex = "0";
var node=TreeView1.getTreeNode(nodeindex);
node.setAttribute("Checked","True");
TreeView1.queueEvent('oncheck', nodeindex);
&/script& 三個實用的小技巧:關閉輸入法.禁止貼上.禁止複製 關閉輸入法 本文字框輸入法被關閉:
語法: style="ime-mode:disabled" 範例: &input type="text" name="textfield" style="ime-mode:disabled"& 禁止貼上 本文字框禁止貼上文字:
語法:onpaste="return false" 範例:&input type="text" name="textfield" onpaste="return false"& 禁止複製本文字框禁止複製:
語法:oncopy="" oncut="" 範例:&input name="textfield" type="text" value="不能複製裡面的字" oncopy="" oncut=""& //================================ //Cookie操作 //================================ function getCookieVal (offset) { var endstr = document.cookie.indexOf (";", offset); if (endstr == -1) endstr = document.cookie. return unescape(document.cookie.substring(offset, endstr)); } function GetCookie (name) { var arg = name + "="; var alen = arg. var clen = document.cookie. var i = 0; while (i & clen) { var j = i + if (document.cookie.substring(i, j) == arg) return getCookieVal (j); i = document.cookie.indexOf(" ", i) + 1; if (i == 0)
} function deleteCookie(cname) {
var expdate = new Date();
expdate.setTime(expdate.getTime() - (24 * 60 * 60 * 1000 * 369));
// document.cookie =" ckValue="ok"; expires="+ expdate.toGMTString();
setCookie(cname,"",expdate); }function setCookie (name, value, expires) {
document.cookie = name + "=" + escape(value) +
"; expires=" + expires.toGMTString() ; } 一个可以在页面上随意画线、多边形、圆,填充等功能的js
(part 1) var jg_ihtm, jg_ie, jg_fast, jg_dom, jg_moz, jg_n4 = (document.layers && typeof document.classes != "undefined"); function chkDHTM(x, i) { x = document.body || jg_ie = x && typeof x.insertAdjacentHTML != "undefined"; jg_dom = (x && !jg_ie && typeof x.appendChild != "undefined" && typeof document.createRange != "undefined" && typeof (i = document.createRange()).setStartBefore != "undefined" && typeof i.createContextualFragment != "undefined"); jg_ihtm = !jg_ie && !jg_dom && x && typeof x.innerHTML != "undefined"; jg_fast = jg_ie && document.all && !window. jg_moz = jg_dom && typeof x.style.MozOpacity != "undefined"; } function pntDoc() { this.wnd.document.write(jg_fast? this.htmRpc() : this.htm); this.htm = ''; } function pntCnvDom() { var x = document.createRange(); x.v); x = x.createContextualFragment(jg_fast? this.htmRpc() : this.htm); <v.appendChild(x); this.htm = ''; } function pntCnvIe() { <v.insertAdjacentHTML("BeforeEnd", jg_fast? this.htmRpc() : this.htm); this.htm = ''; } function pntCnvIhtm() { <v.innerHTML += this. this.htm = ''; } function pntCnv() { this.htm = ''; } function mkDiv(x, y, w, h) { this.htm += '&div style="position:'+ 'left:' + x + ''+ 'top:' + y + ''+ 'width:' + w + ''+ 'height:' + h + ''+ 'clip:rect(0,'+w+'px,'+h+'px,0);'+ 'background-color:' + this.color + (!jg_moz? ';overflow:hidden' : '')+ ';"&&\/div&'; } function mkDivIe(x, y, w, h) { this.htm += '%%'+this.color+';'+x+';'+y+';'+w+';'+h+';'; } function mkDivPrt(x, y, w, h) { this.htm += '&div style="position:'+ 'border-left:' + w + 'px solid ' + this.color + ';'+ 'left:' + x + ''+ 'top:' + y + ''+ 'width:0'+ 'height:' + h + ''+ 'clip:rect(0,'+w+'px,'+h+'px,0);'+ 'background-color:' + this.color + (!jg_moz? ';overflow:hidden' : '')+ ';"&&\/div&'; } function mkLyr(x, y, w, h) { this.htm += '&layer '+ 'left="' + x + '" '+ 'top="' + y + '" '+ 'width="' + w + '" '+ 'height="' + h + '" '+ 'bgcolor="' + this.color + '"&&\/layer&\n'; } var regex =
/%%([^;]+);([^;]+);([^;]+);([^;]+);([^;]+);/g; function htmRpc() { return this.htm.replace( regex, '&div style="overflow:position:background-color:'+ '$1;left:$2;top:$3;width:$4;height:$5"&&/div&\n'); } function htmPrtRpc() { return this.htm.replace( regex, '&div style="overflow:position:background-color:'+ '$1;left:$2;top:$3;width:$4;height:$5;border-left:$4px solid $1"&&/div&\n'); } function mkLin(x1, y1, x2, y2) { if (x1 & x2) { var _x2 = x2; var _y2 = y2; x2 = x1; y2 = y1; x1 = _x2; y1 = _y2; } var dx = x2-x1, dy = Math.abs(y2-y1), x = x1, y = y1, yIncr = (y1 & y2)? -1 : 1; if (dx &= dy) { var pr = dy&&1, pru = pr - (dx&&1), p = pr-dx, ox = while ((dx--) & 0) { ++x; if (p & 0) { this.mkDiv(ox, y, x-ox, 1); y += yI p += ox = } else p += } this.mkDiv(ox, y, x2-ox+1, 1); } else { var pr = dx&&1, pru = pr - (dy&&1), p = pr-dy, oy = if (y2 &= y1) { while ((dy--) & 0) { if (p & 0) { this.mkDiv(x++, y, 1, oy-y+1); y += yI p += oy = } else { y += yI p += } } this.mkDiv(x2, y2, 1, oy-y2+1); } else { while ((dy--) & 0) { y += yI if (p & 0) { this.mkDiv(x++, oy, 1, y-oy); p += oy = } else p += } this.mkDiv(x2, oy, 1, y2-oy+1); } } } function mkLin2D(x1, y1, x2, y2) { if (x1 & x2) { var _x2 = x2; var _y2 = y2; x2 = x1; y2 = y1; x1 = _x2; y1 = _y2; } var dx = x2-x1, dy = Math.abs(y2-y1), x = x1, y = y1, yIncr = (y1 & y2)? -1 : 1; var s = this. if (dx &= dy) { if (s-3 & 0) { var _s = (s*dx*Math.sqrt(1+dy*dy/(dx*dx))-dx-(s&&1)*dy) / _s = (!(s-4)? Math.ceil(_s) : Math.round(_s)) + 1; } else var _s = var ad = Math.ceil(s/2); var pr = dy&&1, pru = pr - (dx&&1), p = pr-dx, ox = while ((dx--) & 0) { ++x; if (p & 0) { this.mkDiv(ox, y, x-ox+ad, _s); y += yI p += ox = } else p += } this.mkDiv(ox, y, x2-ox+ad+1, _s); } else { if (s-3 & 0) { var _s = (s*dy*Math.sqrt(1+dx*dx/(dy*dy))-(s&&1)*dx-dy) / _s = (!(s-4)? Math.ceil(_s) : Math.round(_s)) + 1; } else var _s = var ad = Math.round(s/2); var pr = dx&&1, pru = pr - (dy&&1), p = pr-dy, oy = if (y2 &= y1) { ++ while ((dy--) & 0) { if (p & 0) { this.mkDiv(x++, y, _s, oy-y+ad); y += yI p += oy = } else { y += yI p += } } this.mkDiv(x2, y2, _s, oy-y2+ad); } else { while ((dy--) & 0) { y += yI if (p & 0) { this.mkDiv(x++, oy, _s, y-oy+ad); p += oy = } else p += } this.mkDiv(x2, oy, _s, y2-oy+ad+1); } } } function mkLinDott(x1, y1, x2, y2) { if (x1 & x2) { var _x2 = x2; var _y2 = y2; x2 = x1; y2 = y1; x1 = _x2; y1 = _y2; } var dx = x2-x1, dy = Math.abs(y2-y1), x = x1, y = y1, yIncr = (y1 & y2)? -1 : 1, drw = if (dx &= dy) { var pr = dy&&1, pru = pr - (dx&&1), p = pr- while ((dx--) & 0) { if (drw) this.mkDiv(x, y, 1, 1); drw = ! if (p & 0) { y += yI p += } else p += ++x; } if (drw) this.mkDiv(x, y, 1, 1); } else { var pr = dx&&1, pru = pr - (dy&&1), p = pr- while ((dy--) & 0) { if (drw) this.mkDiv(x, y, 1, 1); drw = ! y += yI if (p & 0) { ++x; p += } else p += } if (drw) this.mkDiv(x, y, 1, 1); } } function mkOv(left, top, width, height) { var a = width&&1, b = height&&1, wod = width&1, hod = (height&1)+1, cx = left+a, cy = top+b, x = 0, y = b, ox = 0, oy = b, aa = (a*a)&&1, bb = (b*b)&&1, st = (aa&&1)*(1-(b&&1)) + bb, tt = (bb&&1) - aa*((b&&1)-1), w, while (y & 0) { if (st & 0) { st += bb*((x&&1)+3); tt += (bb&&1)*(++x); } else if (tt & 0) { st += bb*((x&&1)+3) - (aa&&1)*(y-1); tt += (bb&&1)*(++x) - aa*(((y--)&&1)-3); w = x- h = oy-y; if (w&2 && h&2) { this.mkOvQds(cx, cy, -x+2, ox+wod, -oy, oy-1+hod, 1, 1); this.mkOvQds(cx, cy, -x+1, x-1+wod, -y-1, y+hod, 1, 1); } else this.mkOvQds(cx, cy, -x+1, ox+wod, -oy, oy-h+hod, w, h); ox = oy = } else { tt -= aa*((y&&1)-3); st -= (aa&&1)*(--y); } } this.mkDiv(cx-a, cy-oy, a-ox+1, (oy&&1)+hod); this.mkDiv(cx+ox+wod, cy-oy, a-ox+1, (oy&&1)+hod); } 一个可以在页面上随意画线、多边形、圆,填充等功能的js
(part 2) function mkOv2D(left, top, width, height) { var s = this. width += s-1; height += s-1; var a = width&&1, b = height&&1, wod = width&1, hod = (height&1)+1, cx = left+a, cy = top+b, x = 0, y = b, aa = (a*a)&&1, bb = (b*b)&&1, st = (aa&&1)*(1-(b&&1)) + bb, tt = (bb&&1) - aa*((b&&1)-1); if (s-4 & 0 && (!(s-2) || width-51 & 0 && height-51 & 0)) { var ox = 0, oy = b, w, h, pxl, pxr, pxt, pxb, while (y & 0) { if (st & 0) { st += bb*((x&&1)+3); tt += (bb&&1)*(++x); } else if (tt & 0) { st += bb*((x&&1)+3) - (aa&&1)*(y-1); tt += (bb&&1)*(++x) - aa*(((y--)&&1)-3); w = x- h = oy-y; if (w-1) { pxw = w+1+(s&1); h = } else if (h-1) { pxw = h += 1+(s&1); } else pxw = h = this.mkOvQds(cx, cy, -x+1, ox-pxw+w+wod, -oy, -h+oy+hod, pxw, h); ox = oy = } else { tt -= aa*((y&&1)-3); st -= (aa&&1)*(--y); } } this.mkDiv(cx-a, cy-oy, s, (oy&&1)+hod); this.mkDiv(cx+a+wod-s+1, cy-oy, s, (oy&&1)+hod); } else { var _a = (width-((s-1)&&1))&&1, _b = (height-((s-1)&&1))&&1, _x = 0, _y = _b, _aa = (_a*_a)&&1, _bb = (_b*_b)&&1, _st = (_aa&&1)*(1-(_b&&1)) + _bb, _tt = (_bb&&1) - _aa*((_b&&1)-1), pxl = new Array(), pxt = new Array(), _pxb = new Array(); pxl[0] = 0; pxt[0] = _pxb[0] = _b-1; while (y & 0) { if (st & 0) { st += bb*((x&&1)+3); tt += (bb&&1)*(++x); pxl[pxl.length] = pxt[pxt.length] = } else if (tt & 0) { st += bb*((x&&1)+3) - (aa&&1)*(y-1); tt += (bb&&1)*(++x) - aa*(((y--)&&1)-3); pxl[pxl.length] = pxt[pxt.length] = } else { tt -= aa*((y&&1)-3); st -= (aa&&1)*(--y); } if (_y & 0) { if (_st & 0) { _st += _bb*((_x&&1)+3); _tt += (_bb&&1)*(++_x); _pxb[_pxb.length] = _y-1; } else if (_tt & 0) { _st += _bb*((_x&&1)+3) - (_aa&&1)*(_y-1); _tt += (_bb&&1)*(++_x) - _aa*(((_y--)&&1)-3); _pxb[_pxb.length] = _y-1; } else { _tt -= _aa*((_y&&1)-3); _st -= (_aa&&1)*(--_y); _pxb[_pxb.length-1]--; } } } var ox = 0, oy = b, _oy = _pxb[0], l = pxl.length, w, for (var i = 0; i & i++) { if (typeof _pxb[i] != "undefined") { if (_pxb[i] & _oy || pxt[i] & oy) { x = pxl[i]; this.mkOvQds(cx, cy, -x+1, ox+wod, -oy, _oy+hod, x-ox, oy-_oy); ox = oy = pxt[i]; _oy = _pxb[i]; } } else { x = pxl[i]; this.mkDiv(cx-x+1, cy-oy, 1, (oy&&1)+hod); this.mkDiv(cx+ox+wod, cy-oy, 1, (oy&&1)+hod); ox = oy = pxt[i]; } } this.mkDiv(cx-a, cy-oy, 1, (oy&&1)+hod); this.mkDiv(cx+ox+wod, cy-oy, 1, (oy&&1)+hod); } } function mkOvDott(left, top, width, height) { var a = width&&1, b = height&&1, wod = width&1, hod = height&1, cx = left+a, cy = top+b, x = 0, y = b, aa2 = (a*a)&&1, aa4 = aa2&&1, bb = (b*b)&&1, st = (aa2&&1)*(1-(b&&1)) + bb, tt = (bb&&1) - aa2*((b&&1)-1), drw = while (y & 0) { if (st & 0) { st += bb*((x&&1)+3); tt += (bb&&1)*(++x); } else if (tt & 0) { st += bb*((x&&1)+3) - aa4*(y-1); tt += (bb&&1)*(++x) - aa2*(((y--)&&1)-3); } else { tt -= aa2*((y&&1)-3); st -= aa4*(--y); } if (drw) this.mkOvQds(cx, cy, -x, x+wod, -y, y+hod, 1, 1); drw = ! } } 一个可以在页面上随意画线、多边形、圆,填充等功能的js
(part 3) function mkRect(x, y, w, h) { var s = this. this.mkDiv(x, y, w, s); this.mkDiv(x+w, y, s, h); this.mkDiv(x, y+h, w+s, s); this.mkDiv(x, y+s, s, h-s); } function mkRectDott(x, y, w, h) { this.drawLine(x, y, x+w, y); this.drawLine(x+w, y, x+w, y+h); this.drawLine(x, y+h, x+w, y+h); this.drawLine(x, y, x, y+h); } function jsgFont() { this.PLAIN = 'font-weight:'; this.BOLD = 'font-weight:'; this.ITALIC = 'font-style:'; this.ITALIC_BOLD = this.ITALIC + this.BOLD; this.BOLD_ITALIC = this.ITALIC_BOLD; } var Font = new jsgFont(); function jsgStroke() { this.DOTTED = -1; } var Stroke = new jsgStroke(); function jsGraphics(id, wnd) { this.setColor = new Function('arg', 'this.color = arg.toLowerCase();'); this.setStroke = function(x) { this.stroke = if (!(x+1)) { this.drawLine = mkLinD this.mkOv = mkOvD this.drawRect = mkRectD } else if (x-1 & 0) { this.drawLine = mkLin2D; this.mkOv = mkOv2D; this.drawRect = mkR } else { this.drawLine = mkL this.mkOv = mkOv; this.drawRect = mkR } }; this.setPrintable = function(arg) { this.printable = if (jg_fast) { this.mkDiv = mkDivIe; this.htmRpc = arg? htmPrtRpc : htmR } else this.mkDiv = jg_n4? mkLyr : arg? mkDivPrt : mkD }; this.setFont = function(fam, sz, sty) { this.ftFam = this.ftSz = this.ftSty = sty || Font.PLAIN; }; this.drawPolyline = this.drawPolyLine = function(x, y, s) { for (var i=0 ; i&x.length-1 ; i++ ) this.drawLine(x[i], y[i], x[i+1], y[i+1]); }; this.fillRect = function(x, y, w, h) { this.mkDiv(x, y, w, h); }; this.drawPolygon = function(x, y) { this.drawPolyline(x, y); this.drawLine(x[x.length-1], y[x.length-1], x[0], y[0]); }; this.drawEllipse = this.drawOval = function(x, y, w, h) { this.mkOv(x, y, w, h); }; this.fillEllipse = this.fillOval = function(left, top, w, h) { var a = (w -= 1)&&1, b = (h -= 1)&&1, wod = (w&1)+1, hod = (h&1)+1, cx = left+a, cy = top+b, x = 0, y = b, ox = 0, oy = b, aa2 = (a*a)&&1, aa4 = aa2&&1, bb = (b*b)&&1, st = (aa2&&1)*(1-(b&&1)) + bb, tt = (bb&&1) - aa2*((b&&1)-1), pxl, dw, if (w+1) while (y & 0) { if (st & 0) { st += bb*((x&&1)+3); tt += (bb&&1)*(++x); } else if (tt & 0) { st += bb*((x&&1)+3) - aa4*(y-1); pxl = cx-x; dw = (x&&1)+ tt += (bb&&1)*(++x) - aa2*(((y--)&&1)-3); dh = oy-y; this.mkDiv(pxl, cy-oy, dw, dh); this.mkDiv(pxl, cy+oy-dh+hod, dw, dh); ox = oy = } else { tt -= aa2*((y&&1)-3); st -= aa4*(--y); } } this.mkDiv(cx-a, cy-oy, w+1, (oy&&1)+hod); }; this.fillPolygon = function(array_x, array_y) {
var miny, var x1, y1; var x2, y2; var ind1, ind2;
var n = array_x.if (!n)miny = array_y[0]; maxy = array_y[0]; for (i = 1; i & i++) { if (array_y[i] & miny) miny = array_y[i]; if (array_y[i] & maxy) maxy = array_y[i]; } for (y = y &= y++) { var polyInts = new Array(); ints = 0; for (i = 0; i & i++) { if (!i) { ind1 = n-1; ind2 = 0; } else { ind1 = i-1; ind2 = } y1 = array_y[ind1]; y2 = array_y[ind2]; if (y1 & y2) { x1 = array_x[ind1]; x2 = array_x[ind2]; } else if (y1 & y2) { y2 = array_y[ind1]; y1 = array_y[ind2]; x2 = array_x[ind1]; x1 = array_x[ind2]; }
if ((y &= y1) && (y & y2)) polyInts[ints++] = Math.round((y-y1) * (x2-x1) / (y2-y1) + x1); else if ((y == maxy) && (y & y1) && (y &= y2)) polyInts[ints++] = Math.round((y-y1) * (x2-x1) / (y2-y1) + x1); } polyInts.sort(integer_compare); for (i = 0; i & i+=2) { w = polyInts[i+1]-polyInts[i] this.mkDiv(polyInts[i], y, polyInts[i+1]-polyInts[i]+1, 1); } } }; this.drawString = function(txt, x, y) { this.htm += '&div style="position:white-space:'+ 'left:' + x + ''+ 'top:' + y + ''+ 'font-family:' +
this.ftFam + ';'+ 'font-size:' + this.ftSz + ';'+ 'color:' + this.color + ';' + this.ftSty + '"&'+ txt + '&\/div&'; } this.drawImage = function(imgSrc, x, y, w, h) { this.htm += '&div style="position:'+ 'left:' + x + ''+ 'top:' + y + ''+ 'width:' +
w + ';'+ 'height:' + h + ';"&'+ '&img src="' + imgSrc + '" width="' + w + '" height="' + h + '"&'+ '&\/div&'; } this.clear = function() { this.htm = ""; if (v) v.innerHTML = this. }; this.mkOvQds = function(cx, cy, xl, xr, yt, yb, w, h) { this.mkDiv(xr+cx, yt+cy, w, h); this.mkDiv(xr+cx, yb+cy, w, h); this.mkDiv(xl+cx, yb+cy, w, h); this.mkDiv(xl+cx, yt+cy, w, h); }; this.setStroke(1); this.setFont('verdana,geneva,helvetica,sans-serif', String.fromCharCode(0x31, 0x32, 0x70, 0x78), Font.PLAIN); this.color = '#000000'; this.htm = ''; this.wnd = wnd || if (!(jg_ie || jg_dom || jg_ihtm)) chkDHTM(); if (typeof id != 'string' || !id) this.paint = pntD else { <v = document.all? (this.wnd.document.all[id] || null) : document.getElementById? (this.wnd.document.getElementById(id) || null) : this.defhtm = (v && v.innerHTML)? v.innerHTML : ''; this.paint = jg_dom? pntCnvDom : jg_ie? pntCnvIe : jg_ihtm? pntCnvIhtm : pntC } this.setPrintable(false); } function integer_compare(x,y) { return (x & y) ? -1 : ((x & y)*1); }
JS 中,一些东西不可用的三种展现方式。 我们在WEB项目中,有时候需要在用户点击某个东西的时候,一些东西不可用。如果在客户端实现。最简单的就是利用disabled 。下面罗列的其中三种方式:依次是:不可用(disabled);用一个空白来代替这个地方(Blank);这个区域为空(None)。具体可以查看这个Blog的源文件: obj.disabled = obj.style.visibility = "hidden";obj.style.display = "none";&SCRIPT language=javascript& function ShowDisableObject(obj) {
if(obj.disabled == false)
obj.disabled =
obj.disabled =
var coll = obj.all.tags("INPUT");
if (coll!=null)
for (var i=0; i&coll. i++)
coll[i].disabled = obj.
} } function ShowBlankObject(obj) {
if(obj.style.visibility == "hidden")
obj.style.visibility = "visible";
obj.style.visibility = "hidden";
} } function ShowNoneObject(obj) {
if(obj.style.display == "none")
obj.style.display = "block";
obj.style.display = "none";
} } &/SCRIPT&&P&&/P& &DIV id=Show01&dadd &DIV&ccc&/DIV&&INPUT& &INPUT type=checkbox& &/DIV& &P&&INPUT onclick=ShowDisableObject(Show01); type=button value=Disable& &INPUT id=Button1 onclick=ShowBlankObject(Show01); type=button value=Blank name=Button1& &INPUT id=Button2 onclick=ShowNoneObject(Show01); type=button value=None name=Button2& &/P&&!--演示代码结束//--& On this page I explain a simple DHTML example script that features invisibility, moving and the changing of text colour. Example Test TextMake test text invisible. Make test text visible. Move test text 50 pixels down. Move test text 50 pixels up. Change colour to red. Change colour to blue. Change colour to black. Change the font style to italic. Change the font style to normal. Change the font family to 'Times'. Change the font family to 'Arial'. The script The scripts work on this HTML element: &DIV ID="text"&Test Text&/DIV&#text {position: top: 400 left: 400 font: 18 font-weight: 700; } These scripts are necessary for the three effects:var DHTML = (document.getElementById || document.all || document.layers);function getObj(name) {
if (document.getElementById)
this.obj = document.getElementById(name); this.style = document.getElementById(name).
else if (document.all)
{ this.obj = document.all[name]; this.style = document.all[name].
else if (document.layers)
this.obj = document.layers[name];
this.style = document.layers[name];
} } function invi(flag) { if (!DHTML) var x = new getObj('text'); x.style.visibility = (flag) ? 'hidden' : 'visible' } var texttop = 400;function move(amount) { if (!DHTML) var x = new getObj('text'); texttop += x.style.top = } function changeCol(col) { if (!DHTML) var x = new getObj('text'); x.style.color = } 一段实现DataGrid的“编辑”、“取消”功能脚本,目的是不产生页面刷新 &SCRIPT language="javascript"& var selectRow=""; var selectO function EditCell(thisObject,type) { var id = thisObject. var buttonID="Button"+ var row=id.replace(buttonID,""); if(type==1&&selectRow.length&0&&selectObject!=null) { EditRow(selectRow,2,selectObject); selectRow=""; } if(type==1){selectRow=selectObject=thisO}else{selectRow="";selectObject=} EditRow(row,type,thisObject); } function EditRow(row,type,thisObject) { var visible1="none"; var visible2="inline"; if(type!=1) { visible1="inline"; visible2="none"; } var buttonID="Button"+
for(i=1;i&8;i++) { var name1=row+"Img"+i; document.all[name1].getAttribute("style").display=visible1; name1=row+"Text"+i; var name2=row+"Checkbox"+i; document.all[name2].getAttribute("style").display=visible2; if(type!=1) { if(document.all[name1].value==1) document.all[name2].checked= else document.all[name2].checked= } } var tdIndex = thisObject.parentElement.cellI if(type&1) tdIndex = tdIndex -1; thisObject.parentElement.parentElement.cells[tdIndex].getAttribute("style").display=visible2; thisObject.parentElement.colSpan= name=row+buttonID; document.all[name].getAttribute("style").display="none"; if(type==1) { document.all[name].parentElement.parentElement.getAttribute("style").backgroundColor="LightYellow"; name=row+"Button2"; document.all[name].getAttribute("style").display="inline"; } else { document.all[name].parentElement.parentElement.getAttribute("style").backgroundColor=""; name=row+"Button1"; document.all[name].getAttribute("style").display="inline"; } } &/SCRIPT& &asp:datagrid id="GridItem" runat="server" cellPadding="0" BorderStyle="Solid" AutoGenerateColumns="False" Width="100%" AllowPaging="True"& &SelectedItemStyle BackColor="LightYellow"&&/SelectedItemStyle& &EditItemStyle CssClass="tdbg-dark" BackColor="Ivory"&&/EditItemStyle& &ItemStyle HorizontalAlign="Center" Height="23px" CssClass="tdbg"&&/ItemStyle& &HeaderStyle HorizontalAlign="Center" Height="25px" CssClass="summary-title"&&/HeaderStyle& &Columns& &asp:BoundColumn DataField="id" ReadOnly="True" HeaderText="人员编号"& &HeaderStyle Width="120px"&&/HeaderStyle& &/asp:BoundColumn& &asp:BoundColumn ReadOnly="True" HeaderText="姓名"& &HeaderStyle Width="120px"&&/HeaderStyle& &/asp:BoundColumn& &asp:TemplateColumn HeaderText="管理权"& &HeaderStyle Width="60px"&&/HeaderStyle& &ItemTemplate& &IMG id="Img1" style="DISPLAY: inline" alt="" src="Images/CheckBoxUnSelect.gif" runat="server"&&INPUT id="Checkbox1" style="DISPLAY: none" type="checkbox" runat="server"& &INPUT id="Text1" type="text" runat="server" style="DISPLAY: none"& &/ItemTemplate& &/asp:TemplateColumn& &asp:TemplateColumn HeaderText="查询权"& &HeaderStyle Width="60px"&&/HeaderStyle& &ItemTemplate& &IMG id="Img2" style="DISPLAY: inline" alt="" src="Images/CheckBoxUnSelect.gif" runat="server"&&INPUT id="Checkbox2" style="DISPLAY: none" type="checkbox" runat="server" NAME="Checkbox2"& &INPUT id="Text2" type="text" runat="server" style="DISPLAY: none" NAME="Text2"& &/ItemTemplate& &/asp:TemplateColumn& &asp:TemplateColumn HeaderText="录入权"& &HeaderStyle Width="60px"&&/HeaderStyle& &ItemTemplate& &IMG id="Img3" style="DISPLAY: inline" alt="" src="Images/CheckBoxUnSelect.gif" runat="server"&&INPUT id="Checkbox3" style="DISPLAY: none" type="checkbox" runat="server" NAME="Checkbox3"& &INPUT id="Text3" type="text" runat="server" style="DISPLAY: none" NAME="Text3"& &/ItemTemplate& &/asp:TemplateColumn& &asp:TemplateColumn HeaderText="修改权"& &HeaderStyle Width="60px"&&/HeaderStyle& &ItemTemplate& &IMG id="Img4" style="DISPLAY: inline" alt="" src="Images/CheckBoxUnSelect.gif" runat="server"&&INPUT id="Checkbox4" style="DISPLAY: none" type="checkbox" runat="server" NAME="Checkbox4"& &INPUT id="Text4" type="text" runat="server" style="DISPLAY: none" NAME="Text4"& &/ItemTemplate& &/asp:TemplateColumn& &asp:TemplateColumn HeaderText="删除权"& &HeaderStyle Width="60px"&&/HeaderStyle& &ItemTemplate& &IMG id="Img5" style="DISPLAY: inline" alt="" src="Images/CheckBoxUnSelect.gif" runat="server"&&INPUT id="Checkbox5" style="DISPLAY: none" type="checkbox" runat="server" NAME="Checkbox5"& &INPUT id="Text5" type="text" runat="server" style="DISPLAY: none" NAME="Text5"& &/ItemTemplate& &/asp:TemplateColumn& &asp:TemplateColumn HeaderText="导出权"& &HeaderStyle Width="60px"&&/HeaderStyle& &ItemTemplate& &IMG id="Img6" style="DISPLAY: inline" alt="" src="Images/CheckBoxUnSelect.gif" runat="server"&&INPUT id="Checkbox6" style="DISPLAY: none" type="checkbox" runat="server" NAME="Checkbox6"& &INPUT id="Text6" type="text" runat="server" style="DISPLAY: none" NAME="Text6"& &/ItemTemplate& &/asp:TemplateColumn& &asp:TemplateColumn HeaderText="导入权"& &HeaderStyle Width="60px"&&/HeaderStyle& &ItemTemplate& &IMG id="Img7" style="DISPLAY: inline" alt="" src="Images/CheckBoxUnSelect.gif" runat="server"&&INPUT id="Checkbox7" style="DISPLAY: none" type="checkbox" runat="server" NAME="Checkbox7"& &INPUT id="Text7" type="text" runat="server" style="DISPLAY: none" NAME="Text7"& &/ItemTemplate& &/asp:TemplateColumn& &asp:ButtonColumn Text="保存" HeaderText="操作" CommandName="cmdSave"& &ItemStyle Font-Size="10pt"&&/ItemStyle& &/asp:ButtonColumn& &asp:TemplateColumn& &ItemTemplate& &INPUT id="Button1" style="cursor: WIDTH: 35 COLOR: BORDER-TOP-STYLE: BORDER-RIGHT-STYLE: BORDER-LEFT-STYLE: BACKGROUND-COLOR: TEXT-DECORATION: BORDER-BOTTOM-STYLE: none" onclick="EditCell(this,1);" type="button" value="编辑" runat="server"&&INPUT id="Button2" style="cursor: DISPLAY: COLOR: BORDER-TOP-STYLE: BORDER-RIGHT-STYLE: BORDER-LEFT-STYLE: BACKGROUND-COLOR: TEXT-DECORATION: BORDER-BOTTOM-STYLE: none" onclick="EditCell(this,2);" type="button" value="取消" runat="server"& &/ItemTemplate& &/asp:TemplateColumn& &/Columns& &PagerStyle NextPageText="下一页" PrevPageText="上一页"&&/PagerStyle& &/asp:datagrid& &!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"& &HTML& &HEAD& &TITLE& DSTree &/TITLE& &META NAME="Author" CONTENT="" & &style& body,td{font:12px verdana} #treeBox{background-color:#} #treeBox .ec{margin:0 5 0 5;} #treeBox .hasItems{font-weight:height:20padding:3 6 0 6;margin:2cursor:color:#555555;border:1px solid #} #treeBox .Items{height:20padding:3 6 0 6;margin:1cursor:color:#555555;border:1px solid #} &/style& &base href="/star/dstree/" /& &script& //code by star
var HC = "color:#990000;border:1px solid #cccccc"; var SC = "background-color:#border:1px solid #color:#000000;"; var IO = function initTree(){ var rootn = document.all.menuXML.documentE var sd = 0; document.onselectstart = function(){} document.all.treeBox.appendChild(createTree(rootn,sd)); } function createTree(thisn,sd){ var nodeObj = document.createElement("span"); var upobj = document.createElement("span"); with(upobj){ style.marginLeft = sd*10; className = thisn.hasChildNodes()?"hasItems":"Items"; innerHTML = "&img src=/img/common/logo.gif class=ec&" + thisn.getAttribute("text") +""; onmousedown = function(){ if(event.button != 1) if(this.getAttribute("cn")){ this.setAttribute("open",!this.getAttribute("open")); <.style.display = this.getAttribute("open")?"inline":"none"; this.all.tags("img")[0].src = this.getAttribute("open")?"/img/common/logo.gif":"/img/common/logo.gif"; } if(IO){ IO.runtimeStyle.cssText = ""; IO.setAttribute("selected",false); } IO = this.setAttribute("selected",true); this.runtimeStyle.cssText = SC; } onmouseover = function(){ if(this.getAttribute("selected")) this.runtimeStyle.cssText = HC; } onmouseout = function(){ if(this.getAttribute("selected")) this.runtimeStyle.cssText = ""; } oncontextmenu = contextMenuH onclick = clickH } if(thisn.getAttribute("treeId") != null){ upobj.setAttribute("treeId",thisn.getAttribute("treeId")); } if(thisn.getAttribute("href") != null){ upobj.setAttribute("href",thisn.getAttribute("href")); } if(thisn.getAttribute("target") != null){ upobj.setAttribute("target",thisn.getAttribute("target")); } nodeObj.appendChild(upobj); nodeObj.insertAdjacentHTML("beforeEnd","&br/&") if(thisn.hasChildNodes()){
var nodes = thisn.childN var cn = document.createElement("span"); upobj.setAttribute("cn",cn); if(thisn.getAttribute("open") != null){ upobj.setAttribute("open",(thisn.getAttribute("open")=="true")); upobj.getAttribute("cn").style.display = upobj.getAttribute("open")?"inline":"none"; if( !upobj.getAttribute("open"))upobj.all.tags("img")[0].src ="/img/common/logo.gif"; } for(i=0;i&nodes.cn.appendChild(createTree(nodes[i++],sd+1))); nodeObj.appendChild(cn); } else{ upobj.all.tags("img")[0].src ="/img/common/logo.gif"; } return nodeO } window.onload = initT &/script& &script& function clickHandle(){ // your code here } function contextMenuHandle(){ event.returnValue = var treeId = this.getAttribute("treeId"); // your code here } &/script& &/HEAD& &BODY& &xml id=menuXML& &?xml version="1.0" encoding="GB2312"?& &DSTreeRoot text="根节点" open="true" href="http://" treeId="123"& &DSTree text="技术论坛" open="false" treeId=""& &DSTree text="5DMedia" open="false" href="http://" target="box" treeId="12"& &DSTree text="网页编码" href="http://" target="box" treeId="4353" /& &DSTree text="手绘" href="http://" target="box" treeId="543543" /& &DSTree text="灌水" href="http://" target="box" treeId="543543" /& &/DSTree& &DSTree text="BlueIdea" open="false" href="http://" target="box" treeId="213"& &DSTree text="DreamWeaver & JS" href="http://" target="box" treeId="4353" /& &DSTree text="FlashActionScript" href="http://" target="box" treeId="543543" /& &/DSTree& &DSTree text="CSDN" open="false" href="http://" target="box" treeId="432"& &DSTree text="JS" href="http://" target="box" treeId="4353" /& &DSTree text="XML" href="http://" target="box" treeId="543543" /& &/DSTree& &/DSTree& &DSTree text="资源站点" open="false" treeId=""& &DSTree text="素材屋" href="http://" target="box" treeId="12" /& &DSTree text="桌面城市" open="false" href="http://" target="box" treeId="213"& &DSTree text="壁纸" href="http://" target="box" treeId="4353" /& &DSTree text="字体" href="http://" target="box" treeId="543543" /& &/DSTree& &DSTree text="MSDN" open="false" href="http://" target="box" treeId="432"& &DSTree text="DHTML" href="http://" target="box" treeId="4353" /& &DSTree text="HTC" href="http://" target="box" treeId="543543" /& &DSTree text="XML" href="" target="box" treeId="2312" /& &/DSTree& &/DSTree& &/DSTreeRoot& &/xml& &table style="position:left:100;top:100;"& &tr&&td id=treeBox style="width:400height:200border:1px solid #padding:5 3 3 5;" valign=top&&/td&&/tr& &tr&&td style="font:10color:#999999" align=right&by &font color=#660000&sTar&/font&&br/& &/td&&/tr& &/table& &/BODY& &/HTML& 针对javascript的几个对象的扩充函数 function checkBrowser() { this.ver=navigator.appVersion this.dom=document.getElementById?1:0 this.ie6=(this.ver.indexOf("MSIE 6")&-1 && this.dom)?1:0; this.ie5=(this.ver.indexOf("MSIE 5")&-1 && this.dom)?1:0; this.ie4=(document.all && !this.dom)?1:0; this.ns5=(this.dom && parseInt(this.ver) &= 5) ?1:0; this.ns4=(document.layers && !this.dom)?1:0; this.mac=(this.ver.indexOf('Mac') & -1) ?1:0; this.ope=(navigator.userAgent.indexOf('Opera')&-1); this.ie=(this.ie6 || this.ie5 || this.ie4) this.ns=(this.ns4 || this.ns5) this.bw=(this.ie6 || this.ie5 || this.ie4 || this.ns5 || this.ns4 || this.mac || this.ope) this.nbw=(!this.bw)
} /* ****************************************** 日期函数扩充 ****************************************** */ /* =========================================== //转换成大写日期(中文) =========================================== */ Date.prototype.toCase = function() { var digits= new Array('零','一','二','三','四','五','六','七','八','九','十','十一','十二'); var unit= new Array('年','月','日','点','分','秒'); var year= this.getYear() + "";
var output=""; ////////得到年 for (index=0;index&year.index++ ) { output += digits[parseInt(year.substr(index,1))]; } output +=unit[0]; ///////得到月 output +=digits[this.getMonth()] + unit[1]; ///////得到日 switch (parseInt(this.getDate() / 10)) { case 0: output +=digits[this.getDate() % 10];
case 1: output +=digits[10] + ((this.getDate() % 10)&0?digits[(this.getDate() % 10)]:"");
case 2: case 3: output +=digits[parseInt(this.getDate() / 10)] + digits[10]
+ ((this.getDate() % 10)&0?digits[(this.getDate() % 10)]:""); default:
} output +=unit[2]; ///////得到时 switch (parseInt(this.getHours() / 10)) { case 0: output +=digits[this.getHours() % 10];
case 1: output +=digits[10] + ((this.getHours() % 10)&0?digits[(this.getHours() % 10)]:"");
case 2: output +=digits[parseInt(this.getHours() / 10)] + digits[10] + ((this.getHours() % 10)&0?digits[(this.getHours() % 10)]:"");
} output +=unit[3]; if(this.getMinutes()==0&&this.getSeconds()==0) { output +="整";
} ///////得到分 switch (parseInt(this.getMinutes() / 10)) { case 0: output +=digits[this.getMinutes() % 10];
case 1: output +=digits[10] + ((this.getMinutes() % 10)&0?digits[(this.getMinutes() % 10)]:"");
case 2: case 3: case 4: case 5: output +=digits[parseInt(this.getMinutes() / 10)] + digits[10] + ((this.getMinutes() % 10)&0?digits[(this.getMinutes() % 10)]:"");
} output +=unit[4]; if(this.getSeconds()==0) { output +="整";
} ///////得到秒 switch (parseInt(this.getSeconds() / 10)) { case 0: output +=digits[this.getSeconds() % 10];
case 1: output +=digits[10] + ((this.getSeconds() % 10)&0?digits[(this.getSeconds() % 10)]:"");
case 2: case 3: case 4: case 5: output +=digits[parseInt(this.getSeconds() / 10)] + digits[10] + ((this.getSeconds() % 10)&0?digits[(this.getSeconds() % 10)]:"");
} output +=unit[5];
} /* =========================================== //转换成农历 =========================================== */ Date.prototype.toChinese = function() { //暂缺 } /* =========================================== //是否是闰年 =========================================== */ Date.prototype.isLeapYear = function() { return (0==this.getYear()%4&&((this.getYear()%100!=0)||(this.getYear()%400==0))); } /* =========================================== //获得该月的天数 =========================================== */ Date.prototype.getDayCountInMonth = function() { var mon = new Array(12);
mon[0] = 31; mon[1] = 28; mon[2] = 31; mon[3] = 30; mon[4]
= 31; mon[5]
mon[6] = 31; mon[7] = 31; mon[8] = 30; mon[9] = 31; mon[10] = 30; mon[11] = 31; if(0==this.getYear()%4&&((this.getYear()%100!=0)||(this.getYear()%400==0))&&this.getMonth()==2) { return 29; } else { return mon[this.getMonth()]; } } /* =========================================== //日期比较 =========================================== */ pare = function(objDate) { if(typeof(objDate)!="object" && objDate.constructor != Date) { return -2; } var d = this.getTime() - objDate.getTime();if(d&0) { return 1; } else if(d==0) { return 0; } else { return -1; } } /* =========================================== //格式化日期格式 =========================================== */ Date.prototype.Format = function(formatStr) { var str = formatS str=str.replace(/yyyy|YYYY/,this.getFullYear()); str=str.replace(/yy|YY/,(this.getYear() % 100)&9?(this.getYear() % 100).toString():"0" + (this.getYear() % 100)); str=str.replace(/MM/,this.getMonth()&9?this.getMonth().toString():"0" + this.getMonth()); str=str.replace(/M/g,this.getMonth()); str=str.replace(/dd|DD/,this.getDate()&9?this.getDate().toString():"0" + this.getDate()); str=str.replace(/d|D/g,this.getDate()); str=str.replace(/hh|HH/,this.getHours()&9?this.getHours().toString():"0" + this.getHours()); str=str.replace(/h|H/g,this.getHours()); str=str.replace(/mm/,this.getMinutes()&9?this.getMinutes().toString():"0" + this.getMinutes()); str=str.replace(/m/g,this.getMinutes()); str=str.replace(/ss|SS/,this.getSeconds()&9?this.getSeconds().toString():"0" + this.getSeconds()); str=str.replace(/s|S/g,this.getSeconds());
} /* =========================================== //由字符串直接实例日期对象 =========================================== */ Date.prototype.instanceFromString = function(str) { return new Date("".replace(/-/g, "\/")); <b
javascript:prototype原形(转)
javascript:prototype原型(转)
javascript中的prototype(原型)属性研究
文章来源:[CSDN ]
我们知道JScript中对象的prototype属性,是用来返回对象类型原型的引用的。我们使用prototype属性提供对象的类的一组基本功能。并且对象的新实例会"继承"赋予该对象原型的操作。但是这个prototype到底是怎么实现和被管理的呢?
对于对象的prototype属性的说明,JScript手册上如是说:所有 JScript 内部对象都有只读的
prototype 属性。可以向其原型中动态添加功能(属性和方法),但该对象不能被赋予不同的原型。然而,用户定义的对象可以被赋给新的原型。
下面我们看三个经典的prototype属性的使用示例。
1、为脚本环境内建对象添加方法:
Array.prototype.max = function()
var i, max = this[0];
for (i = 1; i & this. i++)
if (max & this[i])
max = this[i];
2、为用户自定义类添加方法:
function TestObject(name)
this.m_Name =
TestObject.prototype.ShowName = function()
alert(this.m_Name);
3、更新自定义类的prototype:
function TestObjectA()
this.MethodA = function()
alert('TestObjectA.MethodA()');
function TestObjectB()
this.MethodB = function()
alert('TestObjectB.MethodB()');
TestObjectB.prototype = new TestObjectA();
第三个很眼熟吧?对啊,它就是我们前面介绍的原型继承法呀~~ 不过今天我们不是研究"继承",之所以可以这样来实现一种继承,只是利用了prototype属性的一个副作用而已。
prototype还有一个默认的属性:constructor,是用来表示创建对象的函数的(即我们OOP里说的构造函数)。constructor属
性是所有具有prototype属性的对象的成员。它们包括除Global和Math对象以外的所有JScript内部对象。constructor属性
保存了对构造特定对象实例的函数的引用。
弄清楚了JScript中prototype属性怎么使用后,下面我们再来深入的研究它。
上面的文章中我罗列了一下prototype属性在JScript中的各种用法,但是prototype这个东西却不是JScript创造出来的,
JScript实际上是使用了我们设计模式中prototype pattern的一种衍生形式。下面我先简单的说一下prototype
pattern,然后再来看到底JScript中的prototype是怎么回事?!
What's prototype pattern?
Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype.
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。
继续了解到底什么是prototype pattern,可以参看'设计模式之Prototype(原型)'这篇文章,即使不懂Java也没有关系,把它的代码都当C#看就行了。
搞清楚什么是原型了吧?反正记着一点,prototype pattern是的实现是依赖于clone这个操作的,当然要shallow copy还是deep copy的clone看自己的需要了。
下面我们继续说JScript里的prototype,为什么我们说它和prototype
pattern里的prototype不一样呢?! 这个不是我说就说出来的,也不是我吹出来的,看看这个示例,你就能大概糊涂:
&script language="javascript"&
function RP()
RP.PropertyA = 1;
RP.MethodA = function()
alert("RP.MethodA ");
this.PropertyA = 100;
this.MethodA = function()
alert("this.MethodA");
RP.prototype.PropertyA = 10;
RP.prototype.MethodA = function()
alert("RP.prototype.MethodA");
不要着急,还没有开始做示例,只是给出了我们用来演示的一个类。RP是什么?rpwt吗?当然不是了,RP是ResearchPrototype了。好了
不废话了,看示例及结果分析。
&script language="javascript"&
rp = new RP();
alert(RP.PropertyA);
RP.MethodA();
alert(rp.PropertyA);
rp.MethodA();
运行结果闪亮登场:
RP.MethodA
this.MethodA
这个%$@#^$%
&^...,不要着急,继续看哦!
&script language="javascript"&
rp = new RP();
delete RP.PropertyA;
alert(RP.PropertyA);
delete RP.MethodA;
RP.MethodA();
delete rp.PropertyA;
alert(rp.PropertyA);
delete rp.MethodA;
rp.MethodA();
运行结果再次登场:
A Runtime Error has occurred.
Do you wish to Debug?
Error: Object doesn't support this property or method
RP.prototype.MethodA
好玩吧,看出来什么名堂了吗?这里的RP.PropertyA和RP.MethodA只是用来做参照的,可是怎么把this.PropertyA和this.MethodA都delete了,还能出来结果,而且还是prototype导入的属性和方法呢?
这就是JScript的prototype和prototype
pattern中prototype最大的不同了,JScript中的这个所谓的prototype属性其实是个语言本身支持的特性,这里没有发生任何的
copy,不管shallow还是deep的。对于JScript的解释引擎,它在处理"."或"[keyName]"引用的对象的属性和方法时,先在对
象本身的实例(this)中查找,如果找到就返回或执行。如果没有查找到,就查找对象的prototype
(this.constructor.prototype)里是否定义了被查找的对象和方法,如果找到就返回或执行,如果没有查找到,就返回
undefined(对于属性)或runtime error(对于方法)。
正因为prototype导入类实例的属性或方法是动态查找的,所以我们才能对系统内部对象添加prototype属性和方法,比如给String对象添加trim方法:
&script lanuage="javascript"&
String.prototype.trim()
return this.replace(/(^\s+)|(\s+$)/g, "");
显然JScript中的这种用法也是prototype pattern中的prototype不能解释和支持的。
这下对于JScript OOP中原型继承法的理解因该没有任何的障碍了吧?同时也应该明白为什么原型继承法有那么大的天生缺陷了吧?当然如果有任何问题,欢迎继续讨论。
附演示示例源代码:
&meta name="author" content="birdshome@博客园"&
&title&JScript Prototype Research&/title&
&script language="javascript"&
function RP()
RP.PropertyA = 1;
RP.MethodA = function()
alert("RP.MethodA ");
this.PropertyA = 100;
this.MethodA = function()
alert("this.MethodA");
RP.prototype.PropertyA = 10;
RP.prototype.MethodA = function()
alert("RP.prototype.MethodA");
&script language="javascript"&
rp = new RP();
delete RP.PropertyA;
alert(RP.PropertyA);
delete RP.MethodA;
RP.MethodA();
delete rp.PropertyA;
alert(rp.PropertyA);
delete rp.MethodA;
rp.MethodA();
Javascript的通过prototype的原型链来模拟面向对象的继承已经是广为人知的做法了。如果我们声明一个类Aclass,代码如下:
.value = 0;
为这个类添加方法,网上常有这样的做法
.value = 0;
.getValue = function
.setValue = function
这种做法看上去挺顺眼,但是实际上执行效率比较低,为什么?
因为每次构造一个Aclass的实例,都会去执行一遍Aclass里面所有的代码,重新声明Aclass里面的所有方法。这样做,如果有多个Aclass
的实例,其实做了很多无用功。比较合适的做法是:
Aclass.prototype.getValue = function
Aclass.prototype.setValue = function
这样一来,所有Aclass构造出来的对象,自动都会通过原型链获得getValue的方法。getValue和setValue的方法就只声明一次,多
次被调用。这样才像是一个类的概念么。所有通过Aclass构造出来的对象,都可以通过constructor属性来获取Aclass本身。就好像
java object的getClass()方法一样。
如果我们需要继承,那么只要这么做
Bclass.prototype = new
这样Bclass构造出来的对象,就能自动拥有Aclass构造出来对象的属性和方法。但是问题又来了,看一下下面的代码:
alert(b.constructor);
看看,结果会是什么?
我们希望的结果是能得到Bclass,结果却得到了Aclass。这样的结果是出人意料的,为什么会这样呢? (答案我也不知道)
然而,这样一来,我们通过Bclass构造的对象,将再也无法得到Bclass本身。于是我想出了如下补救办法:
Bclass.prototype.constructor = B
这样一来,看似万事大吉了,Bclass构造出来的对象自动constructor会指向Bclass。
但是问题又来了,假定Bclass也有一个getValues,覆盖了Aclass的方法。
Bclass.prototype.getValue = function
而我又偏偏想在Bclass的实例中调Aclass定义的方法(类似于java中super
.getValue()这样的做法)。
//获得b的原型对象
bProto = b.constructor.
//调用原型对象的方法getValue
alert(bProto.getValue());
令人失望,得到的还是Bclass的getValue方法。因为b的getValue方法,本来就是定义在bProto对象上面,解释器不会再去访问
bProto的原型了。因此,我们必须自己获得bProto的原型对象。然而,我们会发现,bProto的原型对象已经再也无法得到了,因为我们已经把它
的constructor直接指在了Bclass上,永远也无法再得到Aclass了。
怎么解决这个问题呢?
我在前面就写上:
Bclass.superClass = A
然后在后面就可以这样写:
alert(b.constructor.superClass.prototype.getValue());
这样,就实现了类似于super
.getValue()的功能。
当然,上面这么做是比较散乱的,最好写几个方法,把散乱的东西封装起来。
.prototype.extendsOf = function
.prototype = new
.superClass =
getSuper(obj){
supClass = obj.constructor.superC
(typeof supClass = "undefined"){
obj.constructor.
上述代码可以写为
Bclass.extendsOf(Aclass);
b.setValue(5);
alert(b.getValue());
alert(getSuper(b).getValue());
这下结果终于对了吧
如果您想提高自己的技术水平,欢迎加入本站官方1号QQ群:&&,&&2号QQ群:,在群里结识技术精英和交流技术^_^
本站联系邮箱:

我要回帖

更多关于 北京java培训机构 的文章

 

随机推荐