用Ajax方式查询获取一组数据,用于页面显示,会有效改善用户体验。Ajax动态查询需要注意以下几点。
一、客户端需要实现Ajax请求,标准的JavaScript Ajax代码很长,用户可以用jQuery等实现。
这里使用pvo.query(action,function(){},isText)方法
如何实现标准的JavaScript Ajax代码,在附件1的这个方法中有详细的说明,非常方便,查询结果保存在pvo.RESULT变量中。
范例queryEx01
/**
*在<span id="selectSPAN"></span>节点中对动态添加的分类动态添加<select/>代码:
*/
function queryEx01(){
var action=pvo.ROOTPATH+"/ajax/ps?method=queryLabel";
pvo.query(action,function(){
//var v=pvo.RESULT;//获取查询结果
//var v=pvo.getResult();//获取查询结果
var v=pvo.getSomeRecord(pvo.getResult(), "groupid", "栏目分类");//获取查询结果子集
var s="";
for(var i=0;i<v.length;i++){
s=s+"<option value='"+v[i].get("label")+"'>"+v[i].get("label")+"</option>";
};
document.getElementById("selectSPAN").innerHTML="<select name='columnsid' style='width:80px;'>"+s+"</select>";
});
}
2、服务器端的实现
关键要实现标准xml格式字符串,对超文本字符如“<”、“>”“要进行转换。
为了便于实现,请在http://download.csdn.net/detail/wj800/3808299下载最新的HashMap关系数据映射技术源代码和jar文件(pvo_1.3资源包)
/**
关键是传回
<rocords>
<record><field1>value1</field1><field2>value2</field2>...<fieldn>valuen</fieldn><record>
<record><field1>value1</field1><field2>value2</field2>...<fieldn>valuen</fieldn><record>
......
</records>
标准xml格式的字符串
*/
private void query(HttpServletRequest request, HttpServletResponse response) {
response.setContentType("text/xml;charset=UTF-8");
String returnValue = "";
PrintWriter out = null;
try {
out = response.getWriter();
String xml = "";
ProcessVO pvo = new ProcessVO(Db.instance().getCon());
try {
List v = pvo.getSomeRecord("select * from label", 1, 5000, true);//查询5000条以内的数据
if (v.size() > 0) {
for (int i = 0; i < v.size(); i++) {
Map map = (Map) v.get(i);
xml = xml + "<record>" + mapToXml(map) + "</record>";
}
}
xml = "<records>" + xml + "</records>";
returnValue = xml;
} finally {
pvo.closeCon();
}
} catch (SQLException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
} finally {
out.write(returnValue);
out.close();
}
}
/**
*将Map对象格式化为标准的xml格式字符串
*/
public String mapToXml(Map m) {
String xml = "";
if (m != null && m.size() > 0) {
Set set = m.keySet();
Object[] obj = set.toArray();
for (int i = 0; i
< obj.length; i++) {
xml = xml + "<" + obj[i] + ">" + filterChar(m.get(obj[i])) + "</" + obj[i] + ">";
}
}
return xml;
}
/**
* 在String中,使用s.replace("<","<");使用s.replace(">",">");不能达到预期效果
* 替换字符'<'和'>',实现对超文本的支持
**/
public String filterChar(Object obj) {
String str = "";
if (obj == null) {
return str;
}
str = obj.toString();
StringBuilder sb = new StringBuilder();
for (int i = 0; i
< str.length(); i++) {
if (str.charAt(i) != '<' && str.charAt(i) != '>' && str.charAt(i) != '"' && str.charAt(i) != '&') {// && str.charAt(i) != '\''
sb.append(str.charAt(i));
} else {
if (str.charAt(i) == '<') {
sb.append("<");
}
if (str.charAt(i) == '>') {
sb.append(">");
}
if (str.charAt(i) == '"') {
sb.append(""");
} //if (str.charAt(i) == '\'') {
// sb.append("’");//´
//}
if (str.charAt(i) == '&') {
sb.append("&");
}
}
}
return sb.toString();
}
三、效果
附件使用说明:
0、附件1中主要包含了一些常用的方法,如对表单的提取、Ajax表单(包括超文本)上传、Ajax查询、对数组分页、图片的等比缩放等等。这些方法主要针对List<Map>类型的数据结构实现的一些算法,也可以说是“HashMap关系数据映射技术”这一思想在web客户端的延伸,从而将服务端与客户端的设计思想统一了起来。这些方法基本上均可在jQuery中调用。
1、请将附件1保存为pvo.js文件,在网页头部添加这个资源文件如:
<script type='text/javascript' src='/有效路径/pvo.js'></script>
2、如果你的JavaWeb应用上下文根目录不是"",请将附件2保存为jbxx.jsp文件,在网页头部添加这个资源文件如:
<script type='text/javascript' src='/有效路径/jbxx.jsp'></script>
3、以下文件均包含在最新上传的HashMap关系数据映射技术软件源代码和jar文件的资源包中,下载地址:http://download.csdn.net/detail/wj800/3808299
附件1:完整的pvo.js源代码
/**
* author: Kaiming Hu 2009-01-27 Chinese New Year 2
* task:
* 1、取代原pvo.js
* 2、对通用表单、菜单、页面管理等共享资源进行整合
* 3、增强异步请求与响应处理
* 4、iframe动态内容加载管理
* 5、事件注册管理
* 6、浮动层动态加载管理
* 7、路径设置与初始化管理,如:域名、上下文路径、访问某资源的请求路径...
* 8、共享变量管理,如:路径、命令栈、最近一次请求的变量
* 9、数据格式转换,如表单数据转换成xml数据、xml数据转换成Array[Map]型list数据,xml数据转换成表单数据...
* 10、根据实际需要,借鉴和利用好现有的开源代码如:Jmaki.js、JQuery.js
* 11、字段验证
* 12、支持JSON格式
* 13、拒绝重复删除、更新及查询提交。若用户希望再次看到相同的结果,请将第一次提交的结果保存。如var userVar=null;在回调方法中用userVar=pvo.RESULT;保存结果
* 14、提供与JDBC一致的查询方法executeQuery()
* 15、提供与JDBC一致的删除或更新方法executeUpdate()
* 16、提供表单方法ajaxForm()和ajaxEscapeForm(),根据用户需要返回两种不同的查询结果,记录集和html文本片断
* 17、提供分页方法page()
* 18、提供清空表单方法clearForm(formName)
* 19、提供删除或更新后重复条件查询方法queryRepeat()
* 20、提供一组默认的写栏目的范例方法,以exDDD命名。如:ex001()
* 21、提供一组幻灯范例方法,以slideDDD命名。如slide001()
* 22、增加几个实用的返回值方法:getResult(),getRootPath(),获取分页条的ID方法getPageBarID(),获取分页主体的ID方法getPageBodyID() //2010-05-31
* 23、增加一个实用方法:initFormOneRecord(obj) //obj={formName:null,index:0,map:null} //2010-06-07
*
* 约定:
* 1、使最终结果在使用上尽可能与java语言风格保持一致,如Map、List、Set、Stack、Menu的操作方式
* 2、与JavaBean具有一致的读写习惯,如:对对象内部变量xxx提供object.setXxx()与object.getXxx()方法
* 3、对象中的共享常量与Java中的public常量具有相同的访问方式,如object.XXX
* 4、对于需要对外发布的方法提供如下机制:object.方法名=方法名
* 以上的object在内部通常用this表示,使用或继承时用对象名表示
*/
var DESC=false;
var ASC=true;
var pre_IFRAME_ID="_IFRAME_";
function pvoObject(){
var pvo=this;
pvo.sys={
AUTHOR:"Kaiming Hu from China",
VERSION:"pvo v1.4"
};
pvo.SITE="http://localhost";//网址=协议+域名+端口
pvo.ROOTPATH = "";//上下文路径,根目录
pvo.SUBPATH="";//上下文路径下,用于存放子网站的路径
pvo.MENUITEM = null;
pvo.PRE_MENUITEM = null;
pvo.RESULT =null;
pvo.getRoot=function(){
return pvo.ROOTPATH;
}
pvo.setRoot=function(root){
if(root!=null){
pvo.ROOTPATH=root;
}
}
pvo.getSubPath=function(){
return pvo.SUBPATH;
}
pvo.setSubPath=function(subPath){
if(subPath!=null){
pvo.SUBPATH=subPath;
}
}
////初始化pvo.IFRAMES
//一组参数与方法,对xml文档进行分页 开始 *********************************************************************************************
//一组共享查询结果集 开始
var lastList=null;//这是一个被共享访问的,最新被选择的活跃的查询结果,以便于在分页标签中重复使用,
var setLastList=function(_lastList){
lastList=_lastList;
}
var getLastList=function(){
return lastList;
}
var pageList=null;//分页时,从lastList中提取的当前页中使用的查询结果
pvo.setPageList=function(_pageList){
pageList=_pageList;
}
pvo.getPageList=function(){
return pageList;
}
//一组共享查询结果集 结束
//分页开始
/**
* 分页方法
* @param divID 将要在其中显示的容器,
* @param list 通过XMLHttpRequest查询返回的xml文档,将此xml转换成的list
* @param numPerPage 每页显示的记录条数
* @param numPerOne 每一维显示的分页数
* @param numCurrent 当前显示的页码
* @param userPageContentMethod 当前调用的用户方法,主要用于写数据内容
* @param bodyClass 主体内容的样式类
* @param barClass 主体内容的样式类
* //format 数据显示格式 详见pvo.js中的格式化
* //className 数据显示样式类名
* 任务:
* 1、根据条件,判断是否显示分页导航条
* 2、返回当前从一个完整的List对象中所选部分数据
*/
pvo.page=function(divID,list,numPerPage,numPerOne,numCurrent,userPageContentMethod,barClass,bodyClass){
if(bodyClass==null)bodyClass='pageContent';
if(barClass==null)barClass='pageBar';
var page=this;
if(list==null)list=getLastList();//
var tmpList=list.slice(numPerPage*numCurrent,numPerPage*numCurrent+numPerPage);
pvo.setPageList(tmpList);
page.list=list;
//设置当前分组号 开始
var numGroup=0;
this.setNumGroup=function(_numGroup){
numGroup=_numGroup;
}
this.getNumGroup=function(){
return numGroup;
}
//设置当前分组号 结束
//设置当前索引号 开始
var current=0;
this.setNumCurrent=function(_numCurrent){
current=_numCurrent;
}
this.getNumCurrent=function(){
return current;
}
this.setNumCurrent(numCurrent);
//设置当前索引号 结束
//容器 开始
var indexBarID=divID+"Header";//用于定义索引容器的id
var listContentID=divID+"Body";//用于定义内容容器的id
var listDiv="<div class='pageList'><div id='"+indexBarID+"' class="+barClass+" style='width:100%;' style='display:none;'></div><div id='"+listContentID+"' class="+bodyClass+"></div></div>";
function initDiv(){//写容器//分页页面结构
if(!document.getElementById(indexBarID))document.getElementById(divID).innerHTML=listDiv;
if(list.length<=numPerPage){
document.getElementById(indexBarID).style.display="none";
}else{
document.getElementById(indexBarID).style.display="block";
}
}
initDiv();
//容器 结束
/**
* 用户自定义方法 如:pvo.method001=function(){}
* 供分页方法调用 如: onmouseover=\"pvo.page('coNews',null,3,10,0,method001);
* pvo.userPage将执行method001方法
* 在用户自定义方法中,
* 用户可以用 var list=getPageList();获取分页数据结果,
* 待填写的容器是:<div id='"+listContentID+"'></div>,该容器已提供
* 其中 var listContentID=divID+"Body";
**/
pvo.userPage=function(){}
if((userPageContentMethod!=null))userPage=userPageContentMethod;//使用回调函数
//初始化索引条 开始
var all=list.length;
var allPages=0;//总页数
var i=all%numPerPage;
if(i==0){
allPages=parseInt(all/numPerPage);
}else{
allPages=parseInt(all/numPerPage+1);
}
var group=1;//总分组数
var j=all%(numPerPage*numPerOne);
if(j==0){
group=parseInt(all/(numPerPage*numPerOne));
}else{
group=parseInt(all/(numPerPage*numPerOne)+1);
}
var oneGroupPages=numPerOne;//当前组的页面数,
if(allPages<numPerOne){
oneGroupPages=allPages;
}
pvo.showGroup=function(numGroup){
setNumGroup(numGroup);
numCurrent=numGroup*numPerOne;
showPage(numCurrent);
}
pvo.showPage=function(numCurrent){
numGroup=getNumGroup();
if(allPages-numGroup*numPerOne<numPerOne)oneGroupPages=allPages-numGroup*numPerOne;
else{
oneGroupPages=numPerOne;
}
var tmpList=list.slice(numPerPage*numCurrent,numPerPage*numCurrent+numPerPage);
setPageList(tmpList);
setNumCurrent(numCurrent);
var begin=numGroup*numPerOne;
var end=numGroup*numPerOne+oneGroupPages;
var visit="";
for(i=begin;i<end;i++){
visit=visit+"<a id='__pageA_"+i+"' class='aBtn0' href='javascript:showPage("+i+");' target='_self'> "+(i+1)+"</a>";
}
var next="";
if(numGroup<(group-1)){
next="<a class='nextBtn' href='javascript:showGroup("+(numGroup+1)+");' title='下一组'> </a>";
}else{
next="<a class='nextBtn' href='javascript:showGroup("+(group-1)+");' title='下一组'> </a>";
}
var pre="";
if(numGroup>0){
pre="<a class='preBtn' href='javascript:showGroup("+(numGroup-1)+");' title='上一组'> </a>";
}else{
pre="<a class='preBtn' href='javascript:showGroup(0);' title='上一组'> </a>";
}
var s="";
if(group>1){//按多组方式显示索引
s="<span class='span'>共" + allPages + "页 共" + all + "条 "+pre+ next+" "+visit +"</span>";
}else{//按一组方式显示索引
s="<span class='span'>共" + allPages + "页 共" + all + "条 "+" "+visit+"</span>";
}
document.getElementById(indexBarID).innerHTML=s;
document.getElementById("__pageA_"+numCurrent).className="aBtn1";//原pageBtn
pvo.userPage();
}
if(list.length<=numPerPage){//不显示索引条
setPageList(list);
pvo.userPage();
if(document.getElementById(indexBarID)){
document.getElementById(indexBarID).innerHTML="";
}//防止删除记录后,条件不足,却依然存在
}
else{
showPage(numCurrent);//调用用户方法写内容
}
//初始化索引条 结束
}
//分页结束
//一组参数与方法,对xml文档进行分页 结束 *********************************************************************************************
//一组工具方法和系统方法,相当于java.util中的部分 开始 *********************************************************************************************
/**
* 转换结果相当于java中的List对象,其中每一个元素相当于java中的Map对象
* @param xmlRecords 通过XMLHttpRequest查询返回的xml文档 在本系统中是记录集
* 约定
* xmlRecords遵循三层,即根、记录、字段数据。例:
* <records><record><id>100</id><label>稻米</label><value>4.6</value><unit>kg</unit></record><record><id>101</id><label>面粉</label><value>5.2</value><unit>kg</unit></record></records>
* 访问结果://alert(typeof data);//object //alert(data.tagName);//undefined //alert(data.nodeValue);//null //alert(data.childNodes.length);//1 //alert(data.childNodes[0].tagName);//records //alert(data.childNodes[0].childNodes.length);//2 //alert(data.childNodes[0].childNodes[0].tagName);//record //alert(data.childNodes[0].childNodes[0].childNodes.length);//4 //alert(data.childNodes[0].childNodes[0].childNodes[0].tagName);//id //alert(data.childNodes[0].childNodes[0].childNodes[0].firstChild.nodeValue);//100 //alert(data.childNodes[0].childNodes[0].childNodes[1].tagName);//label //alert(data.childNodes[0].childNodes[0].childNodes[1].firstChild.nodeValue);//稻米 *
*/
pvo.xmlToList=function(xmlRecords){
var list=new Array();
if(xmlRecords==null)return list;
if(xmlRecords.length==0)return list;
if(xmlRecords.childNodes[0]==undefined)return list;
if(xmlRecords.childNodes[0].childNodes==undefined)return list;
if(xmlRecords.childNodes[0].childNodes.length==0)return list;
var i=0;
var j=0;
for(i=0;i<xmlRecords.childNodes[0].childNodes.length;i++){
var record=xmlRecords.childNodes[0].childNodes[i];//第i条记录集,如例中的"<record><id>100</id><label>稻米</label><value>4.6</value><unit>kg</unit></record>"部分
var m=new Map();
for(j=0;j<record.childNodes.length;j++){
//alert(record.childNodes[j].firstChild.nodeValue);//////////////
if(record.childNodes[j].firstChild!=null){
m.put(record.childNodes[j].tagName, record.childNodes[j].firstChild.nodeValue);
}
else{
//m.put(record.childNodes[j].tagName, null);//原
m.put(record.childNodes[j].tagName, "");//2010-06-26修改,这样还原了服务器端xml的原意,也便于表单赋值
}
}
list.push(m);
}
return list;
}
/** Map is a general map object for storing key value pairs
* @param m - default set of properties
*/
pvo.Map =function(m) {
var map;
if (typeof m == 'undefined') map = new Array();//原{}
else map = m;
/**
* Get a list of the keys to check
*/
this.keys = function() {
var _keys = new Array();
for (var _i in map){
_keys.push(_i);
}
return _keys;//
};
/**
* Put stores the value in the table
* @param key the index in the table where the value will be stored
* @param value the value to be stored
*/
this.put = function(key,value) {
map[key] = value;
};
/**
* Return the value stored in the table
* @param key the index of the value to retrieve
*/
this.get = function(key) {
return map[key];
};
/**
* Remove the value from the table
* @param key the index of the value to be removed
*/
this.remove = function(key) {
map[key]=null;
delete map[key];
};
/**
* Clear the table
*/
this.clear = function() {
delete map;
map = new Array();
};
}
//一组工具方法和系统方法,相当于java.util中的部分 结束 *********************************************************************************************
//Ajax部分 开始 *********************************************************************************************
//参考代码 pvoAjax.js
var xhr=null;
pvo.setXhr=function(_xhr){
xhr=_xhr;
}
pvo.getXhr=function(){
return xhr;
}
//创建XMLHttpRequest对象 开始
pvo.createXHR=function(){
var xhr;
try {
xhr = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (E) {
xhr = false;
}
}
if (!xhr && typeof XMLHttpRequest != 'undefined') {
xhr = new XMLHttpRequest();
}
return xhr;
}
//创建XMLHttpRequest对象 结束
/**
* 用Ajax方式实现的上传xml片断及响应处理方法
* @param action 请求方法
* @param xml 准备好的xml片断
* @param userFunction 响应时调用的方法,由用户自定义实现
* @param isGetText nul;当为null时,将返回responseXML;当为true时,将返回responseText。
*/
pvo.ajaxXML=function(action,xml,userFunction,isGetText){ //保持原始值
if(xml=="")return;//没有可上传的数据则退出
var requestXml=function(){
var _action=pvo.getLastRequestAction();
var _xml=pvo.getLastRequestData();
if((action==_action)&&(xml==_xml)){
pvo.RESULT = getLastList();//以文本方式获取返回结果,该结果必须是格式良好的xml或html文档 ;否则,在Firefox中会检测其为错误
if(userFunction==null)userFunction=ok;
response=userFunction;//这个方法需要用户定义,用于处理用户业务,然后指定给response,
response();
pvo.RESULT=null;
return;
}//重复提交时,直接将保存的结果赋值给pvo.RESULT,调用用户响应方法,拒绝上传请求。
var xhr = createXHR();
pvo.setXhr(xhr);
xhr.onreadystatechange=processAjaxForm;//处理返回结果
xhr.open("POST", action);//注意,当POST变成GET时,无查询结果,故未使用form.method替代"POST"
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.setRequestHeader("Content-Type", "text/plain; charset=UTF-8");
xhr.send(xml);
pvo.setLastRequestAction(action);
pvo.setLastRequestData(xml);
lastForm.action=action;
lastForm.sendXml=xml;
lastForm.userFunction=userFunction;
lastForm.isGetText=isGetText;
}
var processAjaxForm=function() {//作用:处理返回状态值。
var xhr=pvo.getXhr();
if (xhr.readyState == 4) {
if (xhr.status == 200) {
if(isGetText){
pvo.RESULT = xhr.responseText;//以文本方式获取返回结果,该结果必须是格式良好的xml或html文档 ;否则,在Firefox中会检测其为错误
if(userFunction==null)userFunction=ok;
response=userFunction;//这个方法需要用户定义,用于处理用户业务,然后指定给response,
response();
pvo.RESULT=null;
}else{
var data = xhr.responseXML;//以DOM方式获取返回结果,该结果必须是格式良好的xml文档。本方法中必须是与数据库表结构对应的三层结构。
var list=xmlToList(data);
setLastList(list);
pvo.RESULT =list;
if(userFunction==null)userFunction=ok;
response=userFunction;//这个方法需要用户定义,用于处理用户业务,然后指定给response,
response();
pvo.RESULT =null;
}
}
}
}
var response=function(){};
requestXml();
}
/**
* 用一条Map记录给表单指定记录赋值,map.keyName与form.fieldName相同
* @param obj={formName:"",index:0,map:new Map()}//formName 表单名,index 表单中一条记录的索引号,map 一条记录的值
*/
pvo.initFormOneRecord=function(obj){
if(obj==null)return;
var formName=obj.formName;
var index=0;
if(obj.index!=null)index=obj.index;
var m=obj.map;
if(m==null)return;
var recordCount=0;
var firstName="id";
var form=null;
if(formName!=null)form=document.forms[formName];
else form=document.forms[0];
for(var i=0;i<form.elements.length;i++){
if(i==0){
firstName=form.elements[i].name;
}
if(recordCount==index){
if(m.get(form.elements[i].name)!=null){
//alert(form.elements[i].name+"||"+form.elements[i].type+"||"+form.elements[i].value+"||"+form.elements[i].checked);
if(form.elements[i].type=="text"||form.elements[i].type=="textarea"||form.elements[i].type=="hidden"){
form.elements[i].value=m.get(form.elements[i].name);
}
if(form.elements[i].type=="radio"){
if(form.elements[i].value==m.get(form.elements[i].name)){
form.elements[i].checked=true;
}else{
form.elements[i].checked=false;
}
}
if(form.elements[i].type=="checkbox"){
form.elements[i].value=m.get(form.elements[i].name);
if(m.get(form.elements[i].name)==true||m.get(form.elements[i].name)=="true"||m.get(form.elements[i].name)=="1"){
form.elements[i].checked=true;//需要进一步研究,原意应当是m.get(form.elements[i].name)!=null
}else{
form.elements[i].checked=false;
}
}
if(form.elements[i].type=="select-one"){
form.elements[i].value=m.get(form.elements[i].name);//需要进一步研究
}
}
//正对radio|checkbox|select的赋值
}
if(i>0){
if(firstName==form.elements[i].name)recordCount++;
}
}
}
/**
* 一条map记录转换成xml
* @param map; 一条记录
*/
pvo.mapToXML=function(map){
var fields="";
var k=map.keys();
for(var i=0;i<k.length;i++){
fields=fields+"<"+k[i]+">"+pvo.filterChar(map.get(k[i]))+"</"+k[i]+">";
}
return "<record>"+fields+"</record>";
}
/**
* 一条map记录转换成xml
* @param map; 一条记录
*/
pvo.mapToEscapeXML=function(map){
var fields="";
var k=map.keys();
for(var i=0;i<k.length;i++){
fields=fields+"<"+k[i]+">"+escape(map.get(k[i]))+"</"+k[i]+">";
}
return "<record>"+fields+"</record>";
}
/**
* 提取一条Map记录
* @param formName 表单名
* @param index 0; 表单中一条记录的索引号
*/
pvo.formOneMap=function(formName,index){
var map=new Map();
var fieldNum=0;
var recordCount=0;
var firstName="id";
var form=null;
if(formName!=null)form=document.forms[formName];
else form=document.forms[0];
var fields="";
for(var i=0;i<form.elements.length;i++){
if(i==0){
firstName=form.elements[i].name;
}
if(recordCount==0){
fieldNum++;
}
if(i>0){
if(firstName==form.elements[i].name)recordCount++;
}
if(form.elements[i].type=="hidden"||form.elements[i].type=="text"||form.elements[i].type=="textarea"||form.elements[i].type=="password"||form.elements[i].type=="file"||form.elements[i].type=="select-one"){
if(recordCount==index){
map.put(form.elements[i].name,form.elements[i].value);
}
}
if(form.elements[i].type=="checkbox"){
if(recordCount==index){
if(form.elements[i].checked){
//map.put(form.elements[i].name,form.elements[i].value);
map.put(form.elements[i].name,true);//参照pvo.formOneRecord
}else{
//map.put(form.elements[i].name,"");
map.put(form.elements[i].name,false);//参照pvo.formOneRecord
}
}
}
if(form.elements[i].type=="radio"){
if(recordCount==index){
if(form.elements[i].checked){
map.put(form.elements[i].name,form.elements[i].value);
}
}
}
}
return map;
}
/**
* 用Ajax方式实现的通用表单上传及响应处理方法XML格式一条记录
* @param formName 表单名
* @param index 0; 表单中一条记录的索引号
*/
pvo.formOneRecord=function(formName,index){
var fieldNum=0;
var recordCount=0;
var firstName="id";
var form=null;
if(formName!=null)form=document.forms[formName];
else form=document.forms[0];
var fields="";
for(var i=0;i<form.elements.length;i++){
if(i==0){
firstName=form.elements[i].name;
}
if(recordCount==0){
fieldNum++;
}
if(i>0){
if(firstName==form.elements[i].name)recordCount++;
}
if(form.elements[i].type=="hidden"||form.elements[i].type=="text"||form.elements[i].type=="textarea"||form.elements[i].type=="password"||form.elements[i].type=="file"||form.elements[i].type=="select-one"){
if(recordCount==index){
fields=fields+"<"+form.elements[i].name+">"+form.elements[i].value+"</"+form.elements[i].name+">";
}
}
//以下代码符合JavaScript的原意,但不符合实际的逻辑值的true|false的意图
//if(form.elements[i].type=="checkbox"){
// if(form.elements[i].checked){
// fields=fields+"<"+form.elements[i].name+">"+form.elements[i].value+"</"+form.elements[i].name+">";
// }else{
// fields=fields+"<"+form.elements[i].name+"></"+form.elements[i].name+">";
// }
//}
//以下代码不符合JavaScript的原意,但符合实际的逻辑值的true|false的意图
if(form.elements[i].type=="checkbox"){
if(recordCount==index){
if(form.elements[i].checked){
fields=fields+"<"+form.elements[i].name+">true</"+form.elements[i].name+">";
}else{
fields=fields+"<"+form.elements[i].name+">false</"+form.elements[i].name+">";
}
}
}
if(form.elements[i].type=="radio"){
if(recordCount==index){
if(form.elements[i].checked){
fields=fields+"<"+form.elements[i].name+">"+form.elements[i].value+"</"+form.elements[i].name+">";
}
}
}
}
return "<record>"+fields+"</record>";
}
// 替换特殊字符
pvo.filterChar=function(text){
if(typeof(text)=="string"){
text = text.replace(/&/g, "&") ;
text = text.replace(/</g, "<") ;
text = text.replace(/>/g, ">") ;
text = text.replace(/"/g, """) ;
//text = text.replace(/'/g, "’") ;
//text = text.replace(/\ /g," ");
}
return text;
}
// 反替换特殊字符
pvo.unFilterChar=function(text){
if(typeof(text)=="string"){
text = text.replace(/&/g,"&") ;
text = text.replace( /</g,"<") ;
text = text.replace( />/g,">") ;
text = text.replace(/"/g,"\"") ;
//text = text.replace(/’/g,"'") ;
//text = text.replace(/ /g,"\\");
//var s=pvo.unFilterChar(v[i].get("content"));
}
return text;
}
/**
* 用Ajax方式实现的通用表单上传及响应处理方法
* @param formName 表单名
* @param userFunction 响应时调用的方法
* @param isGetText null; 当为null时,将返回responseText;当为true时,将返回responseXML。
*/
pvo.ajaxForm=function(formName,userFunction,isGetText){ //保持原始值
var requestXml=function(){
var form=null;
if(formName!=null)form=document.forms[formName];
else form=document.forms[0];
var fields="";
for(var i=0;i<form.elements.length;i++){
if(form.elements[i].type=="hidden"||form.elements[i].type=="text"||form.elements[i].type=="textarea"||form.elements[i].type=="password"||form.elements[i].type=="file"||form.elements[i].type=="select-one"){
fields=fields+"<"+form.elements[i].name+">"+filterChar(form.elements[i].value)+"</"+form.elements[i].name+">";
}
//以下代码符合JavaScript的原意,但不符合实际的逻辑值的true|false的意图
//if(form.elements[i].type=="checkbox"){
// if(form.elements[i].checked){
// fields=fields+"<"+form.elements[i].name+">"+form.elements[i].value+"</"+form.elements[i].name+">";
// }else{
// fields=fields+"<"+form.elements[i].name+"></"+form.elements[i].name+">";
// }
//}
//以下代码不符合JavaScript的原意,但符合实际的逻辑值的true|false的意图
if(form.elements[i].type=="checkbox"){
if(form.elements[i].checked){
fields=fields+"<"+form.elements[i].name+">true</"+form.elements[i].name+">";
}else{
fields=fields+"<"+form.elements[i].name+">false</"+form.elements[i].name+">";
}
}
if(form.elements[i].type=="radio"){
if(form.elements[i].checked){
fields=fields+"<"+form.elements[i].name+">"+filterChar(form.elements[i].value)+"</"+form.elements[i].name+">";
}
}
}
if(fields=="")return;//没有可上传的数据则退出
var xml="<record>"+fields+"</record>";
var _action=pvo.getLastRequestAction();
var _xml=pvo.getLastRequestData();
if((form.action==_action)&&(xml==_xml)){
pvo.RESULT = getLastList();//以文本方式获取返回结果,该结果必须是格式良好的xml或html文档 ;否则,在Firefox中会检测其为错误
if(userFunction==null)userFunction=ok;
response=userFunction;//这个方法需要用户定义,用于处理用户业务,然后指定给response,
response();
pvo.RESULT=null;
return;
}//重复提交时,直接将保存的结果赋值给pvo.RESULT,调用用户响应方法,拒绝上传请求。
var xhr = createXHR();
pvo.setXhr(xhr);
xhr.onreadystatechange=processAjaxForm;//处理返回结果
xhr.open("POST", form.action);//注意,当POST变成GET时,无查询结果,故未使用form.method替代"POST"
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.setRequestHeader("Content-Type", "text/plain; charset=UTF-8");
xhr.send(xml);
pvo.setLastRequestAction(form.action);
pvo.setLastRequestData(xml);
lastForm.action=form.action;
lastForm.sendXml=xml;
lastForm.userFunction=userFunction;
lastForm.isGetText=isGetText;
}
var processAjaxForm=function() {//作用:处理返回状态值。
var xhr=pvo.getXhr();
if (xhr.readyState == 4) {
if (xhr.status == 200) {
if(isGetText){
pvo.RESULT = xhr.responseText;//以文本方式获取返回结果,该结果必须是格式良好的xml或html文档 ;否则,在Firefox中会检测其为错误
if(userFunction==null)userFunction=ok;
response=userFunction;//这个方法需要用户定义,用于处理用户业务,然后指定给response,
response();
pvo.RESULT=null;
}else{
var data = xhr.responseXML;//以DOM方式获取返回结果,该结果必须是格式良好的xml文档。本方法中必须是与数据库表结构对应的三层结构。
var list=xmlToList(data);
setLastList(list);
pvo.RESULT =list;
if(userFunction==null)userFunction=ok;
response=userFunction;//这个方法需要用户定义,用于处理用户业务,然后指定给response,
response();
pvo.RESULT =null;
}
}
}
}
var response=function(){};
requestXml();
}
/**
* 用Ajax方式实现的通用表单上传及响应处理方法
* @param formName 表单名
* @param index 0; 表单中一条记录的索引号
*/
pvo.formOneEscapeRecord=function(formName,index){
var fieldNum=0;
var recordCount=0;
var firstName="id";
var form=null;
if(formName!=null)form=document.forms[formName];
else form=document.forms[0];
var fields="";
for(var i=0;i<form.elements.length;i++){
if(i==0){
firstName=form.elements[i].name;
}
if(recordCount==0){
fieldNum++;
}
if(i>0){
if(firstName==form.elements[i].name)recordCount++;
}
if(form.elements[i].type=="hidden"||form.elements[i].type=="text"||form.elements[i].type=="textarea"||form.elements[i].type=="password"||form.elements[i].type=="file"||form.elements[i].type=="select-one"){
if(recordCount==index){
fields=fields+"<"+form.elements[i].name+">"+escape(form.elements[i].value)+"</"+form.elements[i].name+">";
}
}
//以下代码符合JavaScript的原意,但不符合实际的逻辑值的true|false的意图
//if(form.elements[i].type=="checkbox"){
// if(form.elements[i].checked){
// fields=fields+"<"+form.elements[i].name+">"+form.elements[i].value+"</"+form.elements[i].name+">";
// }else{
// fields=fields+"<"+form.elements[i].name+"></"+form.elements[i].name+">";
// }
//}
//以下代码不符合JavaScript的原意,但符合实际的逻辑值的true|false的意图
if(form.elements[i].type=="checkbox"){
if(recordCount==index){
if(form.elements[i].checked){
fields=fields+"<"+form.elements[i].name+">true</"+form.elements[i].name+">";
}else{
fields=fields+"<"+form.elements[i].name+">false</"+form.elements[i].name+">";
}
}
}
if(form.elements[i].type=="radio"){
if(recordCount==index){
if(form.elements[i].checked){
fields=fields+"<"+form.elements[i].name+">"+escape(form.elements[i].value)+"</"+form.elements[i].name+">";
}
}
}
}
return "<record>"+fields+"</record>";
}
/**
* 用Ajax方式实现的通用表单上传及响应处理方法
* @param formName 表单名
* @param userFunction 响应时调用的方法
* @param isGetText null; 当为null时,将返回responseText;当为true时,将返回responseXML。
*/
pvo.ajaxEscapeForm=function(formName,userFunction,isGetText){//将值转换成ECMA Unicode字符串后上传 可以调用cn.hkm.web.ProcessForm中的方法 parseXML(request, true)解析
function requestXml(){
var form=null;
if(formName!=null)form=document.forms[formName];
else form=document.forms[0];
var fields="";
for(var i=0;i<form.elements.length;i++){
if(form.elements[i].type=="hidden"||form.elements[i].type=="text"||form.elements[i].type=="textarea"||form.elements[i].type=="password"||form.elements[i].type=="file"||form.elements[i].type=="select-one"){
fields=fields+"<"+form.elements[i].name+">"+escape(form.elements[i].value)+"</"+form.elements[i].name+">";
}
//以下代码符合JavaScript的原意,但不符合实际的true|false的意图
//if(form.elements[i].type=="checkbox"){
// if(form.elements[i].checked){
// fields=fields+"<"+form.elements[i].name+">"+escape(form.elements[i].value)+"</"+form.elements[i].name+">";
// }else{
// fields=fields+"<"+form.elements[i].name+"></"+form.elements[i].name+">";
// }
//}
//以下代码不符合JavaScript的原意,但符合实际逻辑值的true|false的意图
if(form.elements[i].type=="checkbox"){
if(form.elements[i].checked){
fields=fields+"<"+form.elements[i].name+">true</"+form.elements[i].name+">";
}else{
fields=fields+"<"+form.elements[i].name+">false</"+form.elements[i].name+">";
}
}
if(form.elements[i].type=="radio"){
if(form.elements[i].checked){
fields=fields+"<"+form.elements[i].name+">"+escape(form.elements[i].value)+"</"+form.elements[i].name+">";
}
}
}
if(fields=="")return;//没有可上传的数据则退出
var xml="<record>"+fields+"</record>";
var _action=pvo.getLastRequestAction();
var _xml=pvo.getLastRequestData();
if((form.action==_action)&&(xml==_xml)){
pvo.RESULT = getLastList();//以文本方式获取返回结果,该结果必须是格式良好的xml或html文档 ;否则,在Firefox中会检测其为错误
if(userFunction==null)userFunction=ok;
response=userFunction;//这个方法需要用户定义,用于处理用户业务,然后指定给response,
response();
pvo.RESULT=null;
return;
}//重复提交时,直接将保存的结果赋值给pvo.RESULT,调用用户响应方法,拒绝上传请求。
var xhr = createXHR();
pvo.setXhr(xhr);
xhr.onreadystatechange=processAjaxForm;//处理返回结果
xhr.open("POST", form.action);//注意,当POST变成GET时,无查询结果,故未使用form.method替代"POST"
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.setRequestHeader("Content-Type", "text/plain; charset=UTF-8");
//alert(form.action);
xhr.send(xml);
pvo.setLastRequestAction(form.action);
pvo.setLastRequestData(xml);
lastForm.action=form.action;
lastForm.sendXml=xml;
lastForm.userFunction=userFunction;
lastForm.isGetText=isGetText;
}
var processAjaxForm=function() {//作用:处理返回状态值。
var xhr=pvo.getXhr();
if (xhr.readyState == 4) {
if (xhr.status == 200) {
if (xhr.status == 200) {
if(isGetText){
pvo.RESULT = xhr.responseText;//以文本方式获取返回结果,该结果必须是格式良好的xml或html文档 ;否则,在Firefox中会检测其为错误
if(userFunction==null)userFunction=ok;
response=userFunction;//这个方法需要用户定义,用于处理用户业务,然后指定给response,
response();
pvo.RESULT=null;
}else{
var data = xhr.responseXML;//以DOM方式获取返回结果,该结果必须是格式良好的xml文档。本方法中必须是与数据库表结构对应的三层结构。
var list=xmlToList(data);
setLastList(list);
pvo.RESULT =list;
if(userFunction==null)userFunction=ok;
response=userFunction;//这个方法需要用户定义,用于处理用户业务,然后指定给response,
response();
pvo.RESULT =null;
}
}
}
}
}
var response=function(){};
requestXml();
}
/**
*名称与JDBC保持一致的更新方法
*更新或删除记录 任务:更新或删除指定记录,重新按更新或删除前的查询条件查询并显示
*@param action 查询数据库时所请求的对象,相当于form中的action,当action为空时,将使用默认请求
*@param xml 查询数据库时所请求的对象,相当于form中的表单数据
*@param userFunction 用户方法
*@param isText 是否返回文体结果
使用默认action时,请将以下配置代码添加到web.xml中
*/
pvo.execute=function(action,xml,userFunction,isText){
var request=function(){
xhr = createXHR();
xhr.onreadystatechange=processExecute;//处理返回结果
xhr.open("POST", action);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.setRequestHeader("Content-Type", "text/plain; charset=UTF-8");
xhr.send(xml);
}
var processExecute=function(){
var xhr=pvo.getXhr();
if (xhr.readyState == 4) {
if (xhr.status == 200) {
if(isText){
var text = xhr.responseText;//以文本方式获取返回结果,该结果必须是格式良好的xml或html文档 ;否则,在Firefox中会检测其为错误
pvo.RESULT=text;
setLastList(text);
response=userFunction;//这个方法需要用户定义
if(userFunction==null)response=ok;
response();
pvo.RESULT=null;
}else{
var data = xhr.responseXML;//以DOM方式获取返回结果,该结果必须是格式良好的xml文档。本方法中必须是与数据库表结构对应的三层结构。
var list=xmlToList(data);
setLastList(list);
pvo.RESULT=list;
response=userFunction;//这个方法需要用户定义,ex: var product=null;function setProduct(){product=pvo.RESULT};用于保存查询结果,以备调用
if(userFunction==null)response=ok;
response();
pvo.RESULT=null;
}
}
}
}
var response=function(){}
request();
}
//用XmlHttpRequest上传表单数据,结束;
/**
*名称与JDBC保持一致的查询方法 用于查询,结果集保存在pvo.RESULT中,应当有callBack方法中调用
*此方法返回查询结果集,其结构是Array,其中每条记录是一个Map对象,相当于ProcessVO.java中的list结构
*@param sql 标准的sql查询语句
*@param action 查询数据库时所请求的对象,相当于form中的action,当action为空时,将使用默认请求
*@param userFunction 将查询结果,通过用户自定义的方法保存到指定的变量中,如:var address=null;function setAddress(){address=pvo.RESULT};
*@param isGetText true将以文本方式返回结果
*/
pvo.executeQuery=function(action,sql,userFunction,isGetText){
if(action==null)return;
var _action=pvo.getLastRequestAction();
var _sql=pvo.getLastRequestData();
if((action==_action)&&(sql==_sql)){
pvo.RESULT = getLastList();//以文本方式获取返回结果,该结果必须是格式良好的xml或html文档 ;否则,在Firefox中会检测其为错误
response=userFunction;//这个方法需要用户定义,用于处理用户业务,然后指定给response,
response();
pvo.RESULT=null;
return;
}//重复提交时,直接将保存的结果赋值给pvo.RESULT,调用用户响应方法,拒绝上传请求。
if(userFunction==null)userFunction=setLastList;
var sendXml=null;
function request(){
if(action==null)action=pvo.ROOTPATH+"/ajax/EejiaServlet?method=query";//pvoServlet原文件是cn.hkm.web.PvoServlet.java
sendXml="<record><sql>"+sql+"</sql></record>";
if(sql==null)sendXml=null;
var xhr = createXHR();
pvo.setXhr(xhr);
xhr.onreadystatechange=processQuery;//处理返回结果
xhr.open("POST", action);//注意,当POST变成GET时,无查询结果,故未使用form.method替代"POST"
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.setRequestHeader("Content-Type", "text/plain; charset=UTF-8");
xhr.send(sendXml);
}
var processQuery=function(){
var xhr=pvo.getXhr();
if (xhr.readyState == 4) {
if (xhr.status == 200) {
if(isGetText){
var text = xhr.responseText;//以文本方式获取返回结果,该结果必须是格式良好的xml或html文档 ;否则,在Firefox中会检测其为错误
pvo.RESULT=text;
setLastList(text);
response=userFunction;//这个方法需要用户定义
if(userFunction==null)response=ok;
response();
pvo.RESULT=null;
}
else{
var data = xhr.responseXML;//以DOM方式获取返回结果,该结果必须是格式良好的xml文档。本方法中必须是与数据库表结构对应的三层结构。
var list=xmlToList(data);
setLastList(list);
pvo.RESULT=list;
response=userFunction;//这个方法需要用户定义,ex: var product=null;function setProduct(){product=pvo.RESULT};用于保存查询结果,以备调用
if(userFunction==null)response=ok;
response();
pvo.RESULT=null;
}
}
}
}
var response=function(){}
request();
pvo.setLastRequestData(sql);
pvo.setLastRequestAction(action);
lastQuery.action=action;
lastQuery.sendXml=sendXml;
lastQuery.responseMethod=userFunction;
lastQuery.isGetText=isGetText;
}
/**
*名称与JDBC保持一致的更新方法
*更新或删除记录 任务:更新或删除指定记录,重新按更新或删除前的查询条件查询并显示
*@param action 查询数据库时所请求的对象,相当于form中的action,当action为空时,将使用默认请求
*@param executeSQL 用string保存的一条或用数组保存的多条标准的sql语句,可以是删除或更新语句,
*@param userFunction 回调方法,userFunction为空时,将调用pvo.queryRepeat方法
使用默认action时,请将以下配置代码添加到web.xml中
*/
pvo.executeUpdate=function(action,executeSQL,userFunction){
if(action==null)return;
if(executeSQL==null)return;
var _action=pvo.getLastRequestAction();
var _sql=pvo.getLastRequestData();
if((action==_action)&&(executeSQL==_sql)){
return;
}//重复更新或删除提交时,拒绝上传请求。
var sql="";
var xml="";
if(typeof executeSQL=="string"){
xml="<record><sql>"+executeSQL+"</sql></record>";
}
else if(typeof executeSQL=="object"){
if(executeSQL.length){
for(var i=0;i<executeSQL.length;i++){
sql=sql+"<sql>"+executeSQL[i]+"</sql>";
}
xml="<record>"+sql+"</record>";
}else{
return;
}
}
xhr = createXHR();
if(userFunction==null)userFunction=pvo.executeLastQuery();
xhr.onreadystatechange=userFunction;//处理返回结果
xhr.open("POST", action);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.setRequestHeader("Content-Type", "text/plain; charset=UTF-8");
xhr.send(xml);
pvo.setLastRequestData(executeSQL);
pvo.setLastRequestAction(action);
}
/**
*重复上一次表单执行
*/
pvo.executeLastForm=function(){
function request(){
var xhr = createXHR();
pvo.setXhr(xhr);
xhr.onreadystatechange=processQuery;//处理返回结果
xhr.open("POST",lastForm.action);//注意,当POST变成GET时,无查询结果,故未使用form.method替代"POST"
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.setRequestHeader("Content-Type", "text/plain; charset=UTF-8");
xhr.send(lastForm.sendXml);
}
var processQuery=function(){
var xhr=pvo.getXhr();
if (xhr.readyState == 4) {
if (xhr.status == 200) {
if(lastForm.isGetText){
var text = xhr.responseText;//以文本方式获取返回结果,该结果必须是格式良好的xml或html文档 ;否则,在Firefox中会检测其为错误
pvo.RESULT=text;
setLastList(text);
response=lastForm.userFunction;//这个方法需要用户定义,ex: var product=null;function setProduct(){product=pvo.RESULT};用于保存查询结果,以备调用
if(response==null)response=ok;
response();
pvo.RESULT=null;
}
else{
var data = xhr.responseXML;//以DOM方式获取返回结果,该结果必须是格式良好的xml文档。本方法中必须是与数据库表结构对应的三层结构。
var list=xmlToList(data);
setLastList(list);
pvo.RESULT=list;
response=lastForm.userFunction;//这个方法需要用户定义,ex: var product=null;function setProduct(){product=pvo.RESULT};用于保存查询结果,以备调用
if(response==null)response=ok;
response();
pvo.RESULT=null;
}
}
}
}
var response=function(){}
request();
}
/**
*重复上一次query执行
*/
pvo.executeLastQuery=function(){
function request(){
var xhr = createXHR();
pvo.setXhr(xhr);
xhr.onreadystatechange=processQuery;//处理返回结果
xhr.open("POST",lastQuery.action);//注意,当POST变成GET时,无查询结果,故未使用form.method替代"POST"
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.setRequestHeader("Content-Type", "text/plain; charset=UTF-8");
xhr.send(lastForm.sendXml);
}
var processQuery=function(){
var xhr=pvo.getXhr();
if (xhr.readyState == 4) {
if (xhr.status == 200) {
if(lastQuery.isGetText){
var text = xhr.responseText;//以文本方式获取返回结果,该结果必须是格式良好的xml或html文档 ;否则,在Firefox中会检测其为错误
pvo.RESULT=text;
setLastList(text);
response=lastQuery.userFunction;//这个方法需要用户定义
if(lastQuery.userFunction==null)response=ok;
response();
pvo.RESULT=null;
}
else{
var data = xhr.responseXML;//以DOM方式获取返回结果,该结果必须是格式良好的xml文档。本方法中必须是与数据库表结构对应的三层结构。
var list=xmlToList(data);
setLastList(list);
pvo.RESULT=list;
response=lastQuery.userFunction;//这个方法需要用户定义,ex: var product=null;function setProduct(){product=pvo.RESULT};用于保存查询结果,以备调用
if(lastQuery.userFunction==null)response=ok;
response();
pvo.RESULT=null;
}
}
}
}
var response=function(){}
request();
}
/**以文本格式返回Ajax查询结果。但必须是格式良好的xml或html文本
*@param action 查询数据库时所请求的对象,相当于form中的action;请将参数写在action中,如:var action=pvo.ROOTPATH+"/ajax/PvoServlet?method=hasValue&name=hkm"
*@param userFunction 将查询结果,通过用户自定义的方法保存到指定的变量中 ex: var html=null;function setHtml(){html=pvo.RESULT};
*@param isGetText 是否以文本的方式返回
*/
pvo.query=function(action,userFunction,isGetText){
if(action==null) return;
var _action=pvo.getLastRequestAction();
if(action==_action){
pvo.RESULT = getLastList();//以文本方式获取返回结果,该结果必须是格式良好的xml或html文档 ;否则,在Firefox中会检测其为错误
response=userFunction;//这个方法需要用户定义,用于处理用户业务,然后指定给response,
response();
pvo.RESULT=null;
return;
}//重复提交,拒绝上传请求。
function request(){
var xhr = createXHR();
pvo.setXhr(xhr);
xhr.onreadystatechange=processQuery;//处理返回结果
xhr.open("POST",action);//注意,当POST变成GET时,无查询结果,故未使用form.method替代"POST"
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.setRequestHeader("Content-Type", "text/plain; charset=UTF-8");
xhr.send(null);
}
var processQuery=function(){
var xhr=pvo.getXhr();
if (xhr.readyState == 4) {
if (xhr.status == 200) {
if(isGetText){
var text = xhr.responseText;//以文本方式获取返回结果,该结果必须是格式良好的xml或html文档 ;否则,在Firefox中会检测其为错误
pvo.RESULT=text;
setLastList(text);
response=userFunction;//这个方法需要用户定义
if(userFunction==null)response=ok;
response();
pvo.RESULT=null;
}
else{
var data = xhr.responseXML;//以DOM方式获取返回结果,该结果必须是格式良好的xml文档。本方法中必须是与数据库表结构对应的三层结构。
var list=xmlToList(data);
setLastList(list);
pvo.RESULT=list;
response=userFunction;//这个方法需要用户定义,ex: var product=null;function setProduct(){product=pvo.RESULT};用于保存查询结果,以备调用
if(userFunction==null)response=ok;
response();
pvo.RESULT=null;
}
}
}
}
var response=function(){}
request();
pvo.setLastRequestAction(action);
lastQuery.action=action;
lastQuery.sendXml=null;
lastQuery.userFunction=userFunction;
lastQuery.isGetText=isGetText;
}
var lastQuery={
action:null,
sendXml:null,
userFunction:null,
isGetText:null
} //用于保存查询条件
var lastForm={
action:null,
sendXml:null,
userFunction:null,
isGetText:null
} //用于保存查询条件
var ok=function(){
if(typeof pvo.RESULT=="string") window.status="pvo.RESULT is :"+pvo.RESULT;else window.status="pvo.RESULT has "+pvo.RESULT.length+" records ";
};//默认的响应方法,在状态栏显示查询结果信息
/**
@param resultList 是一个已经存在的查询结果集
@param fieldName 为指定字段
@param fieldValue 为该字段的值,可为null
@param lessEqualLength 长度小于等lessEqualLength
@return 获取指定字段值为fieldValue,且长度小于等lessEqualLength的查询结果集的最大子集;
数量小于等于lessEqualLength,当lessEqualLength>v.size()时,lessEqualLength取值为v.size();
*/
pvo.getSomeRecord=function(resultList, fieldName,fieldValue,lessEqualLength) {
var r = new Array();
var map = null;
var ID = null;
if (lessEqualLength <= 0) {
return r;
}
var m = 0;
if (resultList != null) {
if (resultList.length > 0) {
if (lessEqualLength > resultList.length) {
lessEqualLength = resultList.length;
}
for (var i = 0; i < resultList.length; i++) {
map = resultList[i];
ID = map.get(fieldName);
if (fieldValue == null) {
if (ID == null) {
r.push(map);
m++;
}
} else {
if (ID != null) {
if (fieldValue==ID) {
r.push(map);
m++;
}
}
}
if (r.length == lessEqualLength) {
return r;
}
}
}
}
return r;
}
/**
@param resultList 是一个已经存在的查询结果集
@param fieldName 为指定字段
@param fieldValue 为该字段的值,可为null
@return 获取指定字段值为fieldValu的,一条记录;
*/
pvo.getOneRecord=function(resultList, fieldName,fieldValue){
var map = new Map();
if(resultList==null)return map;
if (resultList.length > 0) {
for (var i = 0; i < resultList.length; i++) {
var ID = resultList[i].get(fieldName);
if(ID==fieldValue){
map=resultList[i];
return map;
}
}
}
return map;
}
/**
@param resultList 是一个已经存在的查询结果集
@param fieldName 为指定字段
@param fieldValue 为该字段的值,可为null
@return 获取指定字段值为fieldValu的,一条记录的索引号;
*/
pvo.getOneRecordIndex=function(resultList, fieldName,fieldValue){
var a=-1;
if(resultList==null)return a;
if (resultList.length > 0) {
for (var i = 0; i < resultList.length; i++) {
var ID = resultList[i].get(fieldName);
if(ID==fieldValue){
a=i;
}
}
}
return a;
}
/**
@param resultList 是一个已经存在的查询结果集
@param fieldName 为指定字段
@param fieldIndexValue 为该字段的首字母值
@return 获取指定字段值为fieldValu的记录集;
*/
pvo.getAbbreList=function(resultList,fieldName,fieldIndexValue){
var v=new Array();
for(var i=0;i<resultList.length;i++){
var m=resultList[i];
var s=m.get(fieldName);
if(s!=null&&s.indexOf(fieldIndexValue)==0){
v.push(resultList[i]);
}
}
return v;
}
pvo.getResult=function(){
return pvo.RESULT;
}
/**
@param resultList 是一个已经存在的查询结果集,类型为pvo结果集
@param fieldName 为指定字段
@return 获取指定字段值不重复的记录集合;
*/
pvo.getRecordSet=function(resultList, fieldName) {
var r = new Array();
var b=false;
if (resultList != null) {
if (resultList.length > 0) {
for (var i = 0; i < resultList.length; i++) {
var map = resultList[i];
b=false;
for (var a = 0; a < r.length; a++) {
var m=r[a];
if(m.get(fieldName)==map.get(fieldName)){
b=true;
}
}
if(!b){
r.push(map);
}
}
}
}
return r;
}
//Ajax部分 结束 *********************************************************************************************
//验证部分 开始 ************************************************************************************************************************************************************
//主要验证项目:1、密码 2、密码确认 3、英文 4、中文 5、数字 6、整数 7、长整数 8、浮点数 9、日期 10、邮件 11、网址 12、电话 13、手机 14、IP地址 15、邮编 16、QQ号 17、MSN 18、身份证
//两个变量,一组方法,这两个变量用于判断是否重复提交;或用于重复条件提交
var lastRequestData =null; //用于存贮上一次请求提交的数据
var lastRequestAction =null; //用于存贮上一次请求时和动作
pvo.setLastRequestData=function(_lastRequestData){
lastRequestData=_lastRequestData;
}
pvo.getLastRequestData=function(){
return lastRequestData;
}
pvo.setLastRequestAction=function(_lastRequestAction){
lastRequestAction=_lastRequestAction;
}
pvo.getLastRequestAction=function(){
return lastRequestAction;
}
//一组保存验证结果的方法,
var checked=false;
pvo.setChecked=function(_checked){
checked=_checked;
}
pvo.isChecked=function(){
return checked;
}
/*
var s='中英文test';
alert(/^[a-zA-Z ]{1,20}$/.test(s));//false
alert( /^[\u4e00-\u9fa5]{5,10}$/.test(s));//false
alert( /^[a-zA-Z\u4e00-\u9fa5]{6,10}$/.test(s));//true
alert( /^[a-zA-Z ]{1,20}$/.test(s) || /^[\u4e00-\u9fa5]{1,10}$/.test(s));//false
在实际应用中,应当根据需要自定义所需的正则表达式,如:对于精度decimal(10,2)字段的输入验证,
//var decimalReg=/^\d{0,8}\.{0,1}(\d{1,2})?$/;不带正负号
var decimalReg=/^[-\+]?\d{0,8}\.{0,1}(\d{1,2})?$/;
if(n.value!=""&&decimalReg.test(n.value)){
record.num=n.value;
}else{
if(n.value!=""){
n.value=record.num;
}
}
*/
//要用到的正则表达式
pvo.reg={
"english":/^[a-zA-Z0-9_\-]+$/,
"chinese":/^[\u0391-\uFFE5]+$/,
"number":/^[-\+]?\d+(\.\d+)?$/,
"integer":/^[-\+]?\d+$/,
"decimal":/^[-\+]?\d+(\.\d+)?$/,
"date":/^(\d{4})(-|\/)(\d{1,2})\2(\d{1,2})$/,
"email":/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
"url" : /^(((ht|f)tp(s?))\:\/\/)[a-zA-Z0-9]+\.[a-zA-Z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/,
"phone" : /^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$/,
"mobile" : /^((\(\d{2,3}\))|(\d{3}\-))?((13\d{9})|(159\d{8}))$/,
"ip" : /^(0|[1-9]\d?|[0-1]\d{2}|2[0-4]\d|25[0-5]).(0|[1-9]\d?|[0-1]\d{2}|2[0-4]\d|25[0-5]).(0|[1-9]\d?|[0-1]\d{2}|2[0-4]\d|25[0-5]).(0|[1-9]\d?|[0-1]\d{2}|2[0-4]\d|25[0-5])$/,
"zipcode": /^[1-9]\d{5}$/,
"qq" : /^[1-9]\d{4,10}$/,
"msn" : /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
"idcard" : /(^\d{15}$)|(^\d{17}[0-9Xx]$)/,
"charbegin" : /^\b[A-Za-z]\w/
};
//可以这样调用其中的属性,如:pvo.reg.ip
/**
*验证文本输入时,是否只有数字
*@param evt
*/
pvo.checkNum=function(evt){
evt=(evt)?evt:event;
var charCode=(evt.charCode)?(evt.charCode):((evt.which)?(evt.which):evt.keyCode);
if(charCode>31&&(charCode<48||charCode>57)){
return false;
}
return true;
}
/**
*验证格式是否正确
*@param str , not null 待验证的数据,必须有。
*@param reg, not null正则表达式,必须有。用户可以自定义,也可以用pvo.reg.get('ip')的方式获取已定义的正则表达式
*@param rightTip , null 验证正确时的提示
*@param errorTip, null 验证错误时的提示
*@param divTipID, null 提示显示所在的容器id
*@param callBack, null 调用用户方法 在这个方法中,用户可调用var b= pvo.isChecked();来获取验证结果,根据验证结果作进一步处理
* check(zh,/\b[A-Za-z]\w{5,49}/);// 例第一种验证方法,其正则表达式/\b[A-Za-z]\w{5,49}/的含义是,以1个字母开头,其后可以是5-49个字母、数字、下划线的任意组合,但其上限49在IE中不能被检测
* checkLengthIn(zh,/\b[A-Za-z]\w/,6,50);//第二种验证方法,先验证字符组合格式,后验证长度,这是稳妥的做法
*/
pvo.check=function(str,reg,rightTip,errorTip,divTipID,callBack){
var b=false;
var tip="";
if(str.search(reg)==0){
b=true;
}
pvo.setChecked(b);
if(b){
if(rightTip)tip=rightTip;
}
else{
if(errorTip) tip=errorTip;
}
if(divTipID)document.getElementById(divTipID).innerHTML=tip;
if(callBack){
pvo.response=callBack;//这个方法需要用户定义,用于处理用户业务,然后指定给response,
pvo.response();
}
return b;
}
/**
*验证格式是否正确,并且是否是指定长度
*@param str 待验证的数据,必须有。
*@param reg 正则表达式,必须有。用户可以自定义,也可以用pvo.reg.ip的方式获取已定义的正则表达式
*@param fixLength 长度,必须有。 需要明确的长度限制时,请指定长度,这是稳妥的作法。 不同的浏览器对正则表达式的解释不同,正则表达式中所持有的长度信息,可能会在某一浏览器中被忽略
*/
pvo.checkLength=function(str,reg,fixLength){
var b=false;
b=pvo.check(str,reg);
if(b){
if(str.length==fixLength)b=true;
else{
b=false;
}
}
return b;
}
/**
*验证格式是否正确,并且是否是指定长度。 需要明确的长度限制时,请指定长度,这是稳妥的作法。 不同的浏览器对正则表达式的解释不同,正则表达式中所持有的长度信息,可能会在某一浏览器中被忽略
*@param str not null 待验证的数据,必须有。
*@param reg not null 正则表达式,必须有。用户可以自定义,也可以用pvo.reg.email 的方式获取已定义的正则表达式
*@param minLength not null 最小长度,必须有。
*@param maxLength not null 最大长度,必须有。
*@param rightTip null 验证正确时的提示。
*@param errorTip null 验证错误时的提示。
*@param divTipID null 显示验证提示信息所使用的容器ID。
*@param callBack, null 调用用户方法 在这个方法中,用户可调用var b= pvo.isChecked();来获取验证结果,根据验证结果作进一步处理
*/
pvo.checkLengthIn=function(str,reg,minLength,maxLength,rightTip,errorTip,divTipID,callBack){
var b=false;
b=pvo.check(str,reg);
if(b){
if(str.length>=minLength&&str.length<=maxLength)b=true;
else{
b=false;
}
}
pvo.setChecked(b);
var tip="";
if(b){
if(rightTip)tip=rightTip;
}
else{
if(errorTip) tip=errorTip;
}
if(divTipID)document.getElementById(divTipID).innerHTML=tip;
if(callBack){
pvo.response=callBack;//这个方法需要用户定义,用于处理用户业务,然后指定给response,
pvo.response();
}
return b;
}
//验证部分 结束 ************************************************************************************************************************************************************
//实用方法部分 开始 ************************************************************************************************************************************************************
/**
* 清空表单中的数据,通常用于新建记录
* @param formName 表单名
*/
pvo.clearForm=function(formName){
var form=null;
if(formName!=null)form=document.forms[formName];
else form=document.forms[0];
for(var i=0;i<form.elements.length;i++){
if(form.elements[i].type=="hidden"||form.elements[i].type=="text"||form.elements[i].type=="textarea"||form.elements[i].type=="password"||form.elements[i].type=="file"||form.elements[i].type=="select-one"||form.elements[i].type=="checkbox"||form.elements[i].type=="radio"){
form.elements[i].value="";
}
}
}
/**
* @param formName
* @param fieldName
*/
pvo.clearFormField=function(formName,fieldName){
var form=null;
if(formName!=null)form=document.forms[formName];
else form=document.forms[0];
for(var i=0;i<form.elements.length;i++){
if(form.elements[i].name==fieldName){
form.elements[i].value="";
}
}
}
/**
* @param formName
* @param fieldName
* @param fieldValue
*/
pvo.defaultFieldValue=function(formName,fieldName,fieldValue){
var form=document.forms[formName];
for(var i=0;i<form.elements.length;i++){
if(form.elements[i].name==fieldName){
form.elements[i].value=fieldValue;
}
}
}
/**
*将字符串str中的regex全部替换为target
*exam:
* var h=" <p>ss</p> <a href=''>xxx</a>";
* h=replaceStr(h," ","");
* var t=$(h).text();结果t="ssxxx"
* @param str
* @param regex
* @param target
*/
pvo.replaceStr=function(str,regex,target){
var arg={
s:""
}
function trim(s){
if(s.indexOf(regex)>=0){
arg.s=s=s.replace(regex, target);
trim(s);
}
}
trim(str);
return arg.s;
}
/**
*去掉长度大于等于1的空字符串
**/
pvo.trim=function(str) {
var s=str.replace(/ /g, "");
return s;
}
/**
*长度等于1的空字符串替代长度大于1的空字符串
**/
pvo.trim2=function(str) {
var s=str.replace(/\s\s+|\s\s+/g, " ");
return s;
}
/**
*去掉重复及非法字符
**/
pvo.trimStr=function(str){
var reg=/\~+|\!\!\!\!+|\@\@+|\#\#+|\$\$+|\%\%+|\^\^+|\&\&+|\*\*+|\\\\+|\.\.\.\.\.\.\.+|\,\,+|\s\s+/g;//去掉+|\/\/
str=str.replace(reg, "");
var arg={
index:-1,
pre:"",
next:"",
len:1
};
var v=new Array();
var m=new pvo.Map();
var i=0;
for(i=0;i<str.length;i++){
if(i>0){
arg.pre=str.charAt(i-1);
arg.next=str.charAt(i);
if(arg.pre==arg.next){
if(arg.index==-1){
arg.index=i-1;
}
arg.len++;
}else{
if(arg.len>1){
m=new pvo.Map();
m.put("index", arg.index);
m.put("char", arg.pre);
m.put("len", arg.len);
v.push(m);
arg.len=1;
arg.index=-1;
}
}
}
}
if(arg.len>1){
m=new pvo.Map();
m.put("index", arg.index);
m.put("char", arg.pre);
m.put("len", arg.len);
v.push(m);
arg.len=1;
arg.index=-1;
}
for(i=v.length-1;i>=0;i--){
m=v[i];
var s0="";
for(var j=0;j<m.get("len");j++){
s0=s0+m.get("char");
}
if(m.get("char")!="0"&&m.get("char")!="1"&&m.get("char")!="2"&&m.get("char")!="3"&&m.get("char")!="4"&&m.get("char")!="5"&&m.get("char")!="6"&&m.get("char")!="7"&&m.get("char")!="8"&&m.get("char")!="9"){
if(m.get("len")>2){
str=str.replace(s0, m.get("char")+m.get("char"));
}
}else{
if(m.get("len")>20){
str=str.replace(s0, "");
}
}
}
return str;
}
//提取部分字段
pvo.partStr= function(str,length){
var s=null;
if(str!=null){
if(length>str.length)length=str.length;
s=str.slice(0,length);
}
return s;
}
//表格行交替背景 //格式化行的样式
pvo.formatRow=function(uid,color1,color2,colorHighLight){
if(color2==null)color2="#DCE7F7";
if(color1==null)color1="#E9EFF8";
if(colorHighLight==null)colorHighLight="#6699ff";
var newBody=document.getElementById(uid);
if(newBody!=null){
var newRows=newBody.rows;
for(var i=0;i<newRows.length;i++){
var itr=newRows[i];
var j=i%2;
if(j==0){
itr.bgColor=color1;
itr.onmouseover=function(){
this.bgColor=colorHighLight;
};
itr.onmouseout=function(){
this.bgColor=color1
};
}
if(j==1){
itr.bgColor=color2;
itr.onmouseover=function(){
this.bgColor=colorHighLight;
};
itr.onmouseout=function(){
this.bgColor=color2
};
}
}
}
}
// 删除最后一行显示,但不是删除记录
pvo.subRow=function(uid){
var newBody=document.getElementById(uid);
var newRows=newBody.rows;
if(newRows.length>0)newBody.removeChild(newBody.lastChild);
}
// 删除全部行显示,但不是删除记录
pvo.subAllRow=function(uid){
var uidBody=document.getElementById(uid);
while(uidBody.hasChildNodes()){
uidBody.removeChild(uidBody.lastChild);
}
}
/**
* 表单中select的替代方案
**/
pvo.fieldValuesParam={
uid:"oneDiv",
filedID:"oneInput",
pvoList:null,
fieldLabel:"field",
valueLabel:"value",
defaultInnerHTML:null,
initList:function(){},
userFunction:function(){},
open:function(){},
close:function(){},
asign:function(){},
perPageLength:12,
width:140
};
pvo.fieldValues=function(oneDivID,oneInputID){
//uid,fieldID,pvoList,labelFieldName,valueFieldName,width
var fielsValuesDiv
="<div style='position:relative;width:20px;height:20px;line-height:20px;display:block;padding:0px;background:#92C3E5 url("+pvo.getRoot()+"/pvoWeb/res/css/images/columns.gif) 0% 0% repeat-x;'>"
+"<span id='__pvo_select_span'><a style='height:20px;line-height:20px;width:20px;' href=javascript:pvo.fieldValuesParam.open();><img src='"+pvo.getRoot()+"/pvoWeb/res/css/images/btn_3dot.gif' border='0'></a></span>"
+"<div id='__pvo_select_content' style='position:absolute;top:20px;left:0px;width:auto;height:auto;visibility:hidden;background:#dddddd;border:solid 1px gray;'>"
+"<p style='margin:0px;padding:0px;background:#eeeeee;'><a href=javascript:pvo.fieldValuesParam.close();><img src='"+pvo.getRoot()+"/pvoWeb/res/css/images/btn_close.gif' border='0'></a></p>"
+"<div id='__pvo_select_content_body' style='width:"+pvo.fieldValuesParam.width+"px;height:auto;float:left;background:#cccccc;'></div>"
+"</div>"
+"</div>";
document.getElementById(oneDivID).innerHTML=fielsValuesDiv;
//document.write(fielsValuesDiv);
if(pvo.fieldValuesParam.pvoList==null)pvo.fieldValuesParam.initList();
var l_v=pvo.getRecordSet(pvo.fieldValuesParam.pvoList, pvo.fieldValuesParam.fieldLabel);
if(pvo.fieldValuesParam.valueLabel==null)pvo.fieldValuesParam.valueLabel=pvo.fieldValuesParam.fieldLabel;
var writeTable=function(){
page('__pvo_select_content_body',l_v,pvo.fieldValuesParam.perPageLength,5,0,function(){
var l = pvo.getPageList();
var html="";
if(l.length>0){
for(var i=0;i<l.length;i++){
html=html+"<tr><td align='left'><a style='float:left;margin:1px;' href=javascript:pvo.fieldValuesParam.asign('"+l[i].get(pvo.fieldValuesParam.valueLabel)+"');>"+l[i].get(pvo.fieldValuesParam.fieldLabel)+"</a></td></td></tr>";
}
}else{
html="<tr><td>暂无记录</td></tr>"
}
html="<tbody id='__browseBody'>"+html+"</tbody>";
document.getElementById("__pvo_select_content_bodyBody").innerHTML="<table cellpadding='1' cellspacing='1' border='0px' width='100%' align='center'>"+html+"</table>";
formatRow('__browseBody');
});
}
var asign=function(value){
document.getElementById(oneInputID).value=value;
}
var open=function(){
document.getElementById('__pvo_select_content').style.visibility='visible';
writeTable();
}
var close=function(){
document.getElementById('__pvo_select_content').style.visibility='hidden';
document.getElementById(oneDivID).innerHTML=pvo.fieldValuesParam.defaultInnerHTML;
}
pvo.fieldValuesParam.open=open;
pvo.fieldValuesParam.close=close;
pvo.fieldValuesParam.asign=asign;
}
/**
* 表单中select的替代方案
*@param uid 容器id
*@param fieldID 表单中字段的id
*@param pvoList pvo格式结果集
*@param valueFieldName pvoList中作为值的字段
*@param labelFieldName pvoList中作为显示的字段
*@param width 显示宽度
**/
pvo.select=function(uid,fieldID,pvoList,labelFieldName,valueFieldName,width){
if(width==null)width=140;
var fielsValuesDiv
="<div style='position:relative;width:20px;height:20px;line-height:20px;display:block;padding:0px;background:#92C3E5 url("+pvo.getRoot()+"/pvoWeb/res/css/images/columns.gif) 0% 0% repeat-x;'>"
+"<span id='__pvo_select_span'><a style='height:20px;line-height:20px;width:20px;' href=javascript:pvo.selectParam.open();><img src='"+pvo.getRoot()+"/pvoWeb/res/css/images/btn_3dot.gif' border='0'></a></span>"
+"<div id='__pvo_select_content' style='position:absolute;top:20px;left:0px;width:auto;height:auto;visibility:hidden;background:#dddddd;border:solid 1px gray;'>"
+"<p style='margin:0px;padding:0px;background:#eeeeee;'><a href=javascript:pvo.selectParam.close();><img src='"+pvo.getRoot()+"/pvoWeb/res/css/images/btn_close.gif' border='0'></a></p>"
+"<div id='__pvo_select_content_body' style='width:"+width+"px;height:auto;float:left;'></div>"
+"</div>"
+"</div>";
document.getElementById(uid).innerHTML=fielsValuesDiv;
var l_v=pvo.getRecordSet(pvoList, labelFieldName);
if(valueFieldName==null)valueFieldName=labelFieldName;
var writeTable=function(){
page('__pvo_select_content_body',l_v,12,5,0,function(){
var l = pvo.getPageList();
var html="";
if(l.length>0){
for(var i=0;i<l.length;i++){
html=html+"<tr><td align='left'><a style='float:left;margin:1px;' href=javascript:pvo.selectParam.asign('"+l[i].get(valueFieldName)+"');>"+l[i].get(labelFieldName)+"</a></td></td></tr>";
}
}else{
html="<tr><td>暂无记录</td></tr>"
}
html="<tbody id='__browseBody'>"+html+"</tbody>";
document.getElementById("__pvo_select_content_bodyBody").innerHTML="<table cellpadding='1' cellspacing='1' border='0px' width='100%' align='center'>"+html+"</table>";
formatRow('__browseBody');
});
}
var asign=function(value){
document.getElementById(fieldID).value=value;
}
var open=function(){
document.getElementById('__pvo_select_content').style.visibility='visible';
writeTable();
}
var close=function(){
document.getElementById('__pvo_select_content').style.visibility='hidden';
}
pvo.selectParam.open=open;
pvo.selectParam.close=close;
pvo.selectParam.asign=asign;
}
pvo.selectParam={
open:null,
close:null,
userFunction:function(){},
asign:null
};
/**
* 动态显示层
*@param uid 容器id
*@param userHTML 用户定义的内容
*@param title 用户定义的内容
*@param top 用户定义的内容顶边距偏移量
*@param left 用户定义的内容左边距偏移量
**/
pvo.layer=function(uid,userHTML,title,top,left){
if(title==null)title="";
if(top==null)top=0;
if(left==null)left=0;
//var initLayer=function(){
document.getElementById(uid).innerHTML="<div style='position:relative;width:1px;height:1px;line-height:0px;padding:0px;'><div id='__pvo_layer' style='position:absolute;top:"+top+"px;left:"+left+"px;width:auto;height:auto;visibility:visible;background:#dddddd;border:solid 1px gray;'><table border='0' cellpadding='1' cellspacing='0'><tr style='background:#eeeeee url("+pvo.getRoot()+"/pvoWeb/res/css/images/columns.gif) 0% 0% repeat-x;width:100%;'><td style='width:80%;height:20px;line-height:20px;'>"+title+"</td><td style='width:20%;height:20px;line-height:20px;'><img src='"+pvo.getRoot()+"/pvoWeb/res/css/images/btn_close.gif' width='20px' height='20px' border='0' align='right' onclick='pvo.layerParam.close();'></td></tr><tr><td colspan='2' id='__pvo_layer_body' class='pvoLayerContentBody'></td></tr></table></div></div><style type='text/css'>.pvoLayerContentBody div{padding-top:14px;}</style>";
document.getElementById('__pvo_layer_body').innerHTML=userHTML;
//}
//setTimeout(initLayer,1000);
var close=function(){
document.getElementById('__pvo_layer').style.visibility='hidden';
document.getElementById(uid).innerHTML="";
}
pvo.layerParam.close=close;
}
pvo.layerParam={
close:null
};
//实用方法部分 结束 ************************************************************************************************************************************************************
//页面与菜单管理部分 开始 ************************************************************************************************************************************************************
//一组参数与方法用于处理已使用过的菜单
var lastMenuItem=null;//上次使用的菜单项
pvo.setLastMenuItem=function(_lastMenuItem){
lastMenuItem=_lastMenuItem;
}
pvo.getLastMenuItem=function(){
return lastMenuItem;
}
var lastMenuItemProcessMethod=function(){};//上次使用的菜单项处理方法
pvo.setLastMenuProcessMethod=function(_lastMenuItemProcessMethod){
lastMenuItemProcessMethod=_lastMenuItemProcessMethod;
}
pvo.getLastMenuProcessMethod=function(){
return lastMenuItemProcessMethod;
}
var menuItem=null;//本次使用的菜单项
pvo.setMenuItem=function(_menuItem){
menuItem=_menuItem;
}
pvo.getMenuItem=function(){
return menuItem;
}
//重新加载最近一次调用的菜单
pvo.resetMenu=function(){
menu(getLastMenuItem(),getLastMenuProcessMethod());
}
var stackMenuItem =new Array(); //栈,专用于记录已使用的菜单项
var stackMenuItemProcessMethod =new Array(); //栈,专用于记录已使用的菜单项处理方法
//后退菜单操作
pvo.backMenu=function(){
if(stackMenuItem.length>0){
menu(stackMenuItem.pop(),stackMenuItemProcessMethod.pop());
}
}
/**
*定义菜单项
*@param menuid 标签a的id
*@param uid 容器div的id,这个容器用于加载页面src的内容
*@param src 各种类型的网页文件名 如products.jsp
*使用方法 如:var menuOne=new menuItem("a01","d01","a.html");
*/
pvo.menuItem=function(menuid,uid,src){
this.menuid=menuid;
this.uid=uid;
this.src=src;
}//创建菜单参数对象的函数
/**
*菜单管理方法
*@param menuItem,not null 菜单项。如:var menuOne=new menuItem("a01","d01","a.html");
*@param userFunction null 加工菜单项的方法
*/
pvo.menu=function(menuItem,userFunction){
//if(pvo.IFRAMES[0]==null){for(var i=0;i<IFRAMES_NUM;i++){var id=IFRAMES_ID+i;pvo.IFRAMES.push(document.getElementById(id));}}//初始化pvo.IFRAMES
var srcFrame=document.getElementById('_IFRAME_0');//pvo.IFRAMES[0];
var process=function(){}
var transferHTML=function(){
if(menuItem.src!=null){
var srcContent=(srcFrame.contentDocument)?srcFrame.contentDocument.getElementsByTagName("body")[0].innerHTML:(srcFrame.contentWindow)?srcFrame.contentWindow.document.body.innerHTML:"";
pvo.document.getElementById(menuItem.uid).innerHTML=srcContent;
}
}
if(menuItem==null)return;
pvo.setMenuItem(menuItem); //保存当前菜单项,供用户调用
pvo.MENUITEM =menuItem; //保存当前菜单项,供用户调用
srcFrame.src=menuItem.src;
if(!srcFrame.onload){
setTimeout(transferHTML,1000); //加载网页内容到容器中
}
if(userFunction!=null)process=userFunction;
process(); //执行用户方法
stackMenuItem.push(menuItem); //供返回菜单backMenu()使用
stackMenuItemProcessMethod.push(process); //供返回菜单backMenu()使用
pvo.PRE_MENUITEM=menuItem; //执行后,保存菜单项,供用户调用
setLastMenuItem(menuItem); //执行后,保存菜单项,供用户调用
setLastMenuProcessMethod(process); //执行后,保存菜单项的执行方法,供用户调用
}
/**
*加载页面并执行用户方法
*@param pageUrl iframe对象将要加载的页面参数如:iframeObj.src=pageUrl
*@param uid 当前页面加载iframeObj内容的容器id
*@param userFunction 用户方法,可用于初始化一些数据
*/
pvo.loadPage=function(pageUrl,uid,userFunction){
var iframeObj=document.getElementById('_IFRAME_1');
var load=function(){
var srcContent=(iframeObj.contentDocument)?iframeObj.contentDocument.getElementsByTagName("body")[0].innerHTML:(iframeObj.contentWindow)?iframeObj.contentWindow.document.body.innerHTML:"";
document.getElementById(uid).innerHTML=srcContent;
}
iframeObj.src=pageUrl;
var process=function(){}
if(userFunction!=null)process=userFunction;
if(!iframeObj.onload){
setTimeout(load,1000); //加载网页内容到容器中
}
setTimeout(process,1000); //加载后,执行用户方法
}
pvo.getHTML=function(iframeObj){
var srcContent=(iframeObj.contentDocument)?iframeObj.contentDocument.getElementsByTagName("html")[0].innerHTML:(iframeObj.contentWindow)?iframeObj.contentWindow.document.body.innerHTML:"";
return srcContent;
}
//页面与菜单管理部分 结束 ************************************************************************************************************************************************************
//事件处理部分 开始 ************************************************************************************************************************************************************
pvo.getEvent=function(evt){
evt=(evt)?evt:((window.event)?window.event:null);
return evt;
}
pvo.getElement=function(evt){
var elem=null;
evt=(evt)?evt:((window.event)?window.event:null);
if(evt){
elem=(evt.target)?evt.target:evt.srcElement;
}
return elem;
}
pvo.getTarget=function(e) {
var targ=null;
if (!e) {
e = window.event;
}
if (e.target) {
targ = e.target;
}
else if (e.srcElement) {
targ = e.srcElement;
}
if (targ.nodeType == 3) {
targ = targ.parentNode;
} // safari hack
return targ;
}
//判断事件源是否与指定的元素或其子孙相等
//nodeObj指定的元素;
//targetObj事件源元素;
pvo.isInNode=function(nodeObj,targetObj){
var b=false;
if(nodeObj==null)return false;
if(targetObj==null)return false;
if(targetObj.tagName.toLowerCase()=='body')return b;
if((nodeObj.parentNode==targetObj))return b;
if((nodeObj==targetObj))b=true;
else{
b=pvo.isInNode(nodeObj,targetObj.parentNode);
}
return b;
}
//事件处理部分 结束 ************************************************************************************************************************************************************
//格式化输出部分 开始 ***************************************************************************************************************************************************************
/*
*方法__formatStr()|writeTable()等可以实现格式化显示,其中格式用参数format来控制.
* format的取值及意义如下:
* N 代表 序号number
* I 代表 图标icon 仅提供一个标签,并定义其id,具体使用什么图标,由样式文件实现
* P 代表 前缀pretitle
* T 代表 标题title
* A 代表 作者author
* M 代表 日期,中等长度格式
* S 代表 日期,短格式
* L 代表 日期,长格式
* U 代表 连接url
* C 代表 内容content
* w 代表 宽度width
* h 代表 高度height
* n 代表 点击次数nockedtimes
* p 代表 图片标题pictitle
* d 代表 文章标题doctitle
* i 代表 IP地址ip
* a 代表 地名addressname
* g 代表 按组分类groupid
* c 代表 栏目分类columnsid
* f 代表 文件名filename
* s 代表 排序sortnum
* u 代表 单位unit
* 显示时,按ITPDA...的任意组合的排列顺序实现,格式符不出现的则不显示;
* 当u出现时,给标题增加连接,并使用指定url,否则不加连接;
* 单元格的样式类名用该格式字符表示.
*/
//图像类对象
pvo.img=function(id,src,width,height,title,url,target,groupid){
this.id=id;
this.src=src;
this.width=width;
this.height=height;
this.title=title;
this.url=url;
this.target=target;
this.groupid=groupid;
}
/**
*@param config={id:0,src:pvo.ROOTPATH+"/pvoWeb/res/js/images/e1.png",width:256,height:208,title:"样列图片",url:"http://www.pioshop.com/cn",target:"_blank",groupid:null}
*/
pvo.imgObj=function(config){
if(config==null)config={};
var props={
id:null,
src:null,
width:null,
height:null,
title:null,
url:null,
target:null,
groupid:null
}
for(var i in props)this[i]=(typeof config[i]=='undefined')?props[i]:config[i];
}
//新闻类对象
pvo.news=function(id,title,pretitle,content,url,groupid,uptime,sortnum,target){
this.id=id;
this.title=title;
this.pretitle=pretitle;
this.content=content;
this.url=url;
this.groupid=groupid;
this.uptime=uptime;
this.sortnum=sortnum;
this.target=target;
}
/**
*@param config
*/
pvo.newsObj=function(config){
if(config==null)config={};
var props={
id:null,
title:null,
pretitle:null,
content:null,
url:null,
groupid:null,
uptime:null,
sortnum:null,
target:null
}
for(var i in props)this[i]=(typeof config[i]=='undefined')?props[i]:config[i];
}
/**
*这个方法仅用于pvo.news与pvo.img及pvo.link对象列表的筛选,相当于pvo.getSomeRecord()
*/
pvo.group=function(resultList, fieldName,fieldValue,lessEqualLength){
var length=lessEqualLength;
if(lessEqualLength==null)length=8;
var list=new Array();
var record;
for(var i=0;i<resultList.length;i++){
record=resultList[i];
if(fieldName=="id"){
if(fieldValue==record.id){
list.push(record);
}
}
if(fieldName=="groupid"){
if(fieldValue==record.groupid){
list.push(record);
}
}
if(fieldName=="title"){
if(fieldValue==record.title){
list.push(record);
}
}
if(list.length>=length)return list;
}
return list;
}
//格式化一条记录,并返回其值
function __formatStr(list,i,format,tag){
var isLink=-1;
var j=0;
for(j=0;j<format.length;j++){
if(format.charAt(j)=='U')isLink=j;
}
var item=list[i];
var s="";
var c="";
var target="";
if(item.target!=null)target=" target='"+item.target+"'";
if((tag!=null)&&(tag!="")){
for(j=0;j<format.length;j++){
c=format.charAt(j);
if(c=="N")s=s+"<"+tag+" class='N'>"+(i+1)+"</"+tag+">";
if(c=="I")s=s+"<"+tag+" class='I'>"+item.icon+"</"+tag+">";
if(c=="P")s=s+"<"+tag+" class='P'>"+item.pretitle+"</"+tag+">";
if(c=="T"){
if(isLink>=0){
s=s+"<"+tag+" class='T'><a class='U' href='"+item.url+"'"+target+">"+item.title+"</a></"+tag+">";
}else{
s=s+"<"+tag+" class='T'>"+item.title+"</"+tag+">";
}
}
if(c=="A")s=s+"<"+tag+" class='A'>"+item.author+"</"+tag+">";
if(c=="L")s=s+"<"+tag+" class='L'>"+item.uptime+"</"+tag+">";
if(c=="M")s=s+"<"+tag+" class='M'>"+item.uptime.substring(2)+"</"+tag+">";
if(c=="S")s=s+"<"+tag+" class='S'>"+item.uptime.substring(5)+"</"+tag+">";
if(c=="g")s=s+"<"+tag+" class='g'>"+item.groupid+"</"+tag+">";
if(c=="s")s=s+"<"+tag+" class='s'>"+item.sortnum+"</"+tag+">";
}
}
return s;
}
//格式化输出
pvo.formatStr=function(uid,list,from,length,format,tag){
var s="";
var to=from+length;
if(list.length<to)to=list.length;
for(var i=from;i<to;i++){
s=s+__formatStr(list,i,format,tag);
}
document.getElementById(uid).innerHTML=s;
}
//格式化输出表格
pvo.writeTable=function(uid,headList,bodyList,from,length,format,line0Class,line1Class,idName,className){
if(bodyList.length<=from)return;
var to=from+length;
if(bodyList.length<to)to=bodyList.length;
var id=uid+"Table";
if(idName==null)idName=id;
if(className==null)className=id;
var t1="<table cellpadding='0' cellspacing='0' border='0' width='100%' class='"+className+"' id='"+idName+"'>";
var thead="";
if(headList!=null){
thead="<thead><tr>";
for(var j=0;j<headList.length;j++){
thead=thead+"<th>"+headList[j]+"</th>";
}
thead=thead+"</tr><thead>";
}
var tr="";
for(var i=from;i<to;i++){
var s1="";
if(i%2==0){
if(line0Class!=null){
s1="<tr class='"+line0Class+"'>";
}else{
s1="<tr>";
}
}else{
if(line1Class!=null){
s1="<tr class='"+line1Class+"'>";
}else{
s1="<tr>";
}
}
var s="";
s=__formatStr(bodyList,i,format,"td");
var s2="</tr>";
tr=tr+s1+s+s2;
}
var tbody="<tbody>"+tr+"<tbody>"
var t2="</table>";
var table=t1+thead+tbody+t2;
document.getElementById(uid).innerHTML=table;
}
//用于存贮图片等比缩放结果
pvo.scale={
width:null,
height:null
};
/**
*这个方法的算法来自cn.hkm.web.Picture.java 根据以下四个参数, 按照指定宽度和高度计算出等比缩放的宽度和高度
*@param width 图片宽度
*@param height 图片高度
*@param outWidth 希望输出的宽度
*@param outHeight 希望输出的高度
*/
pvo.scaleWH=function(width,height,outWidth,outHeight){
width=parseInt(width);
height=parseInt(height);
outWidth=parseInt(outWidth);
outHeight=parseInt(outHeight);
var h=width;
var w=height;
var r=height/width;
var rs=outHeight/outWidth;
if((width<=outWidth)&&(height<=outHeight)){
w=width;
h=height;
}
if((width<=outWidth)&&(height>outHeight)){
w=parseInt(outHeight/r);
h=outHeight;
}
if((width>outWidth)&&(height<=outHeight)){
w=outWidth;
h=parseInt(outWidth*r);
}
if((width>outWidth)&&(height>outHeight)){
if(r<rs){
w=outWidth;
h=parseInt(outWidth*r);
}
if(r>rs){
h=outHeight;
w=parseInt(outHeight/r);
}
if(r==rs){
w=outWidth;
h=outHeight;
}
}
pvo.scale.width=w;
pvo.scale.height=h;
return pvo.scale;
}
/**
*scale by width
*/
pvo.scaleW=function(width,height,outWidth){
width=parseInt(width);
height=parseInt(height);
outWidth=parseInt(outWidth);
if(width<outWidth){
pvo.scale.width=width;
pvo.scale.height=height;
}else{
pvo.scale.width=outWidth;
pvo.scale.height=parseInt(outWidth*height/width);
}
return pvo.scale;
}
/**
*scale by height
*
*/
pvo.scaleH=function(width,height,outHeight){
width=parseInt(width);
height=parseInt(height);
outHeight=parseInt(outHeight);
if(height<outHeight){
pvo.scale.width=width;
pvo.scale.height=height;
}else{
pvo.scale.width=parseInt(outHeight*width/height);
pvo.scale.height=outHeight;
}
return pvo.scale;
}
/**
*图像列表
*@param uid 容器id
*@param imgList pvo.img对象列表
*@param scaleWidth 等比缩放宽度
*@param scaleHeight 等比缩放高度
*@param colNum 列数
*@param className 表格类名
*@param notHref true不添加链接 false添加链接
*pvo.img(id,src,width,height,title,url,groupid)
*/
pvo.imgTable=function(uid,imgList,scaleWidth,scaleHeight,colNum,className,notHref){
var csize=parseInt(scaleWidth/13,10)-1;
if(colNum==null)colNum=1;
var html="";
var halfBorderWidth=0;
var halfBorderHeight=0;
if(imgList!=null&&imgList.length>0){
for(var i=0;i<imgList.length;i=i+colNum){
if(i>=imgList.length)break;
var j=i;
var k=0;
var html1="";
for(j=i;j<i+colNum;j++){
if(j<imgList.length){
if(scaleWidth!=null&&scaleHeight!=null){
pvo.scale=pvo.scaleWH(imgList[j].width,imgList[j].height,scaleWidth,scaleHeight);
}
if(scaleWidth==null){
pvo.scale=pvo.scaleH(imgList[j].width,imgList[j].height,scaleHeight);
scaleWidth=pvo.scale.width;
}
if(scaleHeight==null){
pvo.scale=pvo.scaleW(imgList[j].width,imgList[j].height,scaleWidth);
scaleHeight=pvo.scale.height;
}
if(scaleWidth==null&&scaleHeight==null){
pvo.scale.width=imgList[j].width;
pvo.scale.height=imgList[j].height;
scaleWidth=pvo.scale.width;
scaleHeight=pvo.scale.height;
}
halfBorderWidth=(scaleWidth-pvo.scale.width)/2;
halfBorderHeight=(scaleHeight-pvo.scale.height)/2;
//img="<div style='width:"+pvo.scale.width+"px;height:"+pvo.scale.height+"px;border-top:solid "+halfBorderHeight+"px #ffffff;border-bottom:solid "+halfBorderHeight+"px #ffffff;border-left:solid "+halfBorderWidth+"px #ffffff;border-right:solid "+halfBorderWidth+"px #ffffff;'><img width='"+pvo.scale.width+"px' height='"+pvo.scale.height+"px' src='"+pvo.ROOTPATH+"/qy/"+m.get('qy_id')+"/cp/"+filename+"'/></div>";
if(!notHref)html1=html1+"<td align='center' valign='middle'><div style='width:"+pvo.scale.width+"px;height:"+pvo.scale.height+"px;border-top:solid "+halfBorderHeight+"px #ffffff;border-bottom:solid "+halfBorderHeight+"px #ffffff;border-left:solid "+halfBorderWidth+"px #ffffff;border-right:solid "+halfBorderWidth+"px #ffffff;'><a href="+imgList[j].url+"><img src="+imgList[j].src+" width="+pvo.scale.width+"px height="+pvo.scale.height+"px border=0px /><a></div></td>";
if(notHref){
html1=html1+"<td align='center' valign='middle'><div style='width:"+pvo.scale.width+"px;height:"+pvo.scale.height+"px;border-top:solid "+halfBorderHeight+"px #ffffff;border-bottom:solid "+halfBorderHeight+"px #ffffff;border-left:solid "+halfBorderWidth+"px #ffffff;border-right:solid "+halfBorderWidth+"px #ffffff;'><img src="+imgList[j].src+" width="+pvo.scale.width+"px height="+pvo.scale.height+"px border=0px /></div></td>";
}
}else{
if(k>=imgList.length)k=0;
if(scaleWidth!=null&&scaleHeight!=null){
pvo.scale=pvo.scaleWH(imgList[k].width,imgList[k].height,scaleWidth,scaleHeight);
}
if(scaleWidth==null){
pvo.scale=pvo.scaleH(imgList[k].width,imgList[k].height,scaleHeight);
scaleWidth=pvo.scale.width;
}
if(scaleHeight==null){
pvo.scale=pvo.scaleH(imgList[k].width,imgList[k].height,scaleWidth);
scaleHeight=pvo.scale.height;
}
if(scaleWidth==null&&scaleHeight==null){
pvo.scale.width=imgList[k].width;
pvo.scale.height=imgList[k].height;
scaleWidth=pvo.scale.width;
scaleHeight=pvo.scale.height;
}
halfBorderWidth=(scaleWidth-pvo.scale.width)/2;
halfBorderHeight=(scaleHeight-pvo.scale.height)/2;
if(!notHref)html1=html1+"<td align='center' valign='middle'><div style='width:"+pvo.scale.width+"px;height:"+pvo.scale.height+"px;border-top:solid "+halfBorderHeight+"px #ffffff;border-bottom:solid "+halfBorderHeight+"px #ffffff;border-left:solid "+halfBorderWidth+"px #ffffff;border-right:solid "+halfBorderWidth+"px #ffffff;'><a href="+imgList[k].url+"><img src="+imgList[k].src+" width="+pvo.scale.width+"px height="+pvo.scale.height+"px border=0px /><a></div></td>";
if(notHref){
html1=html1+"<td align='center' valign='middle'><div style='width:"+pvo.scale.width+"px;height:"+pvo.scale.height+"px;border-top:solid "+halfBorderHeight+"px #ffffff;border-bottom:solid "+halfBorderHeight+"px #ffffff;border-left:solid "+halfBorderWidth+"px #ffffff;border-right:solid "+halfBorderWidth+"px #ffffff;'><img src="+imgList[k].src+" width="+pvo.scale.width+"px height="+pvo.scale.height+"px border=0px /></div></td>";
}
k++;
}
}
html1="<tr>"+html1+"</tr>";
k=0;
var html2="";
for(j=i;j<i+colNum;j++){
if(j<imgList.length){
if(!notHref)html2=html2+"<td align='center'><a href="+imgList[j].url+">"+partStr(imgList[j].title,csize)+"</a></td>";
if(notHref){
html2=html2+"<td align='center'>"+partStr(imgList[j].title,csize)+"</td>";
}
}else{
if(k>=imgList.length)k=0;
if(!notHref)html2=html2+"<td align='center'><a href="+imgList[k].url+">"+partStr(imgList[k].title,csize)+"</a></td>";
if(notHref){
html2=html2+"<td align='center'>"+partStr(imgList[k].title,csize)+"</td>";
}
k++;
}
}
html2="<tr align='center'>"+html2+"</tr>";
html=html+html1+html2;
}
var cls="";
if(className!=null){
cls=" class='"+className+"'";
}
html="<table id='"+uid+"Table' cellpadding='1px' cellspacing='1px' border='0px' align='center' "+cls+">"+html+"</table>";
}
document.getElementById(uid).innerHTML=html;
}
/**
*图像列表
*@param uid 容器id
*@param imgList pvo.img对象列表
*@param scaleWidth 等比缩放宽度
*@param scaleHeight 等比缩放高度
*@param colNum 列数
*@param className 表格类名
*@param notHref true不添加链接 false添加链接
*pvo.img(id,src,width,height,title,url,groupid)
*/
pvo.imgTableTwo=function(uid,imgList,scaleWidth,scaleHeight,colNum,className,notHref){
if(colNum==null)colNum=1;
var html="";
var halfBorderWidth=0;
var halfBorderHeight=0;
if(imgList!=null&&imgList.length>0){
for(var i=0;i<imgList.length;i=i+colNum){
if(i>=imgList.length)break;
var j=i;
var k=0;
var html1="";
for(j=i;j<i+colNum;j++){
if(j<imgList.length){
if(scaleWidth!=null&&scaleHeight!=null){
pvo.scale=pvo.scaleWH(imgList[j].width,imgList[j].height,scaleWidth,scaleHeight);
}
if(scaleWidth==null){
pvo.scale=pvo.scaleH(imgList[j].width,imgList[j].height,scaleHeight);
scaleWidth=pvo.scale.width;
}
if(scaleHeight==null){
pvo.scale=pvo.scaleW(imgList[j].width,imgList[j].height,scaleWidth);
scaleHeight=pvo.scale.height;
}
if(scaleWidth==null&&scaleHeight==null){
pvo.scale.width=imgList[j].width;
pvo.scale.height=imgList[j].height;
scaleWidth=pvo.scale.width;
scaleHeight=pvo.scale.height;
}
halfBorderWidth=(scaleWidth-pvo.scale.width)/2;
halfBorderHeight=(scaleHeight-pvo.scale.height)/2;
if(!notHref)html1=html1+"<td align='center' valign='middle'><div style='width:"+pvo.scale.width+"px;height:"+pvo.scale.height+"px;border-top:solid "+halfBorderHeight+"px #ffffff;border-bottom:solid "+halfBorderHeight+"px #ffffff;border-left:solid "+halfBorderWidth+"px #ffffff;border-right:solid "+halfBorderWidth+"px #ffffff;'><a href="+imgList[j].url+"><img src="+imgList[j].src+" width="+pvo.scale.width+"px height="+pvo.scale.height+"px border=0px /><a></div></td>";
if(notHref){
html1=html1+"<td align='center' valign='middle'><div style='width:"+pvo.scale.width+"px;height:"+pvo.scale.height+"px;border-top:solid "+halfBorderHeight+"px #ffffff;border-bottom:solid "+halfBorderHeight+"px #ffffff;border-left:solid "+halfBorderWidth+"px #ffffff;border-right:solid "+halfBorderWidth+"px #ffffff;'><img src="+imgList[j].src+" width="+pvo.scale.width+"px height="+pvo.scale.height+"px border=0px /></div></td>";
}
}else{
if(k>=imgList.length)k=0;
if(scaleWidth!=null&&scaleHeight!=null){
pvo.scale=pvo.scaleWH(imgList[k].width,imgList[k].height,scaleWidth,scaleHeight);
}
if(scaleWidth==null){
pvo.scale=pvo.scaleH(imgList[k].width,imgList[k].height,scaleHeight);
scaleWidth=pvo.scale.width;
}
if(scaleHeight==null){
pvo.scale=pvo.scaleH(imgList[k].width,imgList[k].height,scaleWidth);
scaleHeight=pvo.scale.height;
}
if(scaleWidth==null&&scaleHeight==null){
pvo.scale.width=imgList[k].width;
pvo.scale.height=imgList[k].height;
scaleWidth=pvo.scale.width;
scaleHeight=pvo.scale.height;
}
halfBorderWidth=(scaleWidth-pvo.scale.width)/2;
halfBorderHeight=(scaleHeight-pvo.scale.height)/2;
if(!notHref)html1=html1+"<td align='center' valign='middle'><div style='width:"+pvo.scale.width+"px;height:"+pvo.scale.height+"px;border-top:solid "+halfBorderHeight+"px #ffffff;border-bottom:solid "+halfBorderHeight+"px #ffffff;border-left:solid "+halfBorderWidth+"px #ffffff;border-right:solid "+halfBorderWidth+"px #ffffff;'><a href="+imgList[k].url+"><img src="+imgList[k].src+" width="+pvo.scale.width+"px height="+pvo.scale.height+"px border=0px /><a></div></td>";
if(notHref){
html1=html1+"<td align='center' valign='middle'><div style='width:"+pvo.scale.width+"px;height:"+pvo.scale.height+"px;border-top:solid "+halfBorderHeight+"px #ffffff;border-bottom:solid "+halfBorderHeight+"px #ffffff;border-left:solid "+halfBorderWidth+"px #ffffff;border-right:solid "+halfBorderWidth+"px #ffffff;'><img src="+imgList[k].src+" width="+pvo.scale.width+"px height="+pvo.scale.height+"px border=0px /></div></td>";
}
k++;
}
}
html1="<tr>"+html1+"</tr>";
k=0;
var html2="";
for(j=i;j<i+colNum;j++){
if(j<imgList.length){
if(!notHref)html2=html2+"<td align='center'><a href="+imgList[j].url+">"+imgList[j].title+"</a></td>";
if(notHref){
html2=html2+"<td align='center'>"+imgList[j].title+"</td>";
}
}else{
if(k>=imgList.length)k=0;
if(!notHref)html2=html2+"<td align='center'><a href="+imgList[k].url+">"+imgList[k].title+"</a></td>";
if(notHref){
html2=html2+"<td align='center'>"+imgList[k].title+"</td>";
}
k++;
}
}
html2="<tr align='center'>"+html2+"</tr>";
html=html+html1+html2;
}
var cls="";
if(className!=null){
cls=" class='"+className+"'";
}
html="<table id='"+uid+"Table' cellpadding='1px' cellspacing='1px' border='0px' align='center' "+cls+">"+html+"</table>";
}
document.getElementById(uid).innerHTML=html;
}
//自定义图片记录对象,用于将PVO中的一条记录保存为JavaScript对象
//用于幻灯,开始
//修订时间:2010-5-10
pvo.cycle={
k:0,//用于指定记录
segment:null,//用于幻灯时间间隔返回值
list:null, //图片数据列表
initDiv:function(uid,width,height){//画图层
var strHref="";
if(pvo.cycle.list!=null){
for(var i=0;i<pvo.cycle.list.length;i++){
strHref=strHref+"<a href='javascript:pvo.cycle.start("+i+");' id='__sycleNUM"+i+"' class='aBtn0' target='_self'>"+(i+1)+"</a>";
}
}
var str="<div style='clear:both;'></div><div id='__cycleDIV' style='position:relative;display:block;background-color:gray;margin:0px 0px 0px 0px;padding:0px 0px 0px 0px;width:"+width+"px;height:"+(height+22)+"px;line-height:"+(height+22)+"px;overflow:hidden;text-overflow:clip;'>"
+" <div style='float:left;position:relative;width:"+width+"px;height:"+height+"px;overflow:hidden;text-overflow:clip;z-index:10;'>"
+" <a href='' id='__cycleURL' style='float:left;position:relative;'>"
+" <img id='__cyclePIC' style='float:left;position:relative;top:0px;margin:0px 0px 0px 0px;padding:0px 0px 0px 0px;border:0px;display:block;filter: progid:DXImageTransform.Microsoft.RevealTrans (duration=2,transition=23)' width='"+(width)+"px' height='"+(height)+"px' alt='' src='"+pvo.ROOTPATH+"/pvoWeb/res/js/images/b0.png'/>"
+" </a>"
+" <div id='__cyclePicHref' style='float:left;position:relative;bottom:20px;height:20px;line-height:20px;float:left;filter:alpha(style=1,opacity=20,finishOpacity=80);width:"+width+"px;text-align:right;z-index:100;'>"
+ strHref
+" </div>"
+" </div>"
+" <div align='center' style='position:relative;float:left;height:22px;line-height:22px;width:"+width+"px;background-color:#222222;text-align:center;' onclick=''>"
+" <a href='' id='__cycle_CO_URL'><span id='__cyclePICTITLE' style='height:22px;line-height:22px;color:orange;font-size:14px;'></span></a>"
+" </div>"
+"</div>";
if(document.getElementById("__cycleDIV")==null){
document.getElementById(uid).innerHTML=str;//定义层,作为幻灯的容器
}
},
start:function(__cycle_n){
//实现幻灯的方法
if(document.getElementById("__cyclePIC")!=null){
if(pvo.cycle.list==null)return;
if(pvo.cycle.list.length==0)return;
if(document.all){//IE
document.getElementById("__cyclePIC").filters[0].Apply();
document.getElementById("__cyclePIC").filters[0].Play(duration=3);
document.getElementById("__cyclePIC").filters[0].Transition=23;
}
if(pvo.cycle.segment!=null){
clearInterval(pvo.cycle.segment);
}
if(__cycle_n!=null)pvo.cycle.k=__cycle_n;
if(pvo.cycle.k>=pvo.cycle.list.length)pvo.cycle.k=0;
document.getElementById("__cyclePIC").src=pvo.cycle.list[pvo.cycle.k].src;
document.getElementById("__cyclePIC").alt=pvo.cycle.list[pvo.cycle.k].title;
document.getElementById("__cyclePICTITLE").innerHTML=pvo.cycle.list[pvo.cycle.k].title;
document.getElementById("__cycleURL").href=pvo.cycle.list[pvo.cycle.k].url;
document.getElementById("__cycle_CO_URL").href=pvo.cycle.list[pvo.cycle.k].url;
for (var m=0;m<pvo.cycle.list.length;m++) {
document.getElementById("__sycleNUM"+m).className="aBtn0";//cycleBar
}
document.getElementById("__sycleNUM"+pvo.cycle.k).className="aBtn1";
pvo.cycle.segment=setInterval(function(){
pvo.cycle.start(__cycle_n);
},5000);
__cycle_n=null;
pvo.cycle.k++;
}
},
show:function(uid,picList,width,height,maxLength){
if(maxLength==null)maxLength=8;
if(picList.length>maxLength){
pvo.cycle.list=picList.slice(0,maxLength);
}
else{
pvo.cycle.list=picList;
}
pvo.cycle.initDiv(uid,width,height);//画图层
pvo.cycle.start(pvo.cycle.k);//从指定图片开始
}
}
//用于幻灯,结束
//滚动图片,开始
__slide_i=0;
__slide_segment=null;
pvo.__fsnMarquee=function(){
if(document.getElementById("__slideDIV")){
if(document.getElementById("__slideDIV").scrollLeft>=document.getElementById("__slideTABLE").offsetWidth-document.getElementById("__slideDIV").offsetWidth){
document.getElementById("__slideTR").insertCell(-1).innerHTML=document.getElementById("__slideTR").cells[__slide_i].innerHTML;
__slide_i++;
}
if(__slide_i>=100){
__slide_i=0;
}else {
document.getElementById("__slideDIV").scrollLeft++;
}
}
}
pvo.slidePic=function(picList,width,height){
if(picList==null)return;
if(__slide_segment!=null){
clearInterval(__slide_segment);
}
var picListLength=16;
if(picList.length<picListLength){
picListLength=picList.length;
}
for(var i=0;i<picListLength;i++){
var item=picList[i];
var td=document.createElement("td");
td.innerHTML="<a href="+item.url+" target="+item.target+"><img src='"+item.src+"' alt='"+item.title+"' width='"+width+"px' height='"+height+"px' style='border:0px;'/></a>";
document.getElementById("__slideTR").appendChild(td);
}
__slide_segment=setInterval(__fsnMarquee,20);
}
pvo.slide=function(uid,picList,width,height){
if(picList==null)return;
if(document.getElementById("__slideDIV")==null){
var str="<div align='center' id='__slideDIV' onmouseout='__slide_segment=setInterval(__fsnMarquee,20);' onmouseover='clearInterval(__slide_segment);' style='overflow: hidden;width:100%;height:"+(height+8)+"px;float:left;'>"
+" <table align='left' border='0' cellpadding='0' cellspacing='2' id='__slideTABLE' width='100%'><tr id='__slideTR'></tr></table>"
+"</div>";
document.getElementById(uid).innerHTML=str;//定义层,作为滚动图片的容器
}
slidePic(picList,width,height);
}
//滚动图片,结束
/**
*给记录添加索引号
**/
pvo.putIndexList=function(list){
var l=new Array();
for(var i=0;i<list.length;i++){
var m=list[i];
m.put("i",i);
l.push(m);
}
return l;
}
//格式化输出部分 结束 ***************************************************************************************************************************************************************
//一组实用方法 开始*****************************************************************************************************************************************************************
//打开浮动层 开始 临时
var __layer_segment=null;
var aLayer="<div id='showLayer' style='width:0px;height:0px;left:0px;top:0px;position:absolute;visibility:hidden;z-index:1;'></div>";
function drawLayer(){
document.write(aLayer);
}
drawLayer();
function hiddenDiv(event){
var uid=document.getElementById('showLayer');
var v=allIDS(uid);
var b=false;
if(window.event.toElement.id!='showLayer'){
var which=0;
for(var a=0;a<v.length;a++){
if(window.event.toElement.uniqueID==v[a])b=true;
}
if(!b)uid.style.visibility="hidden";
}
}
function showDiv(event,width,height,offsetWidth,offsetHeight,headList,bodyList,from,length,format,line0Class,line1Class){
var uid=document.getElementById("showLayer");
if(event){
addEvent(document.getElementById("showLayer"),"mouseout",hiddenDiv);
if(document.all){
if(bodyList!=null&&bodyList.length>0){
uid.style.width=width;
uid.style.height=height;
uid.style.top=document.body.scrollTop+event.clientY-event.offsetY+offsetHeight;
uid.style.left=document.body.scrollLeft+event.clientX-event.offsetX+offsetWidth;
uid.style.visibility="visible";
writeTable("showLayer",headList,bodyList,from,length,format,line0Class,line1Class);
}
else{
uid.style.visibility="hidden";
}
}
}
}
//打开浮动层 结束 临时
//实用方法,tab标签切换
pvo.tabAB={
cur:null,
pre:null,
className1:'tab1',
className2:'tab2'
};
pvo.tabAlt=function(curUid){
if(tabAB.cur==null){
tabAB.cur=curUid;
}
if(tabAB.pre==null){
tabAB.pre=curUid;
}
tabAB.cur=curUid;
document.getElementById(tabAB.pre).className=tabAB.className1;
document.getElementById(tabAB.cur).className=tabAB.className2;
tabAB.pre=tabAB.cur;
}
pvo.tab=function(curUid){
if(tabAB.cur==null){
tabAB.cur=curUid;
}
if(tabAB.pre==null){
tabAB.pre=curUid;
}
tabAB.cur=curUid;
//document.getElementById(tabAB.pre).style.color='white';
document.getElementById(tabAB.pre).style.backgroundImage='url('+pvo.ROOTPATH+'/pvoWeb/res/css/images/conewsb.gif)';
document.getElementById(tabAB.cur).style.backgroundImage='url('+pvo.ROOTPATH+'/pvoWeb/res/css/images/conewsa.gif)';
tabAB.pre=tabAB.cur;
}
/**
*实用方法,解析并返回cookies
**/
pvo.getCookies=function(){
var s=document.cookie.split(";");
var m=new Map();
for(var i=0;i<s.length;i++){
var ss=s[i].split("=");
var key=pvo.trim(ss[0]);
m.put(key,ss[1]);
}
return m;
}
/**
*实用方法,解析并返回cookies
*@param map=new pvo.Map();
*@param days=30;
**/
pvo.addCookies=function(map,days){
if(days==null)days=365;
if(map==null){
map=new pvo.Map();
var r=1000+parseInt(1000*Math.random());
var userID=(new Date()).getTime()+"."+r;
map.put("cookie_id", userID);
}
var keys=map.keys();
var s="";
var t = new Date((new Date()).getTime() + days*(24*60*60*1000));
for(var i=0;i<keys.length;i++){
s=keys[i]+"="+map.get(keys[i])+";expires="+t.toGMTString();
document.cookie = s;
}
}
/**
* 将字符串格式的时间输出为标准Date对象
* @param stringDate 格式如:var stringDate="2010-08-01 18:22:00.0";
*/
pvo.parseDate=function(stringDate){
var s=stringDate.substr(0, stringDate.lastIndexOf("."));
var ss=s.split(" ");
var tms=ss[1];
var sss=ss[0].split("-");
var y=sss[0];
var m=sss[1];
var d=sss[2];
var MM="Jan";
if(m=="01"){
MM="Jan";
}
if(m=="02"){
MM="Feb";
}
if(m=="03"){
MM="Mar";
}
if(m=="04"){
MM="Apr";
}
if(m=="05"){
MM="May";
}
if(m=="06"){
MM="Jun";
}
if(m=="07"){
MM="Jul";
}
if(m=="08"){
MM="Aug";
}
if(m=="09"){
MM="Sep";
}
if(m=="10"){
MM="Oct";
}
if(m=="11"){
MM="Nov";
}
if(m=="12"){
MM="Dec";
}
var dt=new Date(MM+" "+d+", "+y+" "+tms);
return dt;
}
/**
*default out MM-dd
*@param date Date object
*@param format permit:yyyy-MM-dd tt:mm:ss DDD or part of this
**/
pvo.formatDate=function(date,format){
function today(day){
switch(day){
case 0:
day = "Sun";
break;
case 1:
day = "Mon";
break;
case 2:
day = "Tue";
break;
case 3:
day = "Wed";
break;
case 4:
day = "Thu";
break;
case 5:
day = "Fri";
break;
case 6:
day = "Sat";
break;
default:
day = "error";
}
return day;
}
var yLen=0;
for(var i=0;i<format.length;i++){
if(format.charAt(i)=="y")yLen++;
}
var M=true;//month
var d=true;//date
var t=false;//time
var m=false;//minutes
var s=false;//seconds
var D=false;//day
if(format.match("MM")){
M=true;
}else{
M=false;
}
if(format.match("dd")){
d=true;
}else{
d=false;
}
if(format.match("tt")){
t=true;
}else{
t=false;
}
if(format.match("mm")){
m=true;
}else{
m=false;
}
if(format.match("ss")){
s=true;
}else{
s=false;
}
if(format.match("DDD")){
D=true;
}else{
D=false;
}
var ymd="";
var tms="";
var day="";
var sp0="";
var sp1="";
var str="";
if(yLen==4){
ymd=ymd+date.getFullYear();
}
if(yLen==2){
var year=new String(date.getFullYear());
var ss=year.substr(2, 2);
ymd=ymd+ss;
}
if(M){
if(ymd!=""){
ymd=ymd+"-"+(date.getMonth()+1);
}else{
ymd=ymd+(date.getMonth()+1);
}
}
if(d){
if(ymd!=""){
ymd=ymd+"-"+date.getDate();
}else{
ymd=ymd+date.getDate();
}
}
if(t){
tms=tms+date.getHours();
}
if(m){
if(tms!=""){
tms=tms+":"+date.getMinutes();
}else{
tms=tms+date.getMinutes();
}
}
if(s){
if(tms!=""){
tms=tms+":"+date.getSeconds();
}else{
tms=tms+date.getSeconds();
}
}
if(D){
day=today(date.getDay());
}
if(ymd!="")sp0=" ";
if(tms!="")sp1=" ";
str=ymd+sp0+tms+sp1+day;
return str;
}
/**
*解析请求参数 范例
* alert(parseUrl()[0]+"="+parseUrl()[1]);//id=123
*/
function parseUrl(){
var input=window.location.search.substr(1);//id=123
var id=input.split("=");
return id;
}
/**
* get site address
*/
pvo.getSite=function(){
return (document.location.protocol + '//' + document.location.host);
}
/**
*get one form object in iframe
*@param iframeName
*@param formName
*/
pvo.formInIframe=function(iframeName,formName){
var iframeObj=document.getElementById(iframeName);
var n=(iframeObj.contentDocument)?iframeObj.contentDocument.forms[formName]:(iframeObj.contentWindow)?iframeObj.contentWindow.document.forms[formName]:iframeName.document.forms[formName];
return n;
}
/**
*@param n one element of document
**/
pvo.outerHTML=function(n){
var isIe=(document.all)?true:false;
var s="";
if(isIe){
s=n.outerHTML;
}else{
var nn=n.cloneNode(true);
var d = document.createElement("div");
d.appendChild(nn);
s=d.innerHTML;
}
return s;
}
//util end*****************************************************************************************************************************************************************
return pvo;
}
if (typeof pvo == 'undefined') {
var pvo = pvoObject();
}
/**
*默认输出"9月1日"格式
*@param date Date对象
*@param format 允许值:yyyy年MM月dd日 tt时mm分ss秒 星期 或其中部分
**/
pvo.formatDate=function(date,format){
function today(day){
switch(day){
case 0:
day = "星期日";
break;
case 1:
day = "星期一";
break;
case 2:
day = "星期二";
break;
case 3:
day = "星期三";
break;
case 4:
day = "星期四";
break;
case 5:
day = "星期五";
break;
case 6:
day = "星期六";
break;
default:
day = "error";
}
return day;
}
var yLen=0;
for(var i=0;i<format.length;i++){
if(format.charAt(i)=="y")yLen++;
}
var M=true;//月
var d=true;//日
var t=false;//时
var m=false;//分
var s=false;//秒
var D=false;//星期
if(format.match("MM")){
M=true;
}else{
M=false;
}
if(format.match("dd")){
d=true;
}else{
d=false;
}
if(format.match("tt")){
t=true;
}else{
t=false;
}
if(format.match("mm")){
m=true;
}else{
m=false;
}
if(format.match("ss")){
s=true;
}else{
s=false;
}
if(format.match("星期")){
D=true;
}else{
D=false;
}
var ymd="";
var tms="";
var day="";
var sp0="";
var sp1="";
var str="";
if(yLen==4){
ymd=ymd+date.getFullYear()+"年";
}
if(yLen==2){
var year=new String(date.getFullYear());
var ss=year.substr(2, 2);
ymd=ymd+ss+"年";
}
if(M){
ymd=ymd+(date.getMonth()+1)+"月";
}
if(d){
ymd=ymd+date.getDate()+"日";
}
if(t){
tms=tms+date.getHours()+"时";
}
if(m){
tms=tms+date.getMinutes()+"分";
}
if(s){
tms=tms+date.getSeconds()+"秒";
}
if(D){
day=today(date.getDay());
}
if(ymd!="")sp0=" ";
if(tms!="")sp1=" ";
str=ymd+sp0+tms+sp1+day;
return str;
}
附件2:jbxx.jsp
<%--
Document : jbxx.jsp
Created on : 2011-2-20, 23:57:40
Author : hkm
--%>
<%@page contentType="text/javascript" pageEncoding="GBK"%>
<%
//路径、上下文等基本信息
StringBuffer cc = request.getRequestURL();
String ccc = cc.toString();
String xieyi = ccc.substring(0, ccc.indexOf("//") + 2);
String yuming = ccc.substring(ccc.indexOf("//") + 2);
yuming = yuming.substring(0, yuming.indexOf("/"));
yuming = xieyi + yuming;
out.println("pvo.SITE = '" + yuming + "';");
out.println("pvo.ROOTPATH = '" + request.getContextPath() + "';");
String subPath = request.getSession().getServletContext().getInitParameter("subPath");
out.println("pvo.SUBPATH = '" + subPath + "';");
%>
下一篇将介绍List<Map>数组在web客户端的应用