您现在的位置是: 首页 > 电脑知识 电脑知识
DOCON_doconlinecn
zmhk 2024-05-29 人已围观
简介DOCON_doconlinecn 我很荣幸能够为大家解答关于DOCON的问题。这个问题集合囊括了DOCON的各个方面,我将从多个角度给出答案,以期能够满足您的需求。1
我很荣幸能够为大家解答关于DOCON的问题。这个问题集合囊括了DOCON的各个方面,我将从多个角度给出答案,以期能够满足您的需求。
1.DOCON
2.解决jsp重复提交
3.关于VB中MSFlexGrid的一个问题
4.钢琴中以下几个记号代表什么含义?
5.android studio怎么查看方法注释
6.三级网页菜单如何制作?
DOCON
Intro:
E/:--0-2-3-2-0-3---2-3-2-0---0-2-3-2-0-3-------0-----------3-2-2-/
B/:--------------------------------------3-3-3---3-3-0-3-3-------/
G/:--------------------------------------------------------------/
D/:--------------------------------------------------------------/
A/:--------------------------------------------------------------/
E/:--------------------------------------------------------------/
E/:-3-5-7-5-3-7--5-3-7--5-3-3--8-8-8-10-8-8-7-7--7-8-7-8-7-5--3-2-2-//
B/:-----------------------------------------------------------------//
G/:-----------------------------------------------------------------//
D/:-----------------------------------------------------------------//
A/:-----------------------------------------------------------------//
E/:-----------------------------------------------------------------//
MIm DO
Yo te miro, se me corta la respiración
SOL RE
Cuando tu me miras se me sube el corazón (Me palpita lento el corazón)
MIm DO
Y en silencio tu mirada dice mil palabras
SOL RE
La noche en la que te suplico que no salga el sol
LAm
Bailando(bailando), bailando (bailando)
DO
Tu cuerpo y el mío llenando el vacío
RE
Subiendo y bajando (subiendo y bajando)
LAm
Bailando (bailando), bailando (bailando)
DO
Ese fuego por dentro me va enloqueciendo
RE
Me va saturando
MIm
Con tu física y tu química también tu anatomía
DO
La cerveza y el tequila y tu boca con la mía
SOL
Ya no puedo más (ya no puedo más)
RE
Ya no puedo más (ya no puedo más)
MIm
Con esta melodía, tu color, tu fantasía
DO
Con tu filosofía mi cabeza está vacía
SOL
Y ya no puedo más (ya no puedo más)
RE
Ya no puedo más (ya no puedo más)
MIm
Yo quiero estar contigo, vivir contigo
DO
Bailar contigo, tener contigo
SOL
Una noche loca (una noche loca)
RE
Ay besar tu boca (y besar tu boca)
MIm
Yo quiero estar contigo, vivir contigo
DO
Bailar contigo, tener contigo
SOL
Una noche loca
RE
Con tremenda loca
MIm DO SOL RE
Ooooh, ooooh, ooooh, ooooh
MIm DO
Tu me miras y me llevas a otra dimensión (Estoy en otra dimensión)
SOL RE
Tu latidos aceleran a mi corazón(Tu latidos aceleran a mi corazón)
MIm DO
Que ironía del destino no poder tocarte
SOL RE
Abrazarte y sentir la magia de tu olor
LAm
Bailando(bailando), bailando (bailando)
DO
Tu cuerpo y el mío llenando el vacío
RE
Subiendo y bajando (subiendo y bajando)
LAm
Bailando (bailando), bailando (bailando)
DO
Ese fuego por dentro me va enloqueciendo
RE
Me va saturando
MIm
Con tu física y tu química también tu anatomía
DO
La cerveza y el tequila y tu boca con la mía
SOL
Ya no puedo más (ya no puedo más)
RE
Ya no puedo más (ya no puedo más)
MIm
Con esta melodía, tu color, tu fantasía
DO
Con tu filosofía mi cabeza está vacía
SOL
Y ya no puedo más (ya no puedo más)
RE
Ya no puedo más (ya no puedo más)
MIm
Yo quiero estar contigo, vivir contigo
DO
Bailar contigo, tener contigo
SOL
Una noche loca (una noche loca)
RE
Ay besar tu boca (y besar tu boca)
MIm
Yo quiero estar contigo, vivir contigo
DO
Bailar contigo, tener contigo
SOL
Una noche loca
RE
Con tremenda loca
MIm DO SOL RE
Ooooh, ooooh, ooooh, ooooh
MIm DO SOL RE
Ooooh, ooooh, ooooh, ooooh
MIm DO
Ooooh (bailando amor) ooooh (bailando amor)
SOL RE MIm
Ooooh (es que se me va el dolor).
解决jsp重复提交
看了网上的,有几种方法:
1 在你的表单页里HEAD区加入这段代码:
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
<META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">
2
生成一个令牌保存在用户session中,在form中加一个hidden域,显示该令
牌的值,form提交后重新生成一个新的令牌,将用户提交的令牌和session
中的令牌比较,如相同则是重复提交
3
在你的服务器端控件的代码中使用Response.Redirect("selfPage")语句。但是大多的数都不使用这种方法。
方法还有很多。。。
4
<input type="button" value="提交" onclick="this.disabled=true;this.form.submit()">
5
在JSP页面的FORM表单中添加一个hidden域
<input type="hidden" name="url"value=<%=request.getRequestURL()%>>
在你的serverlet中添加如下语句
String url=request.getParameter("url");
response.sendRedirect(url);
我一般都是采用这样的方法返回JSP页面的,不太明白你说的重复刷新是什么概念
6 ajax 无刷新提交
7 Web开发中防止浏览器的刷新键引起系统操作重复提交
怎么解决呢?重定向可以解决页面刷新带来的数据的重复提交的问题,我们自然可以利用重定向的方式来解决这个问题。但是struts的action里面mapping.findword();跳转的话,默认的是在工程文件夹里面找要跳转的页面。这种情况,怎么解决呢?
修改struts-config.xml 文件, 在action里面有一个redirect重新定向的属性,struts中默认的是false,添加这个属性,改成true,在forword中写上要跳转页面的绝对或者相对地址就行了
修改如下:
<action-mappings>
<action attribute="newsActionForm" name="newsActionForm"
input="/addnews.jsp" path="/newsAction" parameter="method"
scope="request" type="com.yongtree.news.action.NewsAction">
<forward name="list" path="/listnews.jsp" redirect="true"></forward>
<forward name="error" path="/addnews.jsp"></forward>
</action>
</action-mappings>
重复提交、重复刷新、防止后退的问题以及处理方式
一。前言
你在任何一个比较专业的BBS都会看到这样的问题,即使你Google一下,也会发现有很多的人在关注和询问,但大家给出的解决方法却都是千差万别,(有的人主张采用脚本来解决;有的则想重定向到别的页面;有的则将此问题提升到Token的角度)为什么会有如此大的差异呢?
二。问题场景
首先,我们应该先了解为什么要处理这样的问题?或者专业一点就是它适合的场景是什么?(似乎只有人来问没有人来解释)
1。重复提交、重复刷新的场景
重复提交、重复刷新都是来解决系统重复记录的问题。也就是说某个人在多次的提交某条记录(为什么?也许是闲了没有事情干的;最有可能是用户根本就不知道自己的提交结果是否已经执行了?!)。
但出现了这样的问题并不见得就必须处理,要看你所开发的系统的类别而定。比如你接手的是某个资源管理系统,系统本身从需求的角度根本就不允许出现"重复"的记录,在这样需求的约束条件下,去执行重复的提交动作只会引发“业务级异常”的产生,根本就不可能执行成功也就无所谓避免不避免的问题了。
2。防止后退的场景
了解了重复刷新、重复提交的场景,我们来了解一下"防止后退"操作的原因是什么?比如你在开发某个投票系统,它有很多的步骤,并且这些步骤之间是有联系的,比如第一步会将某些信息发送给第二步,第二步缓存了这些信息,同时将自身的信息发送给了第三步。。。。。等等,如果此时用户处在第三步骤下,我们想象一下某个淘气用户的用户点击了后退按钮,此时屏幕出现了第二步骤的页面,他再次的修改或者再次的提交,进入到下一个步骤(也就是第三步骤),错误就会在此产生?!什么错误呢?最为典型的就是这样的操作直接导致了对于第一个步骤信息的丢失!(如果这样的信息是依靠Request存放的话,当然你可以存放在Session或者更大的上下文环境中,但这不是个好主意!关于信息存放的问题,下次在就这个问题详细的讨论)
三。如何处理的问题
当然很多的系统(比如订票系统从需求上本身是允许个人重复订票的)是必须要避免重复刷新、重复提交、以及防止后退的问题的,但即使是这样的问题,也要区分如何处理以及在哪里处理的(网上只是告诉你如何处理,但很少去区分在哪里处理的),显然处理的方式无非是客户端或者服务器端两种,而面对不同的位置处理的方式也是不同的,但有一点要事先声明:任何客户端(尤其是B/S端)的处理都是不可信任的,最好的也是最应该的是服务器端的处理方法。
客户端处理:
面对客户端我们可以使用Javascript脚本来解决,如下
1。重复刷新、重复提交
Ways One:设置一个变量,只允许提交一次。
<script language="javascript">
var checkSubmitFlg = false;
function checkSubmit() {
if (checkSubmitFlg == true) {
return false;
}
checkSubmitFlg = true;
return true;
}
document.ondblclick = function docondblclick() {
window.event.returnValue = false;
}
document.onclick = function doconclick() {
if (checkSubmitFlg) {
window.event.returnValue = false;
}
}
</script>
<html:form action="myAction.do" method="post" onsubmit="return checkSubmit();">
Way Two : 将提交按钮或者image置为disable
<html:form action="myAction.do" method="post"
onsubmit="getElById('submitInput').disabled = true; return true;">
<html:image styleId="submitInput" src="images/ok_b.gif" border="0" />
</html:form>
2。防止用户后退
这里的方法是千姿百态,有的是更改浏览器的历史纪录的,比如使用window.history.forward()方法;有的是“用新页面的URL替换当前的历史纪录,这样浏览历史记录中就只有一个页面,后退按钮永远不会变为可用。”比如使用javascript:location.replace(this.href); event.returnValue=false;
2.服务器端的处理(这里只说Struts框架的处理)
利用同步令牌(Token)机制来解决Web应用中重复提交的问题,Struts也给出了一个参考实现。
基本原理:
服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,
看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给
客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次
提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。
if (isTokenValid(request, true)) {
// your code here
return mapping.findForward("success");
} else {
saveToken(request);
return mapping.findForward("submitagain");
}
Struts根据用户会话ID和当前系统时间来生成一个唯一(对于每个会话)令牌的,具体实现可以参考
TokenProcessor类中的generateToken()方法。
1. //验证事务控制令牌,<html:form >会自动根据session中标识生成一个隐含input代表令牌,防止两次提交
2. 在action中:
//<input type="hidden" name="org.apache.struts.taglib.html.TOKEN"
// value="6aa35341f25184fd996c4c918255c3ae">
if (!isTokenValid(request))
errors.add(ActionErrors.GLOBAL_ERROR,
new ActionError("error.transaction.token"));
resetToken(request); //删除session中的令牌
3. action有这样的一个方法生成令牌
protected String generateToken(HttpServletRequest request) {
HttpSession session = request.getSession();
try {
byte id[] = session.getId().getBytes();
byte now[] =
new Long(System.currentTimeMillis()).toString().getBytes();
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(id);
md.update(now);
return (toHex(md.digest()));
} catch (IllegalStateException e) {
return (null);
} catch (NoSuchAlgorithmException e) {
return (null);
}
}
总结
对于重复提交、重复刷新、防止后退等等都是属于系统为避免重复记录而需要解决的问题,在客户端去处理需要针对每一种的可能提出相应的解决方案,然而在服务器端看来只不过是对于数据真实性的检验问题,基于令牌的处理就是一劳永逸的方法。
同时我们也看到,从不同的角度去看待问题,其解决的方法也是不同的。客户端更追求的是用户的操作,而服务端则将注意力放在了数据的处理上,所以在某个对于服务器端看似容易的问题上,用客户端来解决却麻烦了很多!反之依然。所以在某些问题的处理上我们需要综合考虑和平衡,是用客户端来解决?还是用服务器端来处理?
关于VB中MSFlexGrid的一个问题
有几种方法 在你的表单页里HEAD区加入这段代码: <META HTTP EQUIV="pragma" CONTENT="no cache"> <META HTTP EQUIV="Cache Control" CONTENT="no cache must revalidate"> <META HTTP EQUIV="expires" CONTENT="Wed Feb : : GMT"> 生成一个令牌保存在用户session中 在form中加一个hidden域 显示该令 牌的值 form提交后重新生成一个新的令牌 将用户提交的令牌和session 中的令牌比较 如相同则是重复提交 在你的服务器端控件的代码中使用Response Redirect("selfPage")语句 但是大多的数都不使用这种方法 方法还有很多 <input type=button value="提交" onclick="this disabled form submit()">
在JSP页面的FORM表单中添加一个hidden域 <input type=hidden name=urlvalue=<%=request getRequestURL()%>> 在你的serverlet中添加如下语句 String url=request getParameter("url"); response sendRedirect(url); 我一般都是采用这样的方法返回JSP页面的 不太明白你说的重复刷新是什么概念
ajax 无刷新提交
Web开发中防止浏览器的刷新键引起系统操作重复提交 怎么解决呢?重定向可以解决页面刷新带来的数据的重复提交的问题 我们自然可以利用重定向的方式来解决这个问题 但是struts的action里面mapping findword() 跳转的话 默认的是在工程文件夹里面找要跳转的页面 这种情况 怎么解决呢? 修改struts-config xml 文件 在action里面有一个redirect重新定向的属性 struts中默认的是false 添加这个属性 改成true 在forword中写上要跳转页面的绝对或者相对地址就行了 修改如下 <action mappings> <action attribute="newsActionForm" name=newsActionForm input="/addnews jsp" path="/newsAction" parameter="method" scope="request" type= yongtree news action NewsAction> <forward name=list path="/listnews jsp" redirect="true"></forward> <forward name=error path="/addnews jsp"></forward> </action> </action mappings> 重复提交 重复刷新 防止后退的问题以及处理方式
一 前言 你在任何一个比较专业的BBS都会看到这样的问题 即使你Google一下 也会发现有很多的人在关注和询问 但大家给出的解决方法却都是千差万别 (有的人主张采用脚本来解决;有的则想重定向到别的页面;有的则将此问题提升到Token的角度)为什么会有如此大的差异呢?
二 问题场景 首先 我们应该先了解为什么要处理这样的问题?或者专业一点就是它适合的场景是什么?(似乎只有人来问没有人来解释)
重复提交 重复刷新的场景 重复提交 重复刷新都是来解决系统重复记录的问题 也就是说某个人在多次的提交某条记录(为什么?也许是闲了没有事情干的;最有可能是用户根本就不知道自己的提交结果是否已经执行了?!)
但出现了这样的问题并不见得就必须处理 要看你所开发的系统的类别而定 比如你接手的是某个资源管理系统 系统本身从需求的角度根本就不允许出现"重复"的记录 在这样需求的约束条件下 去执行重复的提交动作只会引发“业务级异常”的产生 根本就不可能执行成功也就无所谓避免不避免的问题了
防止后退的场景 了解了重复刷新 重复提交的场景 我们来了解一下"防止后退"操作的原因是什么?比如你在开发某个投票系统 它有很多的步骤 并且这些步骤之间是有联系的 比如第一步会将某些信息发送给第二步 第二步缓存了这些信息 同时将自身的信息发送给了第三步 等等 如果此时用户处在第三步骤下 我们想象一下某个淘气用户的用户点击了后退按钮 此时屏幕出现了第二步骤的页面 他再次的修改或者再次的提交 进入到下一个步骤(也就是第三步骤) 错误就会在此产生?!什么错误呢?最为典型的就是这样的操作直接导致了对于第一个步骤信息的丢失!(如果这样的信息是依靠Request存放的话 当然你可以存放在Session或者更大的上下文环境中 但这不是个好主意!关于信息存放的问题 下次在就这个问题详细的讨论)
三 如何处理的问题 当然很多的系统(比如订票系统从需求上本身是允许个人重复订票的)是必须要避免重复刷新 重复提交 以及防止后退的问题的 但即使是这样的问题 也要区分如何处理以及在哪里处理的(网上只是告诉你如何处理 但很少去区分在哪里处理的) 显然处理的方式无非是客户端或者服务器端两种 而面对不同的位置处理的方式也是不同的 但有一点要事先声明 任何客户端(尤其是B/S端)的处理都是不可信任的 最好的也是最应该的是服务器端的处理方法
客户端处理 面对客户端我们可以使用Javascript脚本来解决 如下
重复刷新 重复提交 Ways One 设置一个变量 只允许提交一次 <script language="javascript"> var checkSubmitFlg = false; function checkSubmit() { if (checkSubmitFlg == true) { return false; } checkSubmitFlg = true; return true; } document ondblclick = function docondblclick() { window event returnValue = false; } document onclick = function doconclick() { if (checkSubmitFlg) { window event returnValue = false; } } </script> <:form action="myAction do" method="post" onsubmit="return checkSubmit();">
Way Two : 将提交按钮或者image置为disable <:form action="myAction do" method="post" onsubmit="getElById( submitInput ) disabled = true; return true;"> <:image styleId="submitInput" src=images/ok_b gif border= /> </:form>
防止用户后退 这里的方法是千姿百态 有的是更改浏览器的历史纪录的 比如使用window history forward()方法;有的是“用新页面的URL替换当前的历史纪录 这样浏览历史记录中就只有一个页面 后退按钮永远不会变为可用 ”比如使用javascript:location replace(this href); event returnValue=false;
服务器端的处理(这里只说Struts框架的处理) 利用同步令牌(Token)机制来解决Web应用中重复提交的问题 Struts也给出了一个参考实现
基本原理 服务器端在处理到达的请求之前 会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较 看是否匹配 在处理完该请求后 且在答复发送给客户端之前 将会产生一个新的令牌 该令牌除传给 客户端以外 也会将用户会话中保存的旧的令牌进行替换 这样如果用户回退到刚才的提交页面并再次 提交的话 客户端传过来的令牌就和服务器端的令牌不一致 从而有效地防止了重复提交的发生
if (isTokenValid(request true)) { // your code here return mapping findForward("success"); } else { saveToken(request); return mapping findForward("submitagain"); }
Struts根据用户会话ID和当前系统时间来生成一个唯一(对于每个会话)令牌的 具体实现可以参考 TokenProcessor类中的generateToken()方法
//验证事务控制令牌 <:form >会自动根据session中标识生成一个隐含input代表令牌 防止两次提交 在action中
//<input type=hidden name= apache struts taglib TOKEN // value=" aa f fd c c c ae"> if (!isTokenValid(request)) errors add(ActionErrors GLOBAL_ERROR new ActionError("error transaction token")); resetToken(request); //删除session中的令牌
action有这样的一个方法生成令牌 protected String generateToken(HttpServletRequest request) { HttpSession session = request getSession(); try { byte id[] = session getId() getBytes(); byte now[] = new Long(System currentTimeMillis()) toString() getBytes(); MessageDigest md = MessageDigest getInstance("MD "); md update(id); md update(now); return (toHex(md digest())); } catch (IllegalStateException e) { return (null); } catch (NoSuchAlgorithmException e) { return (null); } }
lishixinzhi/Article/program/Java/JSP/201311/19842钢琴中以下几个记号代表什么含义?
你的方式导入很慢,用MSHFlexGrid控件,如下供参考
ADOCon.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=" & App.Path & "\111.XLS;Extended Properties='Excel 8.0;HDR=YES'"
ADOCon.Open
ADORst.Open "select * from [sheet1$] ", ADOCon, adOpenKeyset, adLockOptimistic
Set MSHFlexGridRecordset = ADORst
ADOCon.Close
android studio怎么查看方法注释
1.半音,讲通俗点,就是两个音之间没有其他的音。全音就是两个音中间有一个音。比如说1和2之间,因为存在一个#1的音,所以是1和2之间是全音,而1和#1,2和#1之间就是半音。特别要说明,3和4,7和1之间没有黑键,也就是半音关系了,但3和#4之间有个4,所以3和#4之间就是全音。
2.moderato
中板,中等速度
legato
广板
宽广的
andante
行板
步行着得
ritard
(忘了-
-!)
tempo
回到原速
3.forte
记号:
f的是它的缩写,力度强
mezzo
forte
记号:
一半强,中强
piano
记号:
微弱的,小声的,(在交响乐谱里有时是这里加入钢琴的意思)
mezzo
piano
记号:
一般弱,中弱
pianissimo
记号:
十分微弱的
fortissimo
记号:
十分强的
4.临时记号是一个调里,原本没变变化的音,由于某种需要而升或降。比如说g大调原来是要升4,但是这个小节或乐句需要一个升1,那就要写临时升降号,在那个小节那里的1上写个#。这种临时升降号,主要是要瞒住调性的需要,像我这个例子,这样g大调就有可能是要转入d大调,或者是离调(一段时间离开原来调式,但是后来要回到原调)
5。民间曲调是各个民族不同的调式观念,比如欧洲的民间调是中古调式发展而来到现在的大小调体系,而中国的五升调式就和他们不一样,没有4和7.你做个实验,在钢琴上随便按,只要不出现4和7,听起来的旋律就像是中国风。ps:周杰伦就是这么干的。。。每个地方有每个地方旋律的固定曲调,这里没办法一一列举。
回答完毕,跟考试一样,呵呵,希望对你有帮助
三级网页菜单如何制作?
使用快捷键查看方法注释
1
个人的Android
Studio的快捷键的映射表可能有所不同,所以先查看一下快捷键。
2
打开settings对话框,执行“File”-“Settings”,如图
3
在settings对话框的搜索框中,输入“quick
doc”进行搜索并按Enter键,如图:
在图中可以看到查询方法注释有好几个快捷键,以F2快捷键为例。
4
定位到需要查看的函数的位置,如图:
5
按F2快捷键,就可以看到方法注释了,如图:
设置用鼠标悬停时显示函数注释
打开settings对话框,执行“File”-“Settings”,如图
在左侧选择“Editor”-“General”,在右侧找到“Show
quick
doc
on
mouse
move",并设置上,然后点击”OK“按钮,如图:
在鼠标移到需要显示方法文档的地方停顿一下,就可以看到方法文档了,如图:
通过菜单显示方法/类的注释
把光标定位到想要查看注释的函数,如图:
点击菜单“View”-“Quick
Documentation",如图:
这样就可以看到方法/类的注释了
二级菜单三级菜单原理都一样,主要是捕捉鼠标事件,客户端响应并作出相应动作。
以下是参考例子:(注:是粘贴过来的。)
<HTML><HEAD>
<TITLE>Document Title</TITLE>
<style>
.menuBorder1 {
position:absolute;
left:-1000; top:-1000;
background-color:#C6C3C6; /* light gray */
border: solid 1px;
border-left-color:#C6C3C6; /* light gray */
border-top-color:#C6C3C6; /* light gray */
border-bottom-color:black;
border-right-color:black;
margin:0 0 0 0;
overflow:none;
visibility:visible;
}
.menuBorder2{
position:absolute; top:0; left:0;
background-color:#C6C3C6; /* light gray */
overflow:none;
margin: 4px 0px 4px 0px;
border: solid 1px;
border-left-color:white;
border-top-color:white;
border-bottom-color:#848284; /* dark grey */
border-right-color:#848284; /* dark grey */
cursor:default;
}
.menuTable {}
.menuRow {
font-size: 9pt;
color:black;
background-color:transparent;
cursor:default;
height:12pt;
}
.menuImageCell {
text-align:left;
cursor:default;
}
.menuCaptionCell {
text-align:left;
cursor:default;
}
.menuArrowCell {
text-align:right;
font-size: 8pt;
cursor:default;
}
#MENUINSERT {
position:absolute;
top:0; left:0;
}
</style>
<script>
var menus = new Array()
function MenuRegister(item)
{
menus[menus.length] = item
return (menus.length - 1)
}
function MenuItem(caption, command, image, submenu, separator) //创建自己的菜单目录的对象
{
this.caption = caption;
this.command = command;
this.image = image;
this.submenu = submenu;
this.separator = (separator) ? true : false;
this.id = MenuRegister(this);
}
function MenuItemOnClick(obj) //响应鼠标oncklick事件
{
var item = menus[obj.menuid]
var menub1 = document.all['MENU' + item.parent + 'B1']
window.event.cancelBubble = true
if (item == null) return
if ((typeof item.command) == 'function') item.command()
if ((typeof item.command) == 'string') window.location = item.command
}
function MenuItemOnMouseOver(obj) //鼠标在菜单上移动时的事件处理
{
var item = menus[obj.menuid]
var parent = menus[item.parent]
var menub1 = document.all['MENU' + item.parent + 'B1']
var fromElement = window.event.fromElement
var toElement = window.event.toElement
window.event.cancelBubble = true
//鼠标在菜单边缘,则什么也不做
if ((fromElement != null) && (toElement != null))
{
if (fromElement.menuid == toElement.menuid) return;
}
obj.style.backgroundColor = '#000084' // 改变背景颜色为蓝色
obj.style.color = 'white' // 改变文字颜色为白色
//处理子菜单状态
//关闭当前打开的子菜单
if ((parent.submenu != null) && (parent.submenu != item.submenu))
{
parent.submenu.hide()
parent.submenu = null
}
// 打开当前菜单目录的子菜单
if ((item.submenu != null) && (parent.submenu != item.submenu))
{
item.submenu.top = menub1.offsetTop + obj.offsetTop;
item.submenu.left = menub1.offsetLeft + obj.offsetWidth;
item.submenu.show()
parent.submenu = item.submenu
return;
}
}
function MenuItemOnMouseOut(obj) //鼠标移出菜单的事件处理
{
var item = menus[obj.menuid]
var parent = menus[item.parent]
var toElement = window.event.toElement
window.event.cancelBubble = true
if ((toElement != null) && (toElement.menuid == parent.id)) {
if ((parent.submenu != null) && (parent.submenu != item))
{
parent.submenu.hide()
parent.submenu = null
}
}
if ((window.event.fromElement != null) && (window.event.toElement != null))
{
if (window.event.fromElement.menuid == window.event.toElement.menuid) return;
}
obj.style.backgroundColor = "transparent"
obj.style.color = 'black'
}
function MenuItemToString()
{
if (this.separator)
return "<tr><td class=menuSep colspan=3><hr></td></tr>\n"
return " <tr class=menuRow \n" +
" onMouseOver='MenuItemOnMouseOver(this)'\n" +
" onMouseOut='MenuItemOnMouseOut(this)'\n" +
" onClick='MenuItemOnClick(this)'\n" +
" menuid=" + this.id +
" >\n" +
" <td class=menuImageCell noWrap=noWrap menuid=" + this.id + ">" +
((this.image != null) ? " <img class=menuImage menuid=" + this.id + " src='" + this.image + "'> " : " " ) + "</td>\n" +
" <td class=menuCaptionCell noWrap=noWrap menuid=" + this.id + ">" + this.caption + "</td>\n" +
" <td class=menuArrowCell noWrap=noWrap menuid=" + this.id + " " +
((this.submenu != null) ? "style='font-family:Webdings'>4" : "style='font-family:times'> ") + "</td>\n" +
" </tr>\n";
}
MenuItem.prototype.toString = MenuItemToString;
function Menu(top, left) //将鼠标的位置作为菜单的左顶点创建菜单
{
this.items = new Array()
this.top = top
this.left = left
this.id = MenuRegister(this)
this.update = true;
MENUINSERT.insertAdjacentHTML('BeforeEnd', this.borders())
}
function MenuAddItem(item) //添加子菜单,子菜单继承其父菜单的的属性
{
this.items[this.items.length] = item
item.parent = this.id
}
function MenuShow(noDisplay) //实现菜单的显示
{
var menub1 = document.all['MENU' + this.id + 'B1']
var menub2 = document.all['MENU' + this.id + 'B2']
if (this.update)
{
menub2.innerHTML = this.getTable()
this.update = false
}
var menu = document.all['MENU' + this.id]
menub1.style.top = this.top
menub1.style.left = this.left
menub2.style.width = menu.offsetWidth + 2
menub2.style.height = menu.offsetHeight + 2
menub1.style.width = menu.offsetWidth + 4
menub1.style.height = menu.offsetHeight + 12
//处理在窗口边缘单击鼠标时,菜单显示的位置
// 菜单超出窗口底边时,上移
if ((menub1.offsetTop + menub1.offsetHeight) > (MenuBodyRef.offsetHeight - 4))
menub1.style.top = MenuBodyRef.offsetHeight - menub1.offsetHeight - 4
// 菜单超出窗口右边时,左移
if ((menub1.offsetLeft + menub1.offsetWidth) > (MenuBodyRef.offsetWidth - 24))
menub1.style.left = MenuBodyRef.offsetWidth - menub1.offsetWidth - 24
// 菜单超出窗口顶边时,下移
if (menub1.offsetTop < 0)
menub1.style.top = 0
// 菜单超出窗口左边时,右移
if (menub1.offsetLeft < 0)
menub1.style.left = 0
if (noDisplay)
{
menub1.style.top = -1000
menub1.style.left = -1000
} else {
menub1.style.visibility = 'visible'
}
}
function MenuHide() //实现菜单的隐藏
{
var menub1 = document.all['MENU' + this.id + 'B1']
if (this.submenu != null) this.submenu.hide()
menub1.style.visibility = 'hidden'
menub1.style.top = -1000
menub1.style.left = -1000
}
function MenuBorders() //响应鼠标的onclick事件
{
return "<div id=MENU" + this.id +"B1 class=menuBorder1 menuid=" + this.id + " onClick='window.event.cancelBubble = true'>\n" +
" <div id=MENU" + this.id +"B2 class=menuBorder2 menuid=" + this.id + ">\n" +
" </div>\n" +
"</div>\n";
}
function MenuTable() //创建用于装菜单内容的表格,便于菜单界面的排版
{
var str
str = "<table id=MENU" + this.id + "\n" +
" cellpadding=0 cellspacing=0 border=0 class=menuTable>\n"
for (var i=0; i < this.items.length; i++)
str += this.items[i];
str += "</table>\n"
return str
}
Menu.prototype.addItem = MenuAddItem;
Menu.prototype.borders = MenuBorders;
Menu.prototype.getTable = MenuTable;
Menu.prototype.show = MenuShow;
Menu.prototype.hide = MenuHide;
var MenuBodyRef;
function MenuInit() //创建菜单所在的层,达到显示和隐藏的效果
{
for(var i in document.all){
if (document.all[i].tagName == 'BODY')
{
MenuBodyRef = document.all[i]
MenuBodyRef.insertAdjacentHTML('AfterBegin', '<div id=MENUINSERT></div>')
break
}
}
}
var mainMenu = null;
function DocOnLoad() //在此添加菜单内容.
{
var submenu
MenuInit();
mainMenu = new Menu(100, 20);
submenu = new Menu(0,0)
submenu.addItem(new MenuItem('流行歌曲', '#'))
submenu.addItem(new MenuItem('民族风采', '#'))
submenu.addItem(new MenuItem('乐曲欣赏', '#'))
submenu.addItem(new MenuItem('交响乐', '#'))
submenu.show(true)
mainMenu.addItem(new MenuItem('音乐空间', null, null, submenu, null))
submenu = new Menu(0,0)
submenu.addItem(new MenuItem('杂家杂文', '#'))
submenu.addItem(new MenuItem('宏篇巨著', '#'))
submenu.addItem(new MenuItem('诗词歌赋', '#'))
submenu.show(true)
mainMenu.addItem(new MenuItem('文学殿堂', null, null, submenu, null))
mainMenu.addItem(new MenuItem('软件下载', '#'))
mainMenu.addItem(new MenuItem('在线游戏', '#'))
submenu = new Menu(0,0)
submenu.addItem(new MenuItem('网上定购', '#'))
submenu.addItem(new MenuItem('家居房产', '#'))
submenu.addItem(new MenuItem('股票交易', '#'))
submenu.show(true)
mainMenu.addItem(new MenuItem('社区服务', '#', null, submenu))
mainMenu.addItem(new MenuItem('聊天室', '#'))
mainMenu.addItem(new MenuItem('收藏', 'h#'))
mainMenu.addItem(new MenuItem(null, null, null, null, true))
mainMenu.addItem(new MenuItem('收索', '#', 'find.gif'))
mainMenu.addItem(new MenuItem('离开', new Function('DocOnClick()'), 'x.gif'))
mainMenu.show(true)
}
var flag = false
function DocOnClick() //菜单隐藏和显现
{
if (flag) {
mainMenu.hide()
} else {
mainMenu.left = window.event.x
mainMenu.top = window.event.y
mainMenu.show()
}
flag = ! flag
}
</script>
<BODY onLoad="DocOnLoad()" onClick="DocOnClick()">
<font size=15 color=#ce288c face=方正魏碑繁体 >
单击鼠标左键,会弹出一个菜单。功能也比较齐全。如当前选项的突显,子菜单的添加等等。
有一个问题是每次单击鼠标左键,都会有菜单弹出。解决的办法是,限定鼠标在某一范围内
单击才弹出菜单。这要根据具体的页面来具体设定。
</font>
</body>
</html>
今天的讨论已经涵盖了“DOCON”的各个方面。我希望您能够从中获得所需的信息,并利用这些知识在将来的学习和生活中取得更好的成果。如果您有任何问题或需要进一步的讨论,请随时告诉我。