这一篇文章是对 之前?
导航中节省空间的浮动设计?的一个补充
会具体的谈一下技术实现上的问题
首先看图一:
?

在图一中,我们要把才当放入到一个DIV中,则个DIV的宽度和高度是固定的(比如宽度是200px,这个数字在后面会用到),但是需要设置样式:
overflow:auto;
这样就会在内容溢出的时候自动的显示滚动条
?
这个应该比较好理解,我下面说具体实现浮动的内容:
看图二:

大家可以看到,这是鼠标移动到导航上的时候的一个状态:导航的内容从页面流中浮动出来,并且宽度转变成了自适应的状态;
对于宽度自适应的问题,无非就是修改一下样式的问题,我说一下需要注意的问题:
自适应宽度的时候一般会有一个问题:当导航的内容宽度低于200px(上面提到过)的时候,在自适应宽度的时候就会出现一个问题:就是浮动出来后,可使用的导航区域变小了(可以想象一下)
那么对于这个问题有没有解决的办法呢?
我当时的解决方案是:在导航的DIV内,加入了一个空的、固定宽度200px的DIV,用来控制导航DIV的最小宽度,这是一个需要注意的问题
?
下面看一下代码:
?
?
var t = this ;
var treeEl = $("#atvTree");
treeEl.hover(function(){
treeEl.css({"position":"absolute","overflow-y":"",width:null});
if($.browser.msie){
treeEl.attr("scrollTop",t.scroll);
}
treeEl.addClass("shadow");
},function(){
treeEl.css({"position":"static","overflow":"auto",width:"197px"});
if($.browser.msie){
treeEl.attr("scrollTop",t.scroll);
}
treeEl.removeClass("shadow");
});
if($.browser.msie){
treeEl.scroll(function(){
t.scroll = treeEl.scrollTop();
});
}
?
?
?
其实这个就是整个实现浮动和自动记忆滚动条的全部代码,其实是相当的简单,无非就是当鼠标移动到导航上面的时候自适应宽度、position修改为static,加一个样式,当鼠标移动出去的时候,就恢复原样等等..... ,我就不说太多了
这里面有一个值得注意的问题:记忆滚动条位置的时候,一定要只对IE进行特殊处理,因为在MF下,滚动条时自动记忆的,IE是不会记忆的,所以,我加入了treeEl.scroll(..... );用来监控滚动条的位置信息,但是如果去掉了if($.browser.msie) ...这个判断,MF下的记忆功能是自动失败,可能是兼容性的问题
?
上面的代码只是一部分的代码,我下面把整个js文件的代码给贴出来,其中有很多事跟这个功能无关的内容,但是可能会对理解上面代码的环境有所帮助:
?
?
?
(function($){
/**
扩展配置js控制对象
**/
$.ExtConfig = $.ExtConfig || $.create();
$.extend($.ExtConfig.prototype,{
init:function(conf){
this.conf = $.extend({
procInfo:"#procInfo",
atvTree:"#atvTree",
atvEditor:"#atvEditor",
mainProcessDefName:null,
processDefId:null,
activityDefId:null
},conf);
this.procInfo = $(this.conf.procInfo);
this.atvTree = $(this.conf.atvTree);
this.atvEditor = $(this.conf.atvEditor);
var t = this ;
$("#processLst").change(function(){
t.mainProcessDefName = $("#processLst").val();
if(t.mainProcessDefName){
t.showProcess(t.mainProcessDefName);
}
});
this.refresh();
if(this.conf.processDefId && this.conf.activityDefId){
this.showActivityEditor(this.conf.processDefId,this.conf.processDefName,this.conf.activityDefId);
}
this.scroll = 0 ;
var treeEl = $("#atvTree");
treeEl.hover(function(){
treeEl.css({"position":"absolute","overflow-y":"",width:null});
if($.browser.msie){
treeEl.attr("scrollTop",t.scroll);
}
treeEl.addClass("shadow");
},function(){
treeEl.css({"position":"static","overflow":"auto",width:"197px"});
if($.browser.msie){
treeEl.attr("scrollTop",t.scroll);
}
treeEl.removeClass("shadow");
});
if($.browser.msie){
treeEl.scroll(function(){
t.scroll = treeEl.scrollTop();
});
}
function resizeDiv(){
var h = $(window).height() - $("#_line").height() - 6 ;
$("#atvEditor").css({height:h});
treeEl.css({height:h});
}
$(window).resize(function(){
resizeDiv();
});
window.setTimeout(function(){
resizeDiv();
},10);
},
/**
显示流程信息
**/
showProcess:function(mainProcessDefName){
this.showActivityTree(mainProcessDefName);
},
/**
刷新
**/
refresh:function(){
$("#processLst").trigger("change");
},
/**
加载流程信息
**/
loadProcessInfo:function(procDefId,callback){
$.getJSON(window.contextPath + "/oawf/ext_conf/loadProcessInfo.action?processDefId=" + procDefId,function(inf){
callback(inf);
});
},
/**
显示活动树
**/
showActivityTree:function(procDefName){
this.tree = new WebFXLoadTree("活动树",window.contextPath + "/oawf/ext_conf/buildActivityTree.action?mainProcessDefName=" + procDefName);
this.atvTree.html("<div style=\"height:1px;width:200px;\" > </div>" + this.tree.toString());
/*
var t = this ;
window.setTimeout(function(){
t.tree.expandAll();
},1000);
*/
},
/**
显示活动编辑器
**/
showActivityEditor:function(procDefId,procDefName,atvDefId){
var t = this ;
/*
if($("#activityForm").size() > 0 && window.taroko.isFormChanged("#activityForm")){
if(!window.confirm("表单内容已经被修改,确认要抛弃修改内容么?")){
return ;
}
}*/
this.atvEditor.html("<div style=\"padding:10px;\">正在初始化活动编辑器...</div>");
this.atvEditor.load(window.contextPath + "/oawf/ext_conf/showActivityEditor.action?processDefId=" + procDefId
+ "&processDefName=" + procDefName
+ "&activityDefId=" + atvDefId
+ "&mainProcessDefName=" + t.mainProcessDefName
+ "&processType=" + (t.mainProcessDefName == procDefName ? "main" : "") ,function(html){
t.initActivityUi(procDefId,atvDefId);
}
);
},
/**
初始化活动配置界面
**/
initActivityUi:function(procDefId,atvDefId){
this.bindActivityUiEvent(procDefId,atvDefId);
},
/**
活动编辑器绑定事件
**/
bindActivityUiEvent:function(procDefId,atvDefId){
var t = this ;
var ptType = $(":radio[name=ptType]");
var singleParticipant = $(":radio[name=singleParticipant]");
var participantOrigin = $(":radio[name=participantOrigin]");
var rebuild = function(){
var val = $(":radio[name=ptType][checked]").val();
var eType = $(":radio[name=singleParticipant][checked]").val();
var ptOrigin = $(":radio[name=participantOrigin][checked]").val();
t.buildPtLstUi(val,eType,ptOrigin,function(){
if(ptOrigin != "bypre"){
t.loadPts(procDefId,atvDefId,val,function(pts){
t.clearPts();
var len = (eType == 'true' ? 1 : 5) ;
if(pts){
len = len - pts.length ;
if(eType == 'true' ){
t.addPts([pts[0]]);
}else{
t.addPts(pts);
}
}
if(len > 0){
for(var i = 0; i < len ;i ++){
t.addPtLstRow();
}
}
});
}else{
t.loadScopes(procDefId,atvDefId,val,function(scopes){
t.clearScopes();
var len = 5 ;
if(scopes){
len = len - scopes.length ;
t.addScopes(scopes);
}
if(len > 0){
for(var i = 0; i < len ;i ++){
t.addPtLstRow();
}
}
});
if(val == "user"){
t.loadFilter(procDefId,atvDefId,function(val){
t.setFilter(val);
});
}
}
});
} ;
ptType.change(rebuild);
singleParticipant.change(rebuild);
participantOrigin.change(rebuild);
$(":radio[name=ptType][checked]").trigger("change"); // init data
var needCA = $(":radio[name=needCA]");
needCA.change(function(){
var val = $(":radio[name=needCA][checked]").val();
t.buildCALstUi(val,function(){
t.loadCAs(procDefId,atvDefId,function(cas){
t.clearCAs();
var len = 5 ;
if(cas){
len = len - cas.length ;
t.addCAs(cas);
}
if(len > 0 ){
for(var i = 0; i < len ; i ++){
t.addCALstRow();
}
}
});
});
});
$(":radio[name=needCA][checked]").trigger("change"); // init data
this.loadButtons(procDefId,atvDefId,function(buttons){
t.addButtons(buttons);
});
this.showAddButtonWin();
},
/**
加载参与人范围
**/
loadScopes:function(procDefId,atvDefId,ptType,callback){
var t = this ;
$.getJSON(window.contextPath + "/oawf/ext_conf/loadScopes.action",{
processDefId:procDefId,
activityDefId:atvDefId,
participantType:ptType
},function(pts){
callback(pts);
});
},
/**
清除空的角色行
**/
clearEmptyScopeRows:function(){
var els = $("input[name=scopeId]");
var i , len = els.size();
for(i = 0; i < len ; i ++){
var el = $(els.get(i));
if(!el.val()){
el.parent().first().parent().first().remove();
}
}
},
clearScopes:function(){},
addScopes:function(scopes){
this.addPts(scopes);
},
/**
设置过滤器的值
**/
setFilter:function(filter){
$("select[name=filter]").val(filter);
},
/**
加载过滤器
**/
loadFilter:function(procDefId,atvDefId,callback){
$.getJSON(window.contextPath + "/oawf/ext_conf/loadFilter.action",{
processDefId:procDefId,
activityDefId:atvDefId
},function(rs){
if(rs.result)
callback(rs.result);
});
},
/**
显示批量添加角色窗口
**/
showBatchAddRoleWin:function(){
var ori = $(":radio[name=participantOrigin][checked]").val();
var id,name ;
if(ori == "bypre" ){
id = "scopeId";
name = "scopeName";
}else{
id = "participantId" ;
name = "participantName";
}
var prepared = [];
var idEls = $("input[name=" + id + "]");
var nameEls = $("input[name=" + name + "]");
var i , len = idEls.size();
for(i =0; i < len ; i ++){
var _id = $(idEls.get(i)).val() ;
if(_id){
prepared.push({"id":_id,"name":$(nameEls.get(i)).val()});
}
}
var t = this ;
window.selection.showRoleSelectionWin(prepared,function(vals){
if(ori == "bypre" ){
t.clearEmptyScopeRows();
t.addScopes(vals);
}else{
t.clearEmptyPtRows();
t.addPts(vals);
}
},false);
},
/**
显示批量添加操作员窗口
**/
showBatchAddPtWin:function(){
var ori = $(":radio[name=participantOrigin][checked]").val();
var id,name ;
if(ori == "bypre" ){
id = "scopeId";
name = "scopeName";
}else{
id = "participantId" ;
name = "participantName";
}
var prepared = [];
var idEls = $("input[name=" + id + "]");
var nameEls = $("input[name=" + name + "]");
var i , len = idEls.size();
for(i =0; i < len ; i ++){
var _id = $(idEls.get(i)).val() ;
if(_id){
prepared.push({"id":_id,"name":$(nameEls.get(i)).val()});
}
}
var t = this ;
window.selection.showUserSelectionWin(prepared,function(vals){
if(ori == "bypre" ){
t.clearEmptyScopeRows();
t.addScopes(vals);
}else{
t.clearEmptyPtRows();
t.addPts(vals);
}
},false);
},
/**
加载参与人
**/
loadPts:function(procDefId,atvDefId,ptType,callback){
var t = this ;
$.getJSON(window.contextPath + "/oawf/ext_conf/loadParticipants.action",{
processDefId:procDefId,
activityDefId:atvDefId,
participantType:ptType
},function(pts){
callback(pts);
});
},
/**
构建参与人列表界面
ptType:user|role
executionType:single|multiple
ptOrigin:bypre|conf
**/
buildPtLstUi:function(ptType,singleParticipant,ptOrigin,callback){
var t = this ;
if(ptOrigin != "bypre") {
$("#pt_lst").html(function(){
return $("#pt_lst_tpl_" + ptType + "_" + singleParticipant + "_" + ptOrigin).val();;
});
/*
if(singleParticipant == "true"){
t.addPtLstRow();
}else{
for(var i = 0; i < 5 ; i ++){
t.addPtLstRow();
}
}
*/
callback();
}else{
$("#pt_lst").html(function(){
return (ptType == "user" ? $("#filter_tpl").val() : "") + $("#pt_lst_tpl_" + ptType + "_" + singleParticipant + "_" + ptOrigin).val();;
});
callback();
}
},
/**
添加参与人列表行
**/
addPtLstRow:function(id,name){
var ptType = $(":radio[name=ptType][checked]");
var origin = $(":radio[name=participantOrigin][checked]");
var seq = window.taroko.gen() ;
if(id ){
var els = document.getElementsByName("participantId");
if(els){
var i , len = els.length ;
for(i = 0; i < len ; i ++){
var el = els[i];
if(id == $(el).val()){
return ;
}
}
}
}
$("#pt_lst > table").append(function(){
var tpl = $("#pt_lst_row_tpl_" + ptType.val()).val() ;
tpl = window.taroko.formatN(tpl,0,seq);
tpl = window.taroko.formatN(tpl,1,(origin.val() == "bypre") ? "scopeId" : "participantId");
tpl = window.taroko.formatN(tpl,2,(origin.val() == "bypre") ? "scopeName" : "participantName");
return tpl;
});
if(id){
$("#participant_id_" + seq).val(id);
$("#participant_name_" + seq).val(name);
}
},
/**
删除行
**/
removePtLstRow:function(row){
if($("#pt_lst > table > tbody > tr").size() <= 2){
$("input[name=participantId],input[name=participantName],input[name=scopeId],input[name=scopeName]").val("");
return ;
}
$(row).remove();
},
/**
清除空的行
**/
clearEmptyPtRows:function(){
var els = $("input[name=participantId]");
var i , len = els.size();
for(i = 0; i < len ; i ++){
var el = $(els.get(i));
if(!el.val()){
el.parent().first().parent().first().remove();
}
}
},
/**
清除参与人
**/
clearPts:function(){
// TODO
},
/**
添加参与人
**/
addPts:function(pts){
if(pts){
var i , len = pts.length ;
for(i =0; i < len ; i ++){
var pt = pts[i];
if(pt){
var id = pt.id ;
var name = pt.name ;
var n = $(":radio[name=participantOrigin][checked]").val() == "bypre" ? "scopeId" : "participantId";
if($("input[name=" + n + "][value=" + id + "]").size() > 0 ){
continue ;
}
this.addPtLstRow(id,name);
}
}
}
},
/**
构建签发人列表界面
**/
buildCALstUi:function(needCA,callback){
var t = this ;
if(needCA == 'true' ){
$("#ca_lst").html(function(){
return $("#ca_lst_tpl").val();
});
/*
for(var i = 0; i < 5 ; i ++){
t.addCALstRow();
}
*/
callback();
}else{
$("#ca_lst").html("<em>不需要配置签发人!</em>");
}
},
/**
添加签发人列表行
**/
addCALstRow:function(id,name,agentId,agentName){
if(id){
var els = document.getElementsByName("signatoryId");
if(els){
var i , len = els.length ;
for(i = 0; i < len ;i ++){
var el = els[i];
if(id == $(el).val()){
return ;
}
}
}
}
var seq = window.taroko.gen();
$("#ca_lst > table").append(function(){
var tpl = $("#ca_lst_row_tpl").val() ;
return window.taroko.formatN(tpl,0,seq);
});
if(id){
$("#signatory_id_" + seq).val(id);
$("#signatory_name_" + seq).val(name);
$("#agent_id_" +seq).val(agentId);
$("#agent_name_" + seq).val(agentName);
}
},
/**
删除行
**/
removeCALstRow:function(row){
if($("#ca_lst > table > tbody > tr").size() <= 2){
$("input[name=signatoryId],input[name=signatoryName],input[name=agentId],input[name=agentName]").val("");
return ;
}
$(row).remove();
},
/**
加载签发人
**/
loadCAs:function(procDefId,atvDefId,callback){
$.getJSON(window.contextPath + "/oawf/ext_conf/loadSignatories.action",{
processDefId:procDefId,
activityDefId:atvDefId
},function(cas){
callback(cas);
});
},
/**
清除签发人
**/
clearCAs:function(){
// TODO
},
/**
添加签发人
**/
addCAs:function(cas){
if(cas){
var i , len = cas.length ;
for(i = 0; i < len ; i ++){
var ca = cas[i];
if(ca){
this.addCALstRow(ca.id,ca.name,ca.signatoryAgentExt.id,ca.signatoryAgentExt.name);
}
}
}
},
/**
保存活动信息
**/
saveActivityExt:function(){
if(!this.validateForm()){
alert("请正确填写配置信息!");
return ;
}
$("#activityForm").submit();
},
/**
校验表单
**/
validateForm:function(){
// TODO
return true ;
},
/**
显示添加按钮窗口
**/
showAddButtonWin:function(){
var buttonType = $("#_add_button_win > #_button_type");
buttonType.change(function(){
var sel = buttonType.get(0);
var opt = sel.options[sel.selectedIndex];
var text = $(opt).text();
$("#_add_button_win > #_button_name").val(text);
});
buttonType.trigger("change");
$("#_add_button_win").slideDown("fast");
},
/**
关闭添加按钮窗口
**/
closeAddButtonWin:function(){
$("#_add_button_win").slideUp("fast");
},
/**
确认
**/
genAndAddNewButton:function(){
var sel = $("#_add_button_win > #_button_type").get(0);
var opt = sel.options[sel.selectedIndex];
var evt = $(opt).val();
var type = $(opt).attr("type");
var name = $("#_add_button_win > #_button_name").val();
if(!name){
alert("请正确填写按钮标题!");
return null ;
}
var els = document.getElementsByName("button");
if(els){
var exist ;
var i , len = els.length ;
for(i = 0; i < len ; i ++ ){
var el = els[i];
if(name == $(el).val()){
exist = true ;
break ;
}
}
if(exist){
if(!window.confirm("您要添加的按钮已经存在,您确认要继续添加么?")){
return ;
}
}
}
this.addButtonRow(name,type,evt);
},
/**
添加按钮
**/
addButtonRow:function(name,type,event,html){
var tpl = $("#_button_row_tpl").val();
var id = window.taroko.gen();
tpl = window.taroko.formatN(tpl,0,id);
tpl = window.taroko.formatN(tpl,1,name);
tpl = window.taroko.formatN(tpl,2,type);
var html = html ? html :
"<input type=\"button\" class=\"" + (type == "sys" ? "workflow-button" : "green-button") + "\" value=\"" +
name + "\" onclick=\"" + event + "\" />";
tpl = window.taroko.formatN(tpl,3,html);
$("#_button_lst").append(tpl);
this.rebuildButtonPreview();
var t = this ;
$("#_button_" + id).change(function(){
$("#_button_html_" + id).val("<input type=\"button\" class=\"" + (type == "sys" ? "workflow-button" : "green-button") + "\" value=\"" +
$("#_button_" + id).val() + "\" onclick=\"" + event + "\" />");
t.rebuildButtonPreview();
});
},
/**
删除按钮行
**/
removeButtonRow:function(row){
$(row).remove();
this.rebuildButtonPreview();
},
/**
重新构建按钮预览
**/
rebuildButtonPreview:function(){
$("#_button_preview").empty();
this.buildButtonPreview();
},
/**
构建按钮预览
**/
buildButtonPreview:function(){
var preview = $("#_button_preview");
preview.append("<em>预览:</em>");
var els = document.getElementsByName("html");
if(els){
var i , len = els.length ;
for(i = 0; i < len ; i ++){
var el = els[i];
preview.append($(el).val());
}
}
},
/**
加载按钮
**/
loadButtons:function(procDefId,atvDefId,callback){
$.getJSON(window.contextPath + "/oawf/ext_conf/loadButtons.action",{
processDefId:procDefId,
activityDefId:atvDefId
},function(buttons){
callback(buttons);
});
},
/**
添加按钮
**/
addButtons:function(buttons){
if(buttons){
var i , len = buttons.length ;
for(i = 0; i < len ; i ++){
var button = buttons[i];
if(button){
this.addButtonRow(button.name,button.type,null,button.html);
}
}
}
}
});
})($);
?
?
?
完毕
?
?
?
?