??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲一区二区三区香蕉,亚洲综合一区二区精品导航,无码天堂va亚洲va在线vahttp://m.tkk7.com/zhanglijun33/category/17808.htmlhQ彷徨,立志Q蓄?..zh-cnFri, 07 Mar 2008 23:10:04 GMTFri, 07 Mar 2008 23:10:04 GMT60CSS/JS/HTML技?/title><link>http://m.tkk7.com/zhanglijun33/archive/2007/09/18/js_css.html</link><dc:creator>无?/dc:creator><author>无?/author><pubDate>Tue, 18 Sep 2007 07:14:00 GMT</pubDate><guid>http://m.tkk7.com/zhanglijun33/archive/2007/09/18/js_css.html</guid><wfw:comment>http://m.tkk7.com/zhanglijun33/comments/146167.html</wfw:comment><comments>http://m.tkk7.com/zhanglijun33/archive/2007/09/18/js_css.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://m.tkk7.com/zhanglijun33/comments/commentRss/146167.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/zhanglijun33/services/trackbacks/146167.html</trackback:ping><description><![CDATA[textarea宽度固定Q自动增?input高度固定Q自动增?br /> <p>input高度固定Q自动增?lt;br><br /> <input  type="text"  style="width:60;overflow-x:visible;overflow-y:visible;"></p> <p><br><br /> textarea宽度固定Q自动增?lt;br></p> <p><textarea  type="text"  style="width:260;overflow-x:visible;overflow-y:visible;"></textarea><br /> 2.验证是不是ؓ(f)汉字或者字母或者数?正规字符)</p> <font style="background-color: #9fe6aa">var exp1="^([0-9A-Za-z]|[\u4e00-\u9fa5])+$";<br />      var corName=document.getElementById("displayName");<br />      if(corName.value==""||!corName.value.match(exp1)){<br />      document.getElementById("displayNameInfo").innerHTML="<font color='red' >昄名不能ؓ(f)IZ只能为字母和汉字l成</font>";<br />      corName.focus();<br />      return false;<br />      }</font> <img src ="http://m.tkk7.com/zhanglijun33/aggbug/146167.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/zhanglijun33/" target="_blank">无?/a> 2007-09-18 15:14 <a href="http://m.tkk7.com/zhanglijun33/archive/2007/09/18/js_css.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>flex actionScript 学习(fn)http://m.tkk7.com/zhanglijun33/archive/2007/09/03/clientTech.html无?/dc:creator>无?/author>Mon, 03 Sep 2007 06:10:00 GMThttp://m.tkk7.com/zhanglijun33/archive/2007/09/03/clientTech.htmlhttp://m.tkk7.com/zhanglijun33/comments/142291.htmlhttp://m.tkk7.com/zhanglijun33/archive/2007/09/03/clientTech.html#Feedback4http://m.tkk7.com/zhanglijun33/comments/commentRss/142291.htmlhttp://m.tkk7.com/zhanglijun33/services/trackbacks/142291.htmlhttp://blog.csdn.net/mozilla/archive/2007/08/23/1756761.aspx

http://examples.adobe.com/flex2/inproduct/sdk/explorer/explorer.html

http://www2.flash8.net/teach/6200.htm

 



]]>
hta研究--1http://m.tkk7.com/zhanglijun33/archive/2007/07/10/hta1.html无?/dc:creator>无?/author>Tue, 10 Jul 2007 01:13:00 GMThttp://m.tkk7.com/zhanglijun33/archive/2007/07/10/hta1.htmlhttp://m.tkk7.com/zhanglijun33/comments/129207.htmlhttp://m.tkk7.com/zhanglijun33/archive/2007/07/10/hta1.html#Feedback0http://m.tkk7.com/zhanglijun33/comments/commentRss/129207.htmlhttp://m.tkk7.com/zhanglijun33/services/trackbacks/129207.html阅读全文

]]>
msagentl典用法http://m.tkk7.com/zhanglijun33/archive/2006/12/19/agentProgramming.html无?/dc:creator>无?/author>Tue, 19 Dec 2006 08:13:00 GMThttp://m.tkk7.com/zhanglijun33/archive/2006/12/19/agentProgramming.htmlhttp://m.tkk7.com/zhanglijun33/comments/88830.htmlhttp://m.tkk7.com/zhanglijun33/archive/2006/12/19/agentProgramming.html#Feedback1http://m.tkk7.com/zhanglijun33/comments/commentRss/88830.htmlhttp://m.tkk7.com/zhanglijun33/services/trackbacks/88830.html
msagentl典用法

序大本营战士
atyzy(W笑)

---- Microsoft Agent是微软公怺1997q?月发布的一代理Y件开发技术,而后被集成到Internet Explorer 4.0 Plus?qing)更高版本中Q目前版本ؓ(f)2.0Q支持简体中文。作ZUY件代理工PAgent以其强大的交互功能、鲜明的人性特炏V优的操作界面和简便统一的编E方法,对由菜单、按钮、提C框{组成的传统人机交互方式产生了很大媄(jing)响,在多媒体创作、Web应用、教育Y件、Y件帮助系l和辅助工具制作{方面,hqK的应用前景?

一?Microsoft Agent技术简?

---- Agent一词的中文意思是“代理”,故名思意Q这cM理Y件的主要作用是提供一U易于理解和使用的操作界面,接受用户的指令、代替用户完成某些复杂繁琐的工作、或为用h供帮助。科学研I表明:(x)从h机工E的角度考虑Q赋予电(sh)脑或E序更多人性化色彩Q如支持语音合成输出信息、语韌别输入指令、智能提C、动ȝQ能够充分提高hZ互的有效性和易用性?

---- 我们知道Q在Office 97帮助pȝ中有一U叫作Office助手的代理YӞ其中q默风趣的动Mh物,如“大眼夹”,能够Ҏ(gu)用户的操作步骤“智能化”地提出一些徏议或帮助信息。与Office助手相比QAgent功能更加丰富强大Q表现在Q?


Office助手沿用传统的不透明矩ŞH口Q窗口后面的背景被完全挡住;Agent动画人物本n是一个“AlwaysOnTop”窗口,只有人物w体部分挡住背景Q其余部分透明?

Office助手只允许Office 97的各个组件调用,Agent动画人物可由MWindowsE序调用Q?

Agent支持文字气球和输入提C条Q在输出语音的同时把文字输出至一个卡通式文字气球中。如果电(sh)脑系l中安装有Agent语音识别引擎Q当用户按住输入键,如Scroll Lock键,在Agent人物下方出现一个输入命令窗口,表示它正在“聆听”用L(fng)语音命o(h)?

Agent提供Genie、Merlin、Bobby和Peedy{动Mh物,不仅h优美诙谐的动作,而且可以通过声卡、麦克风与用户交谈?


二?Microsoft Agent安装Ҏ(gu)

---- Agent是一UActiveX控gQ其服务器程序(C:\WINDOWS\MSAGENT\Agentsvr.exeQ运行在Win95/98/NT操作q_上,为其它调用Agent的客L(fng)序提供服务。客L(fng)序可以是利用VB、C++、Delphi、VFP、PB{开发的应用软gQ也可以是HTML文g中的Visual Script、Java Script脚本语言代码?


安装Agent核心lgMsagent.exe?

安装Lernout & Hauspie TruVoice Text-to-Speech EngineQ完成从文字合成语音的工作,目前版本只支持英语)Cgram.exe?

安装Microsoft Command and Control Speech EngineQ提供语韌别功能,目前版本只支持英语)Actcnc.exe?

Agent动画人物人物数据文g。Agent支持单结构角色文Ӟ.acsQ角色数据与动画数据存于同一个文ӞQ也支持分离l构角色文gQ?acfQ角色数据存?acf中,动画数据存于.aca中)。基于本地硬盘和|络的应用程序可采用.acs文gQ基于Web面的HTML文g在浏览器中访问时?x)自动调用,习(fn)惯上多使?acs文g?


---- 上述文g可从 下蝲?

三?Microsoft Agent~程要点

---- 1?在Delphi中添加Agent控g

---- 在Delphi IDE中选择菜单ComponentQImport ActiveX Control——在Import ActiveX下的列表框中选择Microsoft Agent Control 2.0QVersion 2.0Q,点击按钮Install——在Install对话框中点击按钮OK——在Confirm对话框中点击按钮Yes——在对话框中点击按钮OK。至此,Agent控g被添加到Delphilg板ActiveX上?

---- 2?在Delphi中调用Agent控g

---- ⑴、在Delphi IDE 中新建Project1Q包含Form1Q,在Form1上放|Agent1QName属性ؓ(f)MyAgentQ、Button1?

---- c(din)定义变量?


Var Peedy: IagentCtlCharacterEx; Request1,Request2: IagentCtlRequest;
---- ⑶Agent主要属性、方法、事件?

---- ①Characters属性与Load、UnloadҎ(gu)Q初始化AgentQ加载动L据,卸蝲动画人物

---- Request1 := MyAgent.Characters.Load( Peedy, C:\Windows\System\Peedy.acs );
---- Peedy := MyAgent.Characters.Character( Peedy );
---- MyAgent.Characters.Unload(Peedy);

---- ②Show与HideҎ(gu)Q显C、隐藏Agent动画人物。参数Fast表示动画人物昄、隐藏的速度。Fast?表示Agent飞入、飞出,Fast?表示Agent直接出现、消失,没有动画q程?

---- Peedy.Show(0);
---- Peedy.Hide(1);

---- ③StopAll、StopҎ(gu)Q停止所有动作?
---- Peedy.StopAll();
---- Peedy.Stop(Request);

---- ④Connected属性:(x)Agent是否与Microsoft Agent服务器连接?
---- MyAgent.Connected := True;

---- ⑤Get_Height、Get_Width、Set_Height、Set_WidthҎ(gu)Q获得、设|Agent动画人物的高度、宽度?

AgentHight := Peedy.Get_Height; AgentWidth := Peedy.Get_Width; Peedy.Set_Height(
round(AgentHeight / 2 )); Peedy.Set_Width( round( AgentWidth / 2 ));
---- ⑥MoveToҎ(gu)Q参数xQy表示Agent动画人物Ud到的坐标Q参数Speed表示Ud的速度?

---- Peedy.MoveTo( (Screen.Width-Peedy.Get_Width) Div 2, (Screen.Height-Peedy.Get_Height) Div 2, 2 );

---- ⑦InterruptҎ(gu)Q中断指定角色的动画。在几十U动d作中Q有一cd~名ؓ(f)“ing?的动作比较特D,如“processing”、“searching”、“reading”、“writing”,一旦执行就必须通过调用另外一个动Mh物的InterruptҎ(gu)才能中断 。角色不能中断自w的动作Q否则会(x)D异常?

 Request1 :=
Robby.Play(reading); Peedy.Interrupt(Request1);
---- ⑧WaitҎ(gu)Q在多个不同动画人物之间协调动画动作Q如{待sRobby的当前动作执行完毕后QPeedy做另外一个动作?

Request1 := Robby.Play(read); Peedy.Wait(Request1); Peedy.Play(search);
---- ⑨PlayҎ(gu)Q执行指定的动画动作Q参数AnimationZ帔RQ表C动ȝ型。Agent提供了几十种预定义动作,开发Y件时只需直接调用q些帔R卛_。下面简要介l其中常用的一些常量仅供编E参考?

---- 动作cd 中文含意 动作cd 中文含意 动作cd 中文含意

 Acknowledge 承认
LookDown 向下?Sad (zhn)伤 Alert 警告 LookDownBlink 向下看眨?Search L
Announce 声明 LookUp 向上?StartListening 开始聆?Blink 眨眼 LookUpBlink
向下看眨?StopListening 停止聆听 Confused qh LookLeft 向左?Suggest
Congratulate 贺 LookLeftBlink 向左看眨?Surprised 吃惊 Decline 拒绝
LookRight 向右?Think 思?DontRecognize 不承?LookRightBlink 向右看眨?
Wave 挥动 Explain 解释 MoveDown 向下Ud Write 书写 GestureDown 向下姿势
MoveUp 向上Ud Processing 计算…?GestureUp 向上姿势 MoveRight 向右Ud
Reading 阅读…?GestureLeft 向左姿势 MoveLeft 向左Ud Searching L…?
GestureRight 向右姿势 Pleased 高兴 Writing 书写…?GetAttention 获得注意
Read 阅读 Greet 问?RestPose 恢复初始状?Request := peedy.Play(search);
---- ⑩SpeakҎ(gu)QAgent通过调用语音合成引擎Q支持英语的语音合成输出功能Q只需输入英文字符ԌAgentp通过声卡、音“说话”。Agent的当前版本尚不具备支持中文语韛_成功能,所以只能以.wav文g的Ş式播放中文。用时可以想要说的中文句子预先录好,?wav形式存储Q在E序中调用即可。参数Text表示文字气球中显C的文字Q参数url表示.wav文g的\径?

---- Peedy.speak(嗨,朋友们,你们好,现在由我为?zhn)提供帮助Q?C:\新徏文g夹\Help.wav);

---- Peedy.Speak( Do you like my help? If so, Please send me an email! Thank you!, );

---- ⑾Commands.AddҎ(gu)Q在Button1Click事g中ؓ(f)Agentd自定义语韌别命令,参数const Name表示语音命o(h)的标识,参数Caption表示该命令在输入命o(h)H口中的昄标题Q参数Voice表示该命令对应的语句。当用户通过麦克风向动画人物发出语音命o(h)Ӟ触发Agent的Command事gQ因此我们可以另外编写一个过E完成语韌别功能?

procedure TForm1.Button1Click(Sender: TObject); begin Peedy.Commands.Add(Delphi,Run
Delphi,Delphi,True,True); Peedy.Commands.Add(Visual Basic, Run VB,VB,True,True);
Peedy.Show(0); Peedy.Speak(What can I do for you, sir?,); end;
---- ⑗按F9q行E序。以上程序在Delphi3.0/4.0、Windows95/98/NT体中文版环境下调试通过?



]]>
JS集锦http://m.tkk7.com/zhanglijun33/archive/2006/12/08/aboutJS2.html无?/dc:creator>无?/author>Fri, 08 Dec 2006 03:49:00 GMThttp://m.tkk7.com/zhanglijun33/archive/2006/12/08/aboutJS2.htmlhttp://m.tkk7.com/zhanglijun33/comments/86278.htmlhttp://m.tkk7.com/zhanglijun33/archive/2006/12/08/aboutJS2.html#Feedback7http://m.tkk7.com/zhanglijun33/comments/commentRss/86278.htmlhttp://m.tkk7.com/zhanglijun33/services/trackbacks/86278.html1.一个日历插件?br /><script>
/* Creation date: 2004-6-13 */
var myC_x,myC_y;
var myC_timeset=null,myC_timeset1=null;
var divObj=null;
var inputName;
function myCalendar() //构徏对象
{
var myDate = new Date();
this.year = myDate.getFullYear();
this.month = myDate.getMonth()+1;
this.date = myDate.getDate();
this.format="yyyy-mm-dd";
this.style = myStyle(1); 
this.show = createCalendar;
this.input = createInput;
}
function myStyle(num) //讄样式
{
if(!num||isNaN(num)){alert('参数不对,采用默认样式Q?);num=1;}
 var style = new Array();
style[1]=".week{background-color:#DfDfff;font-size:12px;width:140px;}"
+".ds{width:140px;font-size:12px;cursor:hand}"
+".mover{border:1px solid black;background-color:#f4f4f4;}"
+".move1{border:1px solid #5d5d5d;background-color:#f4f4f4;color:#909eff;font-size:12px}"
+".tit{background-color:#909EFF;width:140px;font-size:12px;color:white;cursor:default}"
+".cs{position:absolute;border:1px solid #909eff;width:142px;left:0px;top:0px;z-index:9999;}"
+".shadow{position:absolute;left:0px;top:0px;font-family: Arial Black;font-size:50px;color:#d4d4d4;z-index:1;text-align:center;}";
document.write("<style type='text/css'>");
document.write(style[num]);
document.write("</style>");
}
function createCalendar()
{
var week = new Array('?,'一','?,'?,'?,'?,'?);
document.write("<div class='cs' onselectstart='return false' oncontextmenu='return false' onmousedown='if(event.button==2)this.style.display=\"none\"' id='myC_div'><div class='shadow'></div><div style='position:absolute;left:0px;top:0px;z-index:1'>");
//创徏头部
document.write("<table class='tit' id='myC_Top' onmousedown='myC_x=event.x-parentNode.parentNode.style.pixelLeft;myC_y=event.y-parentNode.parentNode.style.pixelTop;setCapture()' onmouseup='releaseCapture();' onmousemove='myCMove(this.parentElement.parentElement);'><tr><td width=10 onmouseover='this.style.color=\"black\"' onmouseout='this.style.color=\"\"' onclick='cutYear()' style='font-family: Webdings;cursor:hand;' title='减少q䆾'>7</td><td title='减少月䆾' onmouseover='this.style.color=\"black\"' onclick='cutMonth()' onmouseout='this.style.color=\"\"' width=10 style='font-family: Webdings;cursor:hand;'>3</td><td align=center onmouseover=this.className='move1'; onmouseout=this.className='';divHidden(myC.parentElement.nextSibling); onclick='createyear("+this.year+",this);divShow(myC.parentElement.nextSibling);'></td><td align=center onclick='createmonth("+this.month+",this);divShow(myC.parentElement.nextSibling)' onmouseover=this.className='move1'; onmouseout=this.className='';divHidden(myC.parentElement.nextSibling);></td><td width=10 onmouseover='this.style.color=\"black\"' onmouseout='this.style.color=\"\"' onclick='addMonth()' style='font-family: Webdings;cursor:hand;' title='增加月䆾'>4</td><td width=10 style='font-family: Webdings;cursor:hand;' onmouseover='this.style.color=\"black\"' onmouseout='this.style.color=\"\"' onclick='addYear()' title='增加q䆾'>8</td></tr></table>");
//创徏星期条目
document.write("<table class='week'><tr>");
for(i=0;i<7;i++)
document.write("<td align=center>"+week[i]+"</td>");
document.write("</tr></table>");
//创徏日期条目
document.write("<table class='ds' id='myC' cellspacing=2 cellpadding=0>");
for(i=0;i<6;i++)
{
document.write("<tr>");
for(j=0;j<7;j++)
document.write("<td width=10% height=16 align=center onmouseover='mOver(this)' onmouseout='mOut(this)' onclick='if(this.innerText!=\"\")getValue(inputName,this.innerText);myC_div.style.display=\"none\"'></td>");
document.write("</tr>");
}
document.write("</table>");
//建徏水印
document.write("</div>");
//创徏选择囑ֱ
document.write("<div style='position:absolute;left:0px;top:0px;z-index:3' onmouseover=divShow(this) onmouseout=divHidden(this)></div>");
document.write("</div>");
//昄日期
showDate(this.year,this.month);
myC_div.style.display='none';
}
function getValue(obj,value)
{
eval(obj).value=parseInt(myC_Top.cells[2].innerText)+"-"+parseInt(myC_Top.cells[3].innerText)+"-"+value;
}
function showDate(year,month)
{
var myDate = new Date(year,month-1,1);
var today = new Date();
var day = myDate.getDay();
var length = new Array(31,30,31,30,31,30,31,31,30,31,30,31);
length[1] = ((year%4==0)&&(year%100!=0)||(year%400==0))?29:28;
for(i=0;i<myC.cells.length;i++)myC.cells[i].innerHTML = "";
for(i=0;i<length[month-1];i++)
{
myC.cells[i+day].innerHTML = (i+1);
if(new Date(year,month-1,i+1).getDay()==6||new Date(year,month-1,i+1).getDay()==0){myC.cells[i+day].style.color='red';}
}
myC_Top.cells[2].innerText=year+"q?;
myC_Top.cells[3].innerText=month+"?;
with(myC.parentNode.previousSibling.style)
{
pixelLeft=myC.offsetLeft;
pixelTop=myC.offsetTop;
height = myC.clientHeight;
width = myC.clientWidth;
}
myC.parentElement.parentElement.style.height=myC.parentElement.offsetHeight;
myC.parentElement.previousSibling.innerHTML=year;
}
//一些附加函?-------------------
//---------Begin-------------------
function mOver(obj){obj.className = 'mover';}
function mOut(obj){if(obj.className=='mover')obj.className = '';}
function addYear(){var year = parseInt(myC_Top.cells[2].innerText);var month = parseInt(myC_Top.cells[3].innerText); year++;showDate(year,month);}
function addMonth(){var year = parseInt(myC_Top.cells[2].innerText);var month = parseInt(myC_Top.cells[3].innerText);month++;if(month>12){month=1;year++;}showDate(year,month);}
function cutYear(){var year = parseInt(myC_Top.cells[2].innerText);var month = parseInt(myC_Top.cells[3].innerText);year--;showDate(year,month);}
function cutMonth(){var year = parseInt(myC_Top.cells[2].innerText);var month = parseInt(myC_Top.cells[3].innerText);month--;if(month<1){month=12;year--;}showDate(year,month);}
function divS(obj)
{
if(obj!=divObj)
{
obj.style.backgroundColor="#909eff";
obj.style.color='black';
}
if(divObj!=null)
{
divObj.style.backgroundColor='';
divObj.style.color='';
}
divObj = obj;
}
function divShow(obj)
{ if (myC_timeset!=null) clearTimeout(myC_timeset);
obj.style.display='block';
}
function divHidden(obj){myC_timeset=window.setTimeout(function(){obj.style.display='none'},500);}
function createyear(year,obj)//创徏q䆾选择
{
var ystr;
var oDiv;
ystr="<table class='move1' cellspacing=0 cellpadding=2 width="+obj.offsetWidth+">";
ystr+="<tr><td style='cursor:hand' onclick='createyear("+(year-20)+",myC_Top.cells[2])' align=center>上翻</td></tr>";
for(i=year-10;i<year+10;i++)
if(year==i)
ystr+="<tr style='background-color:#909eff'><td style='color:black;height:16px;cursor:hand' align=center onclick='myC_Top.cells[2].innerText=this.innerText;showDate("+i+",parseInt(myC_Top.cells[3].innerText));myC.parentElement.nextSibling.innerHTML=\"\"'>"+i+"q?lt;/td></tr>";
else
ystr+="<tr><td align=center style='cursor:hand' onmouseover=divS(this) onclick='myC_Top.cells[2].innerText=this.innerText;showDate("+i+",parseInt(myC_Top.cells[3].innerText));myC.parentElement.nextSibling.innerHTML=\"\"'>"+i+"q?lt;/td></tr>";
ystr+="<tr><td style='cursor:hand' onclick='createyear("+(year+20)+",myC_Top.cells[2])' align=center>下翻</td></tr>";
ystr+="</table>";
oDiv = myC.parentElement.nextSibling;
oDiv.innerHTML='';
oDiv.innerHTML = ystr;
showDiv(oDiv,obj.offsetTop+obj.offsetHeight,obj.offsetLeft);
}
function createmonth(month,obj)//创徏月䆾选择
{
var mstr;
var oDiv;
mstr="<table class='move1' cellspacing=0 cellpadding=2 width="+(obj.offsetWidth+5)+">";
for(i=1;i<13;i++)
if (month==i)
mstr+="<tr style='background-color:#909eff'><td style='color:black;height:16px;cursor:hand' align=center onclick='myC_Top.cells[3].innerText=this.innerText;showDate(parseInt(myC_Top.cells[2].innerText),"+i+");myC.parentElement.nextSibling.innerHTML=\"\"'>"+i+"?lt;/td></tr>";
else
mstr+="<tr><td align=center style='cursor:hand' onmouseover='divS(this)' onclick='myC_Top.cells[3].innerText=this.innerText;showDate(parseInt(myC_Top.cells[2].innerText),"+i+");myC.parentElement.nextSibling.innerHTML=\"\"'>"+i+"?lt;/td></tr>";
mstr+="</table>";
oDiv = myC.parentElement.nextSibling;
oDiv.innerHTML='';
oDiv.innerHTML = mstr;
showDiv(oDiv,obj.offsetTop+obj.offsetHeight,obj.offsetLeft);
}
function showDiv(obj,top,left)
{
obj.style.pixelTop=top;
obj.style.pixelLeft=left;
}
function myCMove(obj)
{
if(event.button==1)
{
var X = obj.clientLeft;
var Y = obj.clientTop;
obj.style.pixelLeft= X+(event.x-myC_x);
obj.style.pixelTop= Y+(event.y-myC_y);
window.status=myC_y;
}
}
function showDiv2(obj)
{
inputName=obj.name;
var e=obj;
var ot = obj.offsetTop;
var ol=obj.offsetLeft;
while(obj=obj.parentElement){ot+=obj.offsetTop;ol+=obj.offsetLeft;}
myC_div.style.pixelTop=ot+e.offsetHeight;
myC_div.style.pixelLeft=ol;
myC_div.style.display="block";
}
function createInput(name)
{myC_div.style.display='none';
document.write("<input type='text' name='"+name+"' size=20 onfocus='showDiv2(this)'>");
}
// --------------End ---------------------
</script>
<script>
var myCalendar=new myCalendar;
myCalendar.year=2006;
myCalendar.show();
myCalendar.input("txt1");
</script>
<input type="text" name="test" onfocus="showDiv2(this)" readonly=true>
2.无刷新排序简?br /><html>
<head>
<script>
function order()
{
var it=event.srcElement;
var table=it;
var i,j,k;
var t1,t2;
if(it.tagName=="TH"){
    i=it.cellIndex;
    it.title=it.title=="asc"?"desc":"asc";
    while(table.tagName!="TABLE")table=table.parentElement;
    if(table.rows.length<3)return true;
    for(j=1;j<table.rows.length;j++){
        for(k=j+1;k<table.rows.length;k++){
            if(it.title=="asc"?parseFloat(table.rows[k].cells[i].innerText)<parseFloat(table.rows[j].cells[i].innerText):parseFloat(table.rows[k].cells[i].innerText)>parseFloat(table.rows[j].cells[i].innerText))
            table.rows[j].swapNode(table.rows[k]);
        }
    }
}
}
</script>
</head>
<body>

<table border="1">
<thead onclick="order()" style="cursor:hand;">
<th>Item 1</th><th>Item 2</th><th>Item 3</th><th>Item 4</th>
</thead>
<tr><td>12.3</td><td>423</td><td>86.83</td><td>1.213</td></tr>
<tr><td>2</td><td>434</td><td>5.334</td><td>.234</td></tr>
<tr><td>33</td><td>43</td><td>5.223</td><td>8.73</td></tr>
<tr><td>21.3</td><td>234</td><td>52.34</td><td>.666</td></tr>
<tr><td>33.4</td><td>59</td><td>67.2</td><td>.426</td></tr>
</table>

</body>
</html>

 



]]>
Javascript-文g操作http://m.tkk7.com/zhanglijun33/archive/2006/12/01/JSWriteRead.html无?/dc:creator>无?/author>Fri, 01 Dec 2006 02:29:00 GMThttp://m.tkk7.com/zhanglijun33/archive/2006/12/01/JSWriteRead.htmlhttp://m.tkk7.com/zhanglijun33/comments/84760.htmlhttp://m.tkk7.com/zhanglijun33/archive/2006/12/01/JSWriteRead.html#Feedback7http://m.tkk7.com/zhanglijun33/comments/commentRss/84760.htmlhttp://m.tkk7.com/zhanglijun33/services/trackbacks/84760.htmlJavascript----文g操作
一、功能实现核心:(x)FileSystemObject 对象
    要在javascript中实现文件操作功能,主要是依靠FileSystemobject对象?br />二、FileSystemObject~程
使用FileSystemObject 对象q行~程很简单,一般要l过如下的步骤:(x) 创徏FileSystemObject对象、应用相x法、访问对象相兛_??
Q一Q创建FileSystemObject对象
创徏FileSystemObject对象的代码只?行:(x)
var fso = new ActiveXObject("Scripting.FileSystemObject");
上述代码执行后,fso成Z个FileSystemObject对象实例?
Q二Q应用相x?
创徏对象实例后,可以用对象的相关Ҏ(gu)了。比如,使用CreateTextFileҎ(gu)创徏一个文本文Ӟ(x)
var fso = new ActiveXObject("Scripting.FileSystemObject");
var f1 = fso.createtextfile("c:\\\\myjstest.txt",true");
Q三Q访问对象相兛_?
要访问对象的相关属性,首先要徏立指向对象的句柄Q这p通过getpdҎ(gu)实现QGetDrive负责获取驱动器信息,GetFolder负责获取文g夹信息,GetFile负责获取文g信息。比如,指向下面的代码后Qf1成为指向文件c:\\test.txt的句柄:(x)
var fso = new ActiveXObject("Scripting.FileSystemObject");
var f1 = fso.GetFile("c:\\\\myjstest.txt");
然后Q用f1讉K对象的相兛_性。比如:(x)
var fso = new ActiveXObject("Scripting.FileSystemObject");
var f1 = fso.GetFile("c:\\\\myjstest.txt");
alert("File last modified: " + f1.DateLastModified);
执行上面最后一句后Q将昄c:\\myjstest.txt的最后修Ҏ(gu)期属性倹{?
但有一点请注意Q对于用createҎ(gu)建立的对象,׃必再使用getҎ(gu)获取对象句柄了,q时直接使用createҎ(gu)建立的句柄名U就可以Q?
var fso = new ActiveXObject("Scripting.FileSystemObject");
var f1 = fso.createtextfile("c:\\\\myjstest.txt",true");
alert("File last modified: " + f1.DateLastModified);
三、操作驱动器QDrivesQ?
使用FileSystemObject对象来编E操作驱动器QDrivesQ和文g夹(F(tun)oldersQ很Ҏ(gu)Q这p在Windows文g览器中Ҏ(gu)件进行交互操作一P比如Q拷贝、移动文件夹Q获取文件夹的属性?
Q一QDrives对象属?
Drive对象负责攉pȝ中的物理或逻辑驱动器资源内容,它具有如下属性:(x)
l TotalSizeQ以字节QbyteQؓ(f)单位计算的驱动器大小?
l AvailableSpace或FreeSpaceQ以字节QbyteQؓ(f)单位计算的驱动器可用I间?
l DriveLetterQ驱动器字母?
l DriveTypeQ驱动器cdQ取gؓ(f)QremovableQ移动介质)、fixedQ固定介质)、networkQ网l资源)、CD-ROM或者RAM盘?
l SerialNumberQ驱动器的系列码?
l FileSystemQ所在驱动器的文件系l类型,取gؓ(f)FAT、FAT32和NTFS?
l IsReadyQ驱动器是否可用?
l ShareNameQ共享名U?
l VolumeNameQ卷标名U?
l Path和RootFolderQ驱动器的\径或者根目录名称?
Q二QDrive对象操作例程
下面的例E显C驱动器C的卷标、d量和可用I间{信息:(x)
var fso, drv, s ="";
fso = new ActiveXObject("Scripting.FileSystemObject");
drv = fso.GetDrive(fso.GetDriveName("c:\\\\"));
s += "Drive C:" + " - ";
s += drv.VolumeName + "\\n";
s += "Total Space: " + drv.TotalSize / 1024;
s += " Kb" + "\\n";
s += "Free Space: " + drv.FreeSpace / 1024;
s += " Kb" + "\\n";
alert(s);
四、操作文件夹QF(tun)oldersQ?
涉及(qing)到文件夹的操作包括创建、移动、删除以?qing)获取相兛_性?
Folder对象操作例程 :
下面的例E将l习(fn)获取父文件夹名称、创建文件夹、删除文件夹、判断是否ؓ(f)根目录等操作Q?
var fso, fldr, s = "";
// 创徏FileSystemObject对象实例
fso = new ActiveXObject("Scripting.FileSystemObject");
// 获取Drive 对象
fldr = fso.GetFolder("c:\\\\");
// 昄父目录名U?
alert("Parent folder name is: " + fldr + "\\n");
// 昄所在drive名称
alert("Contained on drive " + fldr.Drive + "\\n");
// 判断是否为根目录
if (fldr.IsRootFolder)
alert("This is the root folder.");
else
alert("This folder isn\'t a root folder.");
alert("\\n\\n");
// 创徏新文件夹
fso.CreateFolder ("C:\\\\Bogus");
alert("Created folder C:\\\\Bogus" + "\\n");
// 昄文g夹基名称Q不包含路径?
alert("Basename = " + fso.GetBaseName("c:\\\\bogus") + "\\n");
// 删除创徏的文件夹
fso.DeleteFolder ("C:\\\\Bogus");
alert("Deleted folder C:\\\\Bogus" + "\\n");
五、操作文ӞF(tun)ilesQ?
Ҏ(gu)件进行的操作要比以上介绍的驱动器QDriveQ和文g夹(F(tun)olderQ操作复杂些Q基本上分ؓ(f)以下两个cdQ对文g的创建、拷贝、移动、删除操作和Ҏ(gu)件内容的创徏、添加、删除和d操作。下面分别详l介l?
Q一Q创建文?
一共有3U方法可用于创徏一个空文本文gQ这U文件有时候也叫做文本(text streamQ?
W一U是使用CreateTextFileҎ(gu)。代码如下:(x)
var fso, f1;
fso = new ActiveXObject("Scripting.FileSystemObject");
f1 = fso.CreateTextFile("c:\\\\testfile.txt", true);
W二U是使用OpenTextFileҎ(gu)Qƈd上ForWriting属性,ForWriting的gؓ(f)2。代码如下:(x)
var fso, ts;
var ForWriting= 2;
fso = new ActiveXObject("Scripting.FileSystemObject");
ts = fso.OpenTextFile("c:\\\\test.txt", ForWriting, true);
W三U是使用OpenAsTextStreamҎ(gu)Q同栯讄好ForWriting属性。代码如下:(x)
var fso, f1, ts;
var ForWriting = 2;
fso = new ActiveXObject("Scripting.FileSystemObject");
fso.CreateTextFile ("c:\\\\test1.txt");
f1 = fso.GetFile("c:\\\\test1.txt");
ts = f1.OpenAsTextStream(ForWriting, true);
Q二Q添加数据到文g
当文件被创徏后,一般要按照“打开文gQ?gt;填写数据Q?gt;关闭文g”的步骤实现d数据到文件的目的?
打开文g可用FileSystemObject对象的OpenTextFileҎ(gu)Q或者用File对象的OpenAsTextStreamҎ(gu)?
填写数据要用到TextStream对象的Write、WriteLine或者WriteBlankLinesҎ(gu)。在同是实现写入数据的功能下Q这3者的区别在于QWriteҎ(gu)不在写入数据末尾d新换行符QW(xu)riteLineҎ(gu)要在最后添加一个新换行W,而W(xu)riteBlankLines则增加一个或者多个空行?
关闭文g可用TextStream对象的CloseҎ(gu)?
Q三Q创建文件及(qing)d数据例程
下面的代码将创徏文g、添加数据、关闭文件几个步骤结合v来进行应用:(x)
var fso, tf;
fso = new ActiveXObject("Scripting.FileSystemObject");
// 创徏新文?
tf = fso.CreateTextFile("c:\\\\testfile.txt", true);
// 填写数据Qƈ增加换行W?
tf.WriteLine("Testing 1, 2, 3.") ;
// 增加3个空?
tf.WriteBlankLines(3) ;
// 填写一行,不带换行W?
tf.Write ("This is a test.");
// 关闭文g
tf.Close();
Q四Q读取文件内?
从文本文件中d数据要用TextStream对象的Read、ReadLine或ReadAll Ҏ(gu)。ReadҎ(gu)用于d文g中指定数量的字符QReadLineҎ(gu)d一整行Q但不包括换行符QReadAllҎ(gu)则读取文本文件的整个内容。读取的内容存放于字W串变量中,用于昄、分析。在使用Read或ReadLineҎ(gu)d文g内容Ӟ如果要蟩q一些部分,p用到Skip或SkipLineҎ(gu)?
下面的代码演C打开文g、填写数据,然后d数据Q?
var fso, f1, ts, s;
var ForReading = 1;
fso = new ActiveXObject("Scripting.FileSystemObject");
// 创徏文g
f1 = fso.CreateTextFile("c:\\\\testfile.txt", true);
// 填写一行数?
f1.WriteLine("Hello World");
f1.WriteBlankLines(1);
// 关闭文g
f1.Close();
// 打开文g
ts = fso.OpenTextFile("c:\\\\testfile.txt", ForReading);
// d文g一行内容到字符?
s = ts.ReadLine();
// 昄字符串信?
alert("File contents = \'" + s + "\'");
// 关闭文g
ts.Close();
Q五Q移动、拷贝和删除文g
对于以上三种文g操作Qjavascript各有两种对应的方法:(x)File.Move ?FileSystemObject.MoveFile用于Ud文gQFile.Copy ?FileSystemObject.CopyFile用于拯文gQFile.Delete ?FileSystemObject.DeleteFile用于删除文g?
下面的代码演C在驱动器C的根目录下创Z个文本文Ӟ填写一些内容,然后文件移动到\\tmp目录下,再在目录\\temp下面建立一个文件拷贝,最后删除这两个目录的文Ӟ(x)
var fso, f1, f2, s;
fso = new ActiveXObject("Scripting.FileSystemObject");
f1 = fso.CreateTextFile("c:\\\\testfile.txt", true);
// 写一?
f1.Write("This is a test.");
// 关闭文g
f1.Close();
// 获取C:\\根目录下的文件句?
f2 = fso.GetFile("c:\\\\testfile.txt");
// Ud文g到\\tmp目录?
f2.Move ("c:\\\\tmp\\\\testfile.txt");
// 拯文g到\\temp目录?
f2.Copy ("c:\\\\temp\\\\testfile.txt");
// 获取文g句柄
f2 = fso.GetFile("c:\\\\tmp\\\\testfile.txt");
f3 = fso.GetFile("c:\\\\temp\\\\testfile.txt");
// 删除文g
f2.Delete();
f3.Delete();
六、结 ?
通过以上对FileSystemObject的各U对象、属性和Ҏ(gu)的介l和CZQ相信你已经对如何用javascript语言在页面中操作驱动器、文件和文gҎ(gu)了清晰的认识。但是上q提?qing)的例程都非常简单,要全面、灵zd掌握javascript文g操作技术,q需要大量的实践l习(fn)。而且q有一Ҏ(gu)醒大Ӟ׃涉及(qing)到在览器中q行文gdq样的高U操作,对于默认的浏览器安全U别而言Q在代码q行前都?x)有一个信息提C,q点请在实际环境中提C问者注意?br /><

]]>
ajax study (1)http://m.tkk7.com/zhanglijun33/archive/2006/11/28/ajax1.html无?/dc:creator>无?/author>Tue, 28 Nov 2006 07:03:00 GMThttp://m.tkk7.com/zhanglijun33/archive/2006/11/28/ajax1.htmlhttp://m.tkk7.com/zhanglijun33/comments/84053.htmlhttp://m.tkk7.com/zhanglijun33/archive/2006/11/28/ajax1.html#Feedback4http://m.tkk7.com/zhanglijun33/comments/commentRss/84053.htmlhttp://m.tkk7.com/zhanglijun33/services/trackbacks/84053.html?wi)青兄写的一个ajaxcR?br />var http_request = false;
function send_request(method,url,formName,responseType,callback) {
 http_request = false;
 var content =""
 if(forName != null)content = getFormAsString(formName);
  
 if(window.XMLHttpRequest) {
  http_request = new XMLHttpRequest();
  if (http_request.overrideMimeType) {
   http_request.overrideMimeType("text/xml");
  }
 }
 else if (window.ActiveXObject) {
  try {
   http_request = new ActiveXObject("Msxml2.XMLHTTP");
  } catch (e) {
   try {
    http_request = new ActiveXObject("Microsoft.XMLHTTP");
   } catch (e) {}
  }
 }
 if (!http_request) {
  window.alert("不能创徏XMLHttpRequest对象实例.");
  return false;
 }
 if(responseType.toLowerCase()=="text") {
  http_request.onreadystatechange = callback;
 }
 else if(responseType.toLowerCase()=="xml") {
  http_request.onreadystatechange = callback;
 }
 else {
  window.alert("响应cd参数错误?);
  return false;
 }
 if(method.toLowerCase()=="get") {
  http_request.open(method, url, true);
 }
 else if(method.toLowerCase()=="post") {
  http_request.open(method, url, true);
  http_request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");  
 }
 else {
  window.alert("httphcd参数错误?);
  return false;
 }  
 if(window.ActiveXObject) http_request.setRequestHeader("If-Modified-Since", "0");
 http_request.send(content);
}

function getFormAsString(formName){

returnString ="";

formElements=document.forms[formName].elements;

for(var i=formElements.length-1;i>=0; --i ){

returnString+="&"

+escape(formElements[i].name)+"="

+escape(formElements[i].value);

}

}



]]>
DWR: Easy AJAX for JAVAhttp://m.tkk7.com/zhanglijun33/archive/2006/09/21/AJAXWITHDWR.html无?/dc:creator>无?/author>Thu, 21 Sep 2006 08:51:00 GMThttp://m.tkk7.com/zhanglijun33/archive/2006/09/21/AJAXWITHDWR.htmlhttp://m.tkk7.com/zhanglijun33/comments/71155.htmlhttp://m.tkk7.com/zhanglijun33/archive/2006/09/21/AJAXWITHDWR.html#Feedback2http://m.tkk7.com/zhanglijun33/comments/commentRss/71155.htmlhttp://m.tkk7.com/zhanglijun33/services/trackbacks/71155.htmlDWR is a Java open source library which allows you to write Ajax web sites.

It allows code in a browser to use Java functions running on a web server just as if it was in the browser.

DWR consists of two main parts:

  • A Java Servlet running on the server that processes requests and sends responses back to the browser.
  • JavaScript running in the browser that sends requests and can dynamically update the webpage.

DWR works by dynamically generating Javascript based on Java classes. The code does some Ajax magic to make it feel like the execution is happening on the browser, but in reality the server is executing the code and DWR is marshalling the data back and forwards.

This method of remoting functions from Java to JavaScript gives DWR users a feel much like conventional RPC mechanisms like RMI or SOAP, with the benefit that it runs over the web without requiring web-browser plug-ins.

Java is fundamentally synchronous where Ajax is asynchronous. So when you call a remote method, you provide DWR with a callback function to be called when the data has been returned from the network.

interaction diagramThe diagram shows how DWR can alter the contents of a selection list as a result of some Javascript event like onclick.

DWR dynamically generates an AjaxService class in Javascript to match some server-side code. This is called by the eventHandler. DWR then handles all the remoting details, including converting all the parameters and return values between Javascript and Java. It then executes the supplied callback function (populateList) in the example below which uses a DWR utility function to alter the web page.

DWR helps you in producing highly interactive web-sites by providing some Javascript libraries to help with DHTML and by giving you a set of examples to copy from.

For details on how to get started with DWR see the getting started guide and download instructions.
//---------------------------以下是中文介l?0--------------------------------------------------------------

q段旉较闲,研究了一番dwr.发现dwr实现的AJAX有些地方实很是先进.比如动态生成javascript代码;隐藏的http协议;javascript于java代码交互的是javascript对象(或字W串){?
以下是我临时译的一些东?本来惛_?发现dwr实在是简?随便写?英文居差,C?

1、DWR: Easy AJAX for JAVA

作ؓ(f)一个java open source library,DWR可以帮助开发h员完成应用AJAX技术的webE序。它可以让浏览器上的javascriptҎ(gu)调用q行在web服务器上javaҎ(gu)?

DWR主要׃部门l成。javascript与web服务器通信q更新web;q行在web服务器的Servlet处理hq把响应发回览器?

DWR 采用新颖的方法实CAJAX(本来也没有确切的定义)Q在java代码基础上动态的生成javascript代码。web开发者可以直接调用这?javascript代码Q然而真正的代码是运行在web服务器上的java code。出与安全考虑Q开发者必配|哪些java class暴露lDWR.(dwr.xml)

q种?java到javascript)调用机制l用户一U感觉,好象常规的RPC机制Q或RMI or SOAP.但是它运行在web上,不需要Q何浏览器插g?

DWR 不认为浏览器和web服务器之间协议重要,把系l界面放在首位。最大挑战是java method call的同步特征与ajax异步Ҏ(gu)之间的矛盾。在异步模型里,l果只有在方法结束后才有效。DWR解决了这个问题,把回调函数当成参Cl方法,处理完成后,自动调用回调Ҏ(gu)?

q个图表昄了,通过javascript事gQDWR能改变select的内容,当然q些内容?java代码q回?javascript函数Data.getOptions(populateList)由DWR动态生成,q个函数?x)调用java class DatacȝҎ(gu)。DWR处理如何q程调用Q包括{换所有的参数和返回的l果Qjavascript\javaQ。javaҎ(gu)执行完后Q执行回调方?populateList。在整个q程中我们就惛_用本地的Ҏ(gu)一栗?

2、Getting Started

废话说Q试试就ok了?
web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app id="dwr">
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
</web-app>

dwr.xml 与web.xml同目?
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd">
<dwr>
<allow>
<create creator="new" javascript="JDate">
<param name="class" value="java.util.Date"/>
</create>
</allow>
</dwr>

index.html
<html>
<head>
<title>DWR - Test Home</title>
<script type='text/javascript' src='dwr/interface/JDate.js'></script>
<script type='text/javascript' src='dwr/engine.js'></script>
<script>
function init(){
JDate.getYear(load);
}
function load(data){
alert(data+1900+'q?)
}
</script>
</head>
<body onload="init()">
</body>
</html>

dwr.jar 下蝲放lib?

完了Q什么,够了Q就q些。访问ok!
3、Examples
http://www.aboutmyhealth.org/ q不是Google Suggest?ok.
4、源码浅?
dwr的设计很象webwork2的设?隐藏http协议,扩展性,兼容性及(qing)强?

通过研究uk.ltd.getahead.dwr.DWRServletq个servlet来研I下dwr到底是如何工作滴?

java代码: 

web.xml配置
<servlet>
    <servlet-name>dwr-invoker</servlet-name>
    <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>dwr-invoker</servlet-name>
    <url-pattern>/dwr/*</url-pattern>
</servlet-mapping>


q样所有的/dwr/*所有请求都p个servlet来处理,它到底处理了些什么能。我们还以上面最单的例子来看?
1?web服务器启动,DWRServlet init()Ҏ(gu)调用Qinit主要做了以下工作?
讄日志U别、实例化DWR用到的单例类Q这些类在jvm中只有一个实例对象)、读去配|文Ӟ包括dwr.jar包中的dwr.xml,WEB-INF/dwr.xml. config*.xmlQ?
2、请求处?
DWRServlet.doGet, doPostҎ(gu)都调用processor.handle(req, resp)Ҏ(gu)处理。Processor对象在init()Ҏ(gu)中已l初始化了?
java代码: 

publicvoid handle(HttpServletRequest req, HttpServletResponse resp)
        throwsIOException
    {
        String pathinfo = req.getPathInfo();
        if(pathinfo == null || pathinfo.length() == 0 || pathinfo.equals("/"))
        {
            resp.sendRedirect(req.getContextPath() + req.getServletPath() + '/' + "index.html");
        }else
        if(pathinfo != null && pathinfo.equalsIgnoreCase("/index.html"))
        {
            doIndex(req, resp);
        }else
        if(pathinfo != null && pathinfo.startsWith("/test/"))
        {
            doTest(req, resp);
        }else
        if(pathinfo != null && pathinfo.equalsIgnoreCase("/engine.js"))
        {
            doFile(resp, "engine.js", "text/javascript");
        }else
        if(pathinfo != null && pathinfo.equalsIgnoreCase("/util.js"))
        {
            doFile(resp, "util.js", "text/javascript");
        }else
        if(pathinfo != null && pathinfo.equalsIgnoreCase("/deprecated.js"))
        {
            doFile(resp, "deprecated.js", "text/javascript");
        }else
        if(pathinfo != null && pathinfo.startsWith("/interface/"))
        {
            doInterface(req, resp);
        }else
        if(pathinfo != null && pathinfo.startsWith("/exec"))
        {
            doExec(req, resp);
        }else
        {
            log.warn("Page not found. In debug/test mode try viewing /[WEB-APP]/dwr/");
            resp.sendError(404);
        }
    }


哦。这些恍然大(zhn)。dwr/*处理的请求也p几种?
Q?Qdwr/index.htmlQdwr/test/q种只能在debug模式下用,调试用?
dwr/engine.jsQdwr/util.jsQdwr/deprecated.js当这个请求到达,从dwr.jar包中d文g,响应回去。(重复h有缓存)
Q?Q当dwr/interface/q种h到来Q(例如我们在index.html中的 <script type='text/javascript' src='dwr/interface/JDate.js'></script>QDWR做一件伟大的事。把我们在WEB- INF/dwr.xml中的
<create creator="new" javascript="JDate">
<param name="class" value="java.util.Date"/>
</create>
java.util.Date转化为javascript函数?
http://localhost:port/simpledwr/dwr/interface/JDate.js看看吧?/font>
l节也比较简单,通过java反射Q把Ҏ(gu)都写成javascript特定的方法。(我觉得这些{换可以放到缓存里Q下ơ调用没必要再生成一遍,不知道作者ؓ(f)什么没q样做)?
Q?Qdwr/exec
javascript调用Ҏ(gu)时发送这U请求,可能是XMLHttpRequest或IFrame发送?
当然Qjavascript调用的方法签名与java代码一_(d)包括参数Q还有javascript的回调方法也传到了服务器端,在服务器端很Ҏ(gu)实现。回调方法的java的执行结?q回cM <script>callMethod(l果)<script>的javascript字符?在浏览器执行。哈Q一切就q么单,巧妙?

dwr的设计构思很是y妙?
W一、把javac{化ؓ(f)javascriptcȝdwr自动完成Q只需单的配置?
W二、应用v来极其简单。开发者不要该服务器代码就可以集成?
W三、容易测试。和webwork一P隐藏的http协议?
W四、及(qing)强扩展性。例如与spring集成Q只需修改一点代码?
W五、性能。就我与jason,{简单比较,dwr性能可能是最好的?
W六、自动把java对象转化为javascript对象Qƈ且及(qing)易扩展?/span>



]]>
Work Ajax with dwr for javahttp://m.tkk7.com/zhanglijun33/archive/2006/09/19/ajaxforjava.html无?/dc:creator>无?/author>Tue, 19 Sep 2006 08:38:00 GMThttp://m.tkk7.com/zhanglijun33/archive/2006/09/19/ajaxforjava.htmlhttp://m.tkk7.com/zhanglijun33/comments/70560.htmlhttp://m.tkk7.com/zhanglijun33/archive/2006/09/19/ajaxforjava.html#Feedback0http://m.tkk7.com/zhanglijun33/comments/commentRss/70560.htmlhttp://m.tkk7.com/zhanglijun33/services/trackbacks/70560.html

作?Cloves Carneiro; simmone
原文地址: http://www.javaworld.com/javaworld/jw-06-2005/jw-0620-dwr.html
中文地址: http://www.matrix.org.cn/resource/article/43/43926_DWR_AJAX.html
关键词:(x) DWR AJAX


概述

q篇文章阐述了用开源项目DWR(直接Webq程控制)和AJAX(异步JavaScript和XML)的概忉|提高Web应用的可用性。作者一步步来展CDWR如何使得AJAX的应用既单又快捷。(1600?2005q??0日)

AJAXQ或者说是异步JavaScript和XMLQ描qC一U用؜合了HTML(或XHTML)和层叠样式表作ؓ(f)表达信息,来创Z互式的Web应用的开发技?文档对象模型QDOMQ,JavaScript,动态地昄和与表达信息q行交互;q且QXMLHttpRequest对象与Web服务器异步地交换和处理数据?br />
因特|上许多例子展示了在一个HTML文g内部使用XMLHttpRequest与服务器端进行交互的必要的步骤。当手工地编写和l护XMLHttpRequest代码Ӟ开发者必d理许多潜在的问题Q特别是cM于跨览器的DOM实现的兼Ҏ(gu)这L(fng)问题。这会(x)D在编码和调试Javascript代码上面pC清的旉Q这昄对开发者来说很不友好?br />
DWR(直接Webq程控制)目是在Apache许可下的一个开源的解决Ҏ(gu)Q它供给那些惌以一U简单的方式使用AJAX和XMLHttpRequest的开发者。它h一套Javascript功能集,它们把从HTML面调用应用服务器上的Java对象的方法简化了。它操控不同cd的参敎ͼq同时保持了HTML代码的可L?br />
DWR不是对一个设计的插入Q也不强q对象用Q何种cȝl承l构。它和servlet框架内的应用配合的很好。对~少DHTML~程l验的开发者来_(d)DWR也提供了一个JavaScript库包含了l常使用的DHTMLdQ如l装表,用item填充select下拉框,改变HTML元素的内容,?lt;div>?lt;span>
DWR|站是详的q且有大量的文档Q这也是q篇文章的基。一些例子用来展CDWR如何使用和用它的库可以完成什么样的工作?br />
q篇文章让读者看C一个用了DWR的Web应用是如何一步步建立的。我?x)展C创个简单的CZ应用的必要的l节Q这个应用是可下载的q且可以在你的环境中布v来看看DWR如何工作?br />注意Q找到有关AJAX的信息ƈ不困?|页上有几篇文章和博客的条目늛了这个主题,每一个都试图指出和评个概늚不同的方面。在资源部分Q你?x)找C些有的指向CZ和文章的链接Q来学习(fn)AJAX的更多的内容?br />
CZ应用
q篇文章使用的示例应用模拟了多u多的一个公寓出U搜索引擎。用户可以在搜烦(ch)前选择一l搜索标准。ؓ(f)了提高交互性,AJAX中以下两U情况下使用Q?br />·应用通告用户配合他的选择?x)返回多搜索结果。这个数字是实时更新?使用AJAX-当用户选择的卧室和室的数量,或者h(hun)D围变化时。当W合标准的搜索结果没有或太多Ӟ用户没有必要点?yn)L索按U?br />·数据库查询ƈ取回l果是由AJAX完成的。当用户按下昄l果按钮Ӟ数据库执行搜索。这P应用看v来更具响应了Q而整个页面不需要重载来昄l果?br />
数据?/span>
我们使用的数据库是HSQLQ它是一U占用资源很的Java SQL数据库引擎,可以不需要安装和配置的与Web应用捆绑在一赗一个SQL文g被用来在Web应用的上下文启动时创Z个内存中的表q添加一些记录?br />
Javac?/span>
应用包含了两个主要的cdApartment和ApartmentDAO。Apartment.javacL一个有着属性和getter/setterҎ(gu)的简单的JavacRApartmentDAO.java是数据访问类Q用来查询数据库q基于用L(fng)搜烦(ch)标准来返回信息。ApartmentDAOcȝ实现的直接了当的;它直接用了Java数据库联接调用来得到公寓的L和符合用戯求的可用公寓的列表?br />
DWR配置和?/span>
讄DWR的用是单的Q将DWR的jar文g拷入Web应用的WEB-INF/lib目录中,在web.xml中增加一个servlet声明Qƈ创徏DWR的配|文件。DWR的分发中需要用一个单独的jar文g。你必须DWR servlet加到应用的WEB-INF/web.xml中布|描q段中去?br />

								    <servlet>
        <servlet-name>dwr-invoker</servlet-name>
        <display-name>DWR Servlet</display-name>
        <description>Direct Web Remoter Servlet</description>
        <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>true</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>dwr-invoker</servlet-name>
        <url-pattern>/dwr/*</url-pattern>
    </servlet-mapping>


一个可选的步骤是设|DWR试模式—象上面的例子那样—在servlet描述D中debug参数设ؓ(f)true。当DWR在调试模式时Q你可以从HTMl|页中看到所有的可访问的Java对象。包含了可用对象列表的网会(x)出现?WEBAPP/dwrq个url上,它显CZ对象的公共方法。所列方法可以从面中调用,允许你,W一ơ,q行服务器上的对象的Ҏ(gu)。下图显CZ调试늚样子:

image
调试?br />
现在你必让DWR知道通过XMLHttpRequest对象Q什么对象将?x)接收请求。这个Q务由叫做dwr.xml的配|文件来完成。在配置文g中,定义了DWR允许你从|页中调用的对象。从设计上讲QDWR允许讉K所有公布类的公共方法,但在我们的例子中Q我们只允许讉K几个Ҏ(gu)。下面是我们CZ的配|文?
								<dwr>
    <allow>
        <convert converter="bean" match="dwr.sample.Apartment"/>
        <create creator="new" javascript="ApartmentDAO" class="dwr.sample.ApartmentDAO">
            <include method="findApartments"/>
            <include method="countApartments"/>
        </create>
    </allow>
</dwr>


上面的文件实C我们例子中的两个目标。首先,<convert>标记告诉DWRdwr.sample.Apartment对象的类型{换ؓ(f)联合数组Q因为,Z安全的原因,DWR默认的不?x){换普通bean。第二,<create>标记让DWR暴露出dwr.sample.ApartmentDAOcȝJavaScript调用;我们在页面中使用JavaScript文g被javascript属性定义。我们必L?lt;include>标记Q它指明了dwr.sample.ApartmentDAOcȝ哪些Ҏ(gu)可用?br />
HTML/JSP代码
配置完成后,你就可以启动你的Web应用了,q时DWR?x)?f)从你的HTML或Java服务器端面(JSP)上调用所需Ҏ(gu)作好准备Qƈ不需要你创徏JavaScript文g。在search.jsp文g中, 我们必须增加由DWR提供的JavaScript接口Q还有DWR引擎Q加入以下三行到我们的代码中Q?br />
								  <script src='dwr/interface/ApartmentDAO.js'></script>
  <script src='dwr/engine.js'></script>
  <script src='dwr/util.js'></script>


我们注意到当用户改变搜烦(ch)标准Ӟq是AJAX在示例程序中的首ơ应?正如他所看到的,当标准改变时Q可用的公寓数量被更C。我创徏了两个JavaScript函数Q当某一个选择下拉框中的值变化时被调用。ApartmentDAO.countApartments()函数是最重要的部分。最有趣的是W一个参? loadTotal()函数Q它指明了当接收到服务端的返回时DWR会(x)调用的JavaScriptҎ(gu)。loadTotal于是被调用来在HTML面?lt;div>中显C结果。下面是在这个交互场景中所使用到的JavaScript函数:

								function updateTotal() {
    $("resultTable").style.display = 'none';
    var bedrooms = document.getElementById("bedrooms").value;
    var bathrooms = document.getElementById("bathrooms").value;
    var price = document.getElementById("price").value;
    ApartmentDAO.countApartments(loadTotal, bedrooms, bathrooms, price);
}

function loadTotal(data) {
    document.getElementById("totalRecords").innerHTML = data;
}


很明显,用户想看到符合他的搜索条件的公寓列表。那么,当用户对他的搜烦(ch)标准感到满意Qƈ且L也是有效的话Q他?x)按下显C结果的按纽Q这会(x)调用updateResults() JavaScriptҎ(gu)Q?br />
								function updateResults() {
    
    DWRUtil.removeAllRows("apartmentsbody");
    var bedrooms = document.getElementById("bedrooms").value;
    var bathrooms = document.getElementById("bathrooms").value;
    var price = document.getElementById("price").value;
    ApartmentDAO.findApartments(fillTable, bedrooms, bathrooms, price);
    $("resultTable").style.display = '';
}

function fillTable(apartment) {
    DWRUtil.addRows("apartmentsbody", apartment, [ getId, getAddress, getBedrooms, getBathrooms, getPrice ]);
}


updateResults()Ҏ(gu)清空了存放搜索返回结果的表域Q从用户界面上获取所需参数Qƈ且将q些参数传给DWR创徏的ApartmentDAO对象。然后数据库查询被执行QfillTable()会(x)被调用,它解析了DWRq回的对?apartment)Q然后将其显C到面?apartmentsbody)?br />
安全因素
Z保持CZ的简要,ApartmentDAOcd可能的保持简单,但这L(fng)一个类通常有一l设|方法来操作数据Q如insert(), update()和delete()。DWR暴露了所有公共方法给所有的HTML面调用。出于安全的原因Q像q样暴露你的数据讉K层是不明智的。开发者可以创Z个门面来集中所有JavaScript函数与底层业务组件之间的通信Q这样就限制了过多暴露的功能?br />
l论
q篇文章仅仅让你在你的项目中使用由DWR支持的AJAX开了个头。DWR让你集中注意力在如何提高你的应用的交互模型上面,消除了编写和调试JavaScript代码的负担。用AJAX最有趣的挑战是定义在哪里和如何提高可用性。DWR负责了操作Web面与你的Java对象之间的通信Q这样就帮助你完全集中注意力在如何让你的应用的用L(fng)面更加友好,
我想感谢Mircea Oancea和Marcos Pereira,他们阅读了这文章ƈl予了非常有价值的q匮?br />
资源
·javaworld.com:
javaworld.com
·Matrix-Java开发者社? http://www.matrix.org.cn/
·onjava.com: onjava.com
·下蝲CZE序的全部源? http://www.javaworld.com/javaworld/jw-06-2005/dwr/jw-0620-dwr.war
·DWR: http://www.getahead.ltd.uk/dwr/index.html
·HSQL:http://hsqldb.sourceforge.net/
·AJAX的定?http://en.wikipedia.org/wiki/AJAX
· “AJAX:通向Web应用的新途径": Jesse James Garrett (Adaptive Path, 2005.2): http://www.adaptivepath.com/publications/essays/archives/000385.php
· “非常动态的Web界面?Drew McLellan (xml.com, 2005.2): http://www.xml.com/pub/a/2005/02/09/xml-http-request.html
·XMLHttpRequest & AJAX 工作范例: http://www.fiftyfoureleven.com/resources/programming/xmlhttprequest/examples
· “可用的XMLHttpRequest实践?Thomas Baekdal (Baekdal.com, 2005.3): http://www.baekdal.com/articles/Usability/usable-XMLHttpRequest/
·"XMLHttpRequest使用导引" Thomas Baekdal (Baekdal.com,  2005.2):http://www.baekdal.com/articles/Usability/XMLHttpRequest-guidelines/
·AJAX实质:http://www.ajaxmatters.com/

(看完后个人感觉:(x)有了DWRJAVA开发而言Q完全可以与AJAXҎ(gu)啦,省了在JS上对XMLHTTP以及(qing)对DOM的处理,不可以避免地在后台对应的IO处理Q然后就DWR来说Q它增加了对XML中对应的配置--在开源框架中g一直不曑ց止过。还有对一些DWR自有用法如DWRUtil.addRows得参考其相关文档---当然q样的功能我们自׃可以用JS来解冻Iq且它显然很实用?
DWRUtil学习(fn)



q些功能函数在下面这个网址都有CZ,q里只是把他们用中文解释,方便查找.
http://getahead.ltd.uk/dwr/browser/util

DWRUtil.getText(id)

q个函数只能用于select

getText(id) is similar to getValue(id), except that it is designed for <select ... lists where you need to get the displayed text rather than the value of the current option.

q个函数主要的作用是取到当前select的显C值即<option value>xxx</option>中xxx的内?


DWRUtil.getValue(id) 用来得到<option value>xxx</option>{元素的value?

DWRUtil.getValue(id) is the read version of setValue(). This gets the values out of the HTML elements without you needing to worry about how a selection list differs from a div.



q个函数能用于多个元素input type =textarea,text,Form button,formbutton,password(明文),
Fancy button{元?主要可以屏蔽原来对select元素getValue操作带来的不?


DWRUtil.getValues()


getValues() is similar to getValue() except that the input is a Javascript object that contains name/value pairs. The names are assumed to be the IDs of HTML elements, and the values are altered to reflect the contents of those IDs. This method does not return the object in question, it alters the value that you pass to it.
此函C要是一ơ完成多个元素的getValue()操作,q将value的结果以js对象的Ş式封装v来返?参数是一个js对象,其中包含了希望取到value的element id
e.g
{ div:null, textarea:null, select:null, text:null, password:null, formbutton:null, button:null}
详细参?a target="_new">http://getahead.ltd.uk/dwr/browser/util/getvalues查看效果
DWRUtil.onReturn
When inputs are part of a form then the return key causes the form to be submitted. When you are using Ajax, this is generally not what you want. Usually it would be far better if some JavaScript was triggered.Unfortunately different browsers handle events in quite a different manner. So DWRUtil.onReturn patches over the differences.
在一个form表单中敲回R键将D表单被递交,q往往不是我们希望看到?但是很多览器对q个事g的处理是不统一?q个函数是Z消除q个不统一?

DWRUtil.onReturn(event, submitFunction)


DWRUtil.selectRange
Selecting a range of text in an input box
You need to select text in an input box for any "Google suggest" type functions, however the selection model changes a lot between different browsers. The DWRUtil function to help here is: DWRUtil.selectRange(ele, start, end).
在一个input元素中选择一个范围的字符?可以查看
http://getahead.ltd.uk/dwr/browser/util/selectrange操作

DWRUtil.setValue(id, value)

DWRUtil.setValue(id, value) finds the element with the id specified in the first parameter and alters its contents to be the value in the second parameter.
This method works for almost all HTML elements including selects (where the option with a matching value and not text is selected), input elements (including textareas) divs and spans.
主要是ؓ(f)了设?屏蔽了select元素讑ր的问题,对select也可以方便的setvalue

DWRUtil.setValues()
Similar to setValue except that the input is a Javascript object that contains name/value pairs. The names are assumed to be the IDs of HTML elements, and the values, what we should set the contents of the elements.
与getValues对应,传入js对象,对象中的value传给相应的element

DWRUtil.toDescriptiveString(id,degree)
DWRUtil.toDescriptiveString is a better version of the toString() than the default. This function has a third parameter that declares the initial indent. This function should not be used from the outside world as it may well change in the future.
此函C要用来调?传入元素的id,调试的degree显CDOM信息
此函数有W三个参?用于声明初始?包含W三个参数的调用不应该ؓ(f)使用,因ؓ(f)q个函数来?x)改?
DWRUtil.useLoadingMessage
You must call this method after the page has loaded (i.e. not before the onload() event has fired) because it creates a hidden div to contain the loading message.
你必d面加蝲完成?body onload事g)调用q个函数,因ؓ(f)它会(x)创徏一个div,来包含一些消?cMgmail的message模式的东?Z辑ֈ在页面加载完成后来操?
http://getahead.ltd.uk/dwr/browser/util/useloadingmessage
提供了一些方?例如
<script>function init() { DWRUtil.useLoadingMessage();}if (window.addEventListener) { window.addEventListener("load", init, false);}else if (window.attachEvent) { window.attachEvent("onload", init);}else { window.onload = init;}</script>
该参考页面给Z2个类似的文字囄实现.
DWRUtil.addOptions() 用返回的集合来填充select元素
多种实现,详细参?a target="_new">http://getahead.ltd.uk/dwr/browser/lists

DWRUtil.addRows() q回的集合来填充table元素,或者tbody更ؓ(f)合适?br /> 


]]>
վ֩ģ壺 AVһһ| ɫɫBwwW| ҹƵ߹ۿ| avr| ձѲ| ޹Ʒۺ˳ۺվ| ߹ۿɫƬƵ | Ʒһ| ߹ۿƵѹ| ƷžƷƵ| ޾þþþþ| ػaëƬƵ| ۺһƷ| һëƬ| 91avƵ| Ѹ| ñIJԭӾѹۿ| ĻAVJI | ˾ƷԻ79ren| ˬaëƬ| ŮѾƷëƬ| avþþƷ | ޳AƬ߹ۿ벻| ȫƵѹۿ| ձɫƵ| Ůվ| Դ°߹ۿ| պһҳƷ| ձaaaaaƬƵ| ھƷƵѡ߹ۿ| ޾Ʒ߾ƷƵ| þþƷ޾Ʒ2020| Ļ| ޾ƷһۺϾƷ99| ƷþƵ| 椸Ƶ| 91ֻƬ| һëƬѹۿ| þùӾƷŮ | վѹۿ| 鶹˳Ƶ |