我玩Ajaxtags(autocomplete)

Posted on 2006-01-17 23:11 JavaXP 阅读(4620) 评论(17)  编辑  收藏 所属分类: 实战经验

昨天下午突然接到公司通知,以前处理的XX物资系统的部门,班组,工程,供应厂商部分都需要修改成Ajaxtags的autocomplete来完成,用户需要输入查询码来进行索引,于是开始动手研究Ajaxtags.
Ajaxtags是基于prototype.js的简化AJAX开发的组件,可以通过标签来来完成以前非常复杂的事情.
通过DOME和原代码的分析,我感觉,他的简化过于局限,没有非常好扩展性,只能做一些简单的处理,比方他的AjaxXmlBuilder的toString()方法可以返回一种简单的XML格式,而且过于简单:

<?xml version="1.0" encoding="UTF-8"?>
<ajax-response>
  
<response>
    
<item>
      
<name>Record 1</name>
      
<value>1</value>
    
</item>
    
<item>
      
<name>Record 2</name>
      
<value>2</value>
    
</item>
    
<item>
      
<name>Record 3</name>
      
<value>3</value>
    
</item>
  
</response>
</ajax-response>

他在autocomplete处理时会用到这中XML文件:
以下是在他的JS中解析XML的部分
     var name = items[i].getElementsByTagName("name")[0].firstChild.nodeValue;
      
var value = items[i].getElementsByTagName("value")[0].firstChild.nodeValue;
由此可以看出他过于简单,如果我有多个属性需要放入自动下拉菜单中怎么办?
好办,我们扩展!
自己造一个AjaxXmlBuilder,继承一下就可以了,把toString()方法重载掉~让他组一个我要的XML文件出来,然后再到页面上自己解吸他`就OK了~
我的类:
package com.kaiwang.mmis.ajax.autoselect;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import org.ajaxtags.helpers.AjaxXmlBuilder;
import org.apache.commons.beanutils.BeanUtils;

/**
 * 重载ajaxxmlbuilder封装出新的xml文件
 * 
@author Gary.lee Jan 16, 2006
 
*/

public class ManufacturerXmlBuilder extends AjaxXmlBuilder implements MisAjaxXmlBuilder  {
    
    
private String encoding = "UTF-8";
    
private List items = new ArrayList();
    
    
public ManufacturerXmlBuilder addItems(Collection collection, String nameProperty, String valueProperty, String seachCodeProperty) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        
for (Iterator iter = collection.iterator(); iter.hasNext();) {
            Object element 
= (Object) iter.next();
            String name 
= BeanUtils.getProperty(element, nameProperty);
            String value 
= BeanUtils.getProperty(element, valueProperty);
            String seachCode 
= BeanUtils.getProperty(element, seachCodeProperty);
            items.add(
new MisAjaxBaseItem(name, value, seachCode));
          }

        
return this;
    }


    
/**
     * 
@see java.lang.Object#toString()
     
*/

    
public String toString() {
      StringBuffer xml 
= new StringBuffer().append("<?xml version=\"1.0\"");
      
if (encoding != null{
        xml.append(
" encoding=\"");
        xml.append(encoding);
        xml.append(
"\"");
      }

      xml.append(
" ?>");

      xml.append(
"<ajax-response>");
      xml.append(
"<response>");
      
for (Iterator iter = items.iterator(); iter.hasNext();) {
       MisAjaxBaseItem item 
= (MisAjaxBaseItem) iter.next();
      xml.append(
"<item>");
      xml.append(
"<name>"); 
      xml.append(
"<![CDATA[");
      xml.append(item.getName());
      xml.append(
"]]>");
      xml.append(
"</name>");
      xml.append(
"<value>");
      xml.append(
"<![CDATA[");
      xml.append(item.getId());
      xml.append(
"]]>");
      xml.append(
"</value>");
      xml.append(
"<searchcode>");
      xml.append(
"<![CDATA[");
      xml.append(item.getSearchCode());
      xml.append(
"]]>");
      xml.append(
"</searchcode>");
        xml.append(
"</item>"); 
      }

      xml.append(
"</response>");
      xml.append(
"</ajax-response>");
      
return xml.toString();
    }

}


这样就有了我要的XML文件格式了~再修改JS
      var name = items[i].getElementsByTagName("name")[0].firstChild.nodeValue;
      
var value = items[i].getElementsByTagName("value")[0].firstChild.nodeValue;
      
      
//新增加一个searchcode部分的解析
      var searchCode = items[i].getElementsByTagName("searchcode")[0].firstChild.nodeValue;
      
      
var li = document.createElement("li");
      
var liIdAttr = document.createAttribute("id");
      li.setAttribute(
"id", value);
      
//将searchcode部分+name输出到文本区域中
      var liText = document.createTextNode(name+'('+searchCode+')');
大家可以看到,我加入了一个searchCode的东西就是在下拉框中把searchCode打印出来!
效果~~~~~~我抓张图出来看看:

样子还可以吧`!
用过autocomplete的朋友应该知道如果仅仅是鼠标点击以后这个框是不会出来了~
因为他默认的事件是"keyup",也就是当有输入的时候才出来.初始化的部分在JS中:
 setOptions: function(options) {
    
this.options = {
      sourceElem: $(options.source),
      targetElem: $(options.target),
      eventType: options.eventType 
? options.eventType : "keyup",
      appendValue: evalBoolean(options.appendValue),
      appendSeparator: options.appendSeparator 
|| " ",
      forceSelection: evalBoolean(options.forceSelection)
    }
.extend(options || {});
而且这里如果换成"force"的话,在下拉框中的上下键和回车就失效了,没关系!解决了!在调用的时候把eventType:"focus"   加上(这个属性官方文档中并没有说~)然后找到:
 attachBehaviors: function(element, event, listener, obj) {
    
if (isArray(element)) {
      
for (var i=0; i<element.length; i++{
        eval(
"element[i].on"+event+" = listener.bindAsEventListener(obj)");
      }

    }
 else {
      eval(
"element.on"+event+" = listener.bindAsEventListener(obj)");
      eval(
"element.onkeyup = listener.bindAsEventListener(obj)");
    }

  }
大家可以看到我在下面又追加了一个“keyup”的属性,这样既在得到焦点的时候可以出来,也可以在用上下建的时候选择,还可以做筛选~还有就是我没有实用标签,我读了它的DOME以后发现它仅仅是封装了JS而已,用了标签以后感觉怪怪的,为什么JS的调用也要用标签封装呢?仅仅是可以在标签中实用EL语法·但是又有多少兄弟会用呢?最主要的是它的标签中好想没有“eventType”这个属性~,看看我的调用:
//班站编号
new AjaxJspTag.Autocomplete("<%=request.getContextPath()%>/autoSelectTeam.do"{
                                            parameters:
"team={team_Name},depId={department_Id}",
                                            progressStyle:
"throbbing",
                                            target:
"team_Id",
                                            className:
"autocomplete",
                                            source:
"team_Name",
                                            forceSelection:
"yes",
                                            eventType:
"focus"            
}
);

要注意的是parameters这里多参数实用了,号隔开,这样到ACTION中就可以用depId接到值了~这个东西在官方文档中也没有说出来,还是同事发现的~!

本人文采不行``大家见谅,希望文章对用ajaxTags的朋友有写帮助,我的原则就是·能改的我都改·只要我能用就可以了!

我再改~前面说了,我修改了AJAX基本的JS文件``但是他的其他属性就不能用了~~~很痛苦,所以晚上突然想到,我专门为他加一个方法就可以了~

//事件触发(修改增加一个keyup事件auto专用)
  attachBehaviorsAuto: function(element, event, listener, obj) {
      eval(
"element.on"+event+" = listener.bindAsEventListener(obj)");
      eval(
"element.onkeyup = listener.bindAsEventListener(obj)");
  }

再改一下`他调用的地方,换成这个方法就好了`噎!

Feedback

# re: 我玩Ajaxtags(autocomplete)  回复  更多评论   

2006-01-20 16:23 by 过客007
好深奥……

# re: 我玩Ajaxtags(autocomplete)  回复  更多评论   

2006-01-21 23:14 by fd
你所说的不用去该都能够实现,只要在页面加上自己定义的js

# re: 我玩Ajaxtags(autocomplete)  回复  更多评论   

2006-08-15 17:44 by 菜鸟!!!
请教楼主
这个解析函数,在那个文件里,希望指点指点
var name = items[i].getElementsByTagName("name")[0].firstChild.nodeValue;
var value = items[i].getElementsByTagName("value")[0].firstChild.nodeValue;

# re: 我玩Ajaxtags(autocomplete)  回复  更多评论   

2007-02-03 18:35 by Janny
很好,道理很易懂,只是实际工作中经常管不住自己。看来需要经常提醒自己。
谢谢!

# re: 我玩Ajaxtags(autocomplete)  回复  更多评论   

2007-04-21 20:59 by der
<a href="http://www.shjp8.com">上海机票</a>,
<a href="http://www.shjp8.com">上海打折机票</a>,
<a href="http://www.dogstoreol.com">Dog Clothes</a> ,
<a href="http://www.chongqing-life.com">chongqing</a>,
<a href="http://www.yantai-life.com">yantai</a>,
<a href="http://blog.hc360.com/ltg110">google左侧排名</a>,
<a href="http://sr321.blog.com.cn">google左侧排名</a>,
<a href="http://blog.5d.cn/user33/sr321">google左侧排名</a>,
<a href="http://sr321.blog.ccidnet.com">google左侧排名</a>,
<a href="http://blog.yesky.com/blog/sr321">google左侧排名</a>,
<a href="http://sr321.blog.soufun.com ">google左侧排名</a>,
<a href="http://googlefff.bokee.com">google左侧排名</a>,
<a href="http://mzyy888.blog.163.com">google排名优化</a>,
<a href="http://blog.zol.com.cn/googleleft">google排名优化</a>,
<a href="http://baidu-google.blog.sohu.com">google排名优化</a>">http://baidu-google.blog.sohu.com">google排名优化</a>,
<a href="http://baidu-google.blog.sohu.com">google排名优化</a>">http://baidu-google.blog.sohu.com">google排名优化</a>,
<a href="http://blog.sina.com.cn/u/1276417342">google排名优化</a>,
<a href="http://mzyy888.blog.china.alibaba.com/">google排名优化</a>,
<a href="http://blog.focus.cn/myblog/20291110.html">google左侧排名</a>,
<a href="http://ltg110.blog.hexun.com/">google排名</a>,
<a href="http://www.sr321.com/">google左侧排名</a>,
<a href="http://www.sr321.net/">google左侧排名</a>,
<a href="http://www.google2007.com/">google左侧排名</a>,

# Pearl Jewelry  回复  更多评论   

2007-06-22 19:46 by asdfdas
asdfadf

# Pearl Jewelry  回复  更多评论   

2007-06-22 19:46 by Pearl Jewelry
adfadsf

# loose bead wholesale  回复  更多评论   

2007-06-22 19:48 by loose bead wholesale
adfadsfads

# wholesale jewellery  回复  更多评论   

2007-06-22 19:48 by wholesale jewellery
adfadsfadsfad

# wholesale bead  回复  更多评论   

2007-06-22 19:49 by wholesale bead
asdfasdf

# wholesale pearls  回复  更多评论   

2007-06-22 19:49 by wholesale pearls
afafasdfasdfasdf

# wholesale pearl  回复  更多评论   

2007-06-22 19:50 by wholesale pearl
adfasdfadsf

# re: 我玩Ajaxtags(autocomplete) www.googleah.cn  回复  更多评论   

2007-08-30 22:00 by www.googleah.cn
专业从事GOOGLE左侧、GOOGLE左侧排名等搜索引擎优化服务,有多年实践经验,价格实惠,有需要的朋友可以登陆http://www.googleah.cn或者来电联系:0571-81562921,以及在线联系QQ:76312063,相信选择我们是你明智的选择。需要做友情链接交换的朋友也可以联系我www.haohome.com www.qjtogo.com www.luan.ah.cn www.21xcn.com

# re: 我玩Ajaxtags(autocomplete) www.googleah.cn  回复  更多评论   

2007-10-30 18:49 by www.googleah.cn
专业从事GOOGLE左侧、GOOGLE左侧排名等搜索引擎优化服务,有多年实践经验,价格实惠,有需要的朋友可以登陆http://www.googleah.cn或者来电联系:0571-81562921,以及在线联系QQ:76312063,相信选择我们是你明智的选择。需要做友情链接交换的朋友也可以联系我www.haohome.com www.qjtogo.com www.luan.ah.cn www.21xcn.com

# re: 我玩Ajaxtags(autocomplete)  回复  更多评论   

2008-02-23 14:17 by runescape money
eeee

# re: 我玩Ajaxtags(autocomplete)  回复  更多评论   

2008-02-23 14:17 by runescape gold
wwww

# 求助[未登录]  回复  更多评论   

2008-07-15 10:10 by 冰川
你好,我也在改Ajaxtags(autocomplete),想请求你的帮助,问题如下:

我的页面需要自动完成的部分,一个(inputA)在页面顶部,一个(inputB)在页面底部,A肯定是没问题了,但B就不行,自动完成的部分看不到了,所以想修改代码,让A朝下,而B朝上。

在那几个js文件中,哪部分是控制它们的位置的?

乐意帮助的话,请致信:yanlei_bctn@qq.com

只有注册用户登录后才能发表评论。


网站导航:
 

posts - 19, comments - 31, trackbacks - 0, articles - 2

Copyright © JavaXP