文本框+层模拟下拉框,并实现输入自动提示和过滤

前端单选框、单选按钮、下拉列表多条件过滤数据 1、效果图 2、页面渲染及控制代码 选课情况: 全科 化学-生物-地理-政治 化学-生物-历史-地理 化学-生物-历史-政治 物理-地理-政治 物理-化学-生物-地理 物理 阅读详情

采用xml,xsl,js,xmldom编写.兼容ie和firefox浏览器.

效果如以下网址:

http://www.vcsale.com/cheap.Final_Fantasy_XI.3.aspx

 

1.首先,一个简单的js类.

function  inputSelection()
{
    
/*fcuandy 2007-11-22*/    

    
var txtObj      = null;  //输入框 input text
    var selObj      = null;  //模拟下拉列表的层 the div which used for option items container
    var xd          = null;  //数据据源. xmldom对象 xmldom data source
    var pstIdObj    = null;  //下拉后,将id也即option.value存放的位置 
    var pstNameObj  = null;  //下拉后,将name也即option.outertext存放的位置.这两个主要用于表单提交的参数,可用input type=hidden
    var selXPath    = null;  //针对xmldom进行查询的路径 xpath string
    var selAttributeName = null;  //输入框中的值与哪个属性值,或节点值进行匹配比较  compare attribute name
    var callMethod = null; //点击模拟下拉列表层中的某个项后,数据进行了处理之后,是否再调用其它页面js方法. 可为空
    var idIndex = 0;  //设置,pstIdObj的值取node的第0个属性 
    var txtIndex = 1; //设置,pstNameObj的值取node的第1个属性


    
//清空select div
    this.clearSEL=function()
    
{
        
this.selObj.innerHTML = "";
        
this.pstIdObj.value = "";
        
this.pstNameObj.value = "";
    }



    
//根跟用户输入值重建select div 里的选项
    this.reBuildSEL=function()
    
{
   
        
var s = this.txtObj.value.toLowerCase();
        
var outHTML = "";

        
if(ie4)
        
{this.xd.setProperty("SelectionLanguage","XPath");}
    
    
        
//text input .value is null, then list all servers
        if(s.length==0)
        
{
            
var root=this.xd.selectNodes(this.selXPath);

        }

        
else
        
{
            
var root=this.xd.selectNodes(this.selXPath + "[starts-with(translate(@" + this.selAttributeName + ",'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ'),'" + s.toUpperCase()  + "')]");

        }

        
        
//no server available,then list all servers
        /*if(root.length==0)
        {
            root=this.xd.selectNodes("//server");
            var root=this.xd.selectNodes(this.selXPath);
        }
*/


        
if(ie4)
        
{
            
for(var i=0;i<root.length;i++)
            
{
                
                outHTML 
+= "<a href='#'><div style='cursor:hand;width:182;text-decoration:none;color:#333;' onmouseover='this.style.backgroundColor="#98CDCD"' onmouseout='this.style.backgroundColor=""' id="li_" + root(i).attributes(this.idIndex).value + "" onclick='javascript:document.getElementById("" + this.txtObj.id + "").value=this.innerText;document.getElementById("" + this.pstIdObj.id + "").value=this.id.substring(this.id.indexOf("_")+1,this.id.length);document.getElementById("" + this.pstNameObj.id + "").value=this.innerText;document.getElementById("" + this.selObj.id + "").style.display="none";" + (this.callMethod == null ? "" : this.callMethod + ";") + "'>" + root(i).attributes(1).value + "</div></a>";
            }

        }

        
else
        
{
            
for(var i=0;i<root.length;i++)
            
{
                
                outHTML 
+= "<a href='javascript:void(0)'><div style='height:20px;width:182px;text-decoration:none;color:#333;' onmouseover='this.style.backgroundColor="#98CDCD"' onmouseout='this.style.backgroundColor=""' id="li_" + root[i].attributes[this.idIndex].value + "" onclick='document.getElementById("" + this.txtObj.id + "").value=this.textContent;document.getElementById("" + this.pstIdObj.id + "").value=this.id.substring(this.id.indexOf("_")+1,this.id.length);document.getElementById("" + this.pstNameObj.id + "").value=this.textContent;document.getElementById("" + this.selObj.id + "").style.display="none";" + (this.callMethod == null ? "" : this.callMethod + ";") + "'>" + root[i].attributes[this.txtIndex].value + "</div></a>";
                
            }

        }

        
//alert(this.callMethod);
        if(outHTML == "")
        
{
            outHTML 
= "<br/>";
        }

        i
= i==0 ? 1 : i;
        
this.selObj.innerHTML = outHTML;
    
    
//当对outHTML中写的onclick事件中的代码有一些特列操作时,比如创建新对象,或是给创建新事件等等,总之创建新的html element的话,采用inserAdjacentHTML方法替换innerHTML.
        //this.selObj.insertAdjacentHTML("afterBegin",outHTML);
        this.selObj.style.position="absolute";
        
this.selObj.style.height = 20 * i > 200 ? 200 : 20 * i;
        
this.selObj.style.display = "";
    }

    

}

 调用说明:

a.首先您可以先通过服务器端脚本输出获得xmldocument供 inputSelection使用.

比如使用asp.net,asp,或php

也可以使用xmlhttp或xmldom直接获取数据提供页输出的xml(或字串并自己转换为xml)

本来这步操作,我可以加在 inputSelection 类里的,但是我的页面是由服务器在xslt输出html时生成的xml串,所以将获提xmldomcumnet的过程分离出来了.

 

           var  ns4  =  (document.layers)  ?   true  :  false ;
          
var  ie4  =  (document.all)  ?   true  :  false ;
          
var  ServerStr = " <xsl:text disable-output-escaping= " yes " ><![CDATA[<]]></xsl:text>root<xsl:text disable-output-escaping= " yes " ><![CDATA[>]]></xsl:text> " ;
          
< xsl: for - each select = " //CurrentGame/Server " >
        ServerStr 
+=   " <xsl:text disable-output-escaping= " yes " ><![CDATA[<]]></xsl:text>Server id="<xsl:value-of select= " . / @ServerID " />" name="<xsl:value-of select= " . / @Name " />" /<xsl:text disable-output-escaping= " yes " ><![CDATA[>]]></xsl:text> " ;
          
</ xsl: for - each >
          ServerStr 
+=   " <xsl:text disable-output-escaping= " yes " ><![CDATA[<]]></xsl:text>/root<xsl:text disable-output-escaping= " yes " ><![CDATA[>]]></xsl:text> " ;


          
if (ie4)
          
{
         
var xmlDoc = new ActiveXObject("Msxml2.DOMDocument");
              xmlDoc.async 
= false;
          xmlDoc.loadXML(ServerStr);

          }

          
else
          
{



              Node.prototype.selectNodes
=function(xPath)
          
{
              
var xresult=this.evaluate(xPath,this,null,XPathResult.ORDERED_NODE_ITERATOR_TYPE,null);
              
var nod=null,nods=[],k=0;
              
while((nod=xresult.iterateNext())!=null)
                  
{
                      nods[k
++]=nod;
                  }

                  
return nods;
              }


          XMLDocument.prototype.loadXML 
= function(xmlString)
              
{
              
var childNodes = this.childNodes;
              
for (var i = childNodes.length - 1; i <xsl:text disable-output-escaping="yes"><![CDATA[>]]></xsl:text>= 0; i--)
                  
this.removeChild(childNodes[i]);

                  
var dp = new DOMParser();
                  
var newDOM = dp.parseFromString(xmlString, "text/xml");
                  
var newElt = this.importNode(newDOM.documentElement, true);
                  
this.appendChild(newElt);
              }
;

          
var xmlDoc=document.implementation.createDocument('','',null);
              xmlDoc.async
=0;

          xmlDoc.loadXML(ServerStr);

          }

 

b,接下来,页面上按位置摆放您的html element.

 

< input  type ="hidden"  id ="ServerID"  value =""  onchange ="alert('tst');"   />
              
< input  type ="hidden"  id ="ServerName"   />
              
< div  class ="div2" >
                
< span  style =" margin:2px 0 0 15px" >
                  
< table  border ="0"  width ="100%"  id ="tabContainer"  cellspacing ="0"  cellpadding ="0" >
                    
< tr >
                      
< td  rowspan ="2"  valign ="top" >
                      Select Your Server To Buy Final Fantasy XI
&nbsp; Gil </ td >
                      
< td  width ="200" >
                        
< input  id ="tFirstC"  class ="inp2"  maxlength ="20"  style ="cursor:default;"  size ="20"  onclick ="removeAll()"  onkeyup ="removeAll()"   />
                      
</ td >
                    
</ tr >
                    
< tr >
                      
< td >
                        
< div  id ="divContainer"  style ="overflow-x:hidden;overflow-y:auto;text-align:left;line-height:150%;width:180px;height:200px;font-weight:0;font-size: 12px;color:#333333;margin: 0px;padding: 4px;z-index: 1; border-left:1px solid #336699;border-bottom:1px solid #336699;border-right:1px solid #336699;border-top:1px solid #336699;background-color: white;display:none;"   />
                      
</ td >
                    
</ tr >
                  
</ table >
                
</ span >
              
</ div >

 

c. 在上一步看到, input onkeyup时触发了removeAll方法. 实际是清除模拟select option的div.并且重新动态加载.

这与ajax有区别, 因为所需数据在页面加载时已全加载到string里,或者说又加载到了xmldom里.不需要再次到服务器端请求.

在removeAll方法里, 实例化 inputSelection,并进行初始化和进行清除及option item重建.

 

           function  removeAll()
          
{

          
var sel = new inputSelection();
          sel.txtObj 
= document.getElementById("tFirstC");
          sel.selObj 
= document.getElementById("divContainer");
          sel.xd     
= xmlDoc;
          sel.selXPath 
= "//Server";
          sel.selAttributeName 
= "name";

          sel.pstIdObj 
= document.getElementById("ServerID");
          sel.pstNameObj 
= document.getElementById("ServerName");

          sel.idIndex 
= 0;
          sel.txtIndex 
= 1;

          sel.callMethod 
= "goURL()";
          sel.clearSEL();
          sel.reBuildSEL();

          }

 

d,最后一步,当页面点击其它位置时,隐藏div

 <body onclick="hideSelection(event)">

          function hideSelection(e)
          {
          var objx=document.getElementById("divContainer");
          var cobj=document.getElementById("tFirstC");
         
          var eobj= e.srcElement ? e.srcElement : e.target;
          if(eobj.id != cobj.id)
              objx.style.display="none";
          }

 

这个东西到现在用起来,还不是很方便,即移植麻烦了一点,等有空时,我把xml数据获取的部分也一起写到inputSelection里.

欢迎进行改进.和提出bug.谢谢.

Layui表单进阶:手把手教你实现带搜索功能的下拉框(附完整代码) 本文详细讲解了如何在Layui框架中实现一个功能完备的带搜索功能的下拉框。通过组合使用input和select元素,结合CSS定位与JavaScript动态过滤,提供了从静态布局、交互逻辑到远程搜索的完整代码方案,有效解决了传统下拉框在海量选项下的用户体验问题,并可与Layui表单验证无缝集成。 阅读详情

相关推荐

fiddler如何filter_Fiddler抓包使用教程-过滤

Fiddler抓包可以完成我们移动开发者的调试测试需求。但是多余的网页请求和手机的其他链接影响我们手机开发的需求。所以我们需要排除其他无用的包,只关注我们指定的域名的请求包。如下图,先整体看看1、 打开fiddler,找到Filters选项并点击打开。如图所示默认情况下,这个页面是灰色的,代表默认不过滤任何请求。现在我们勾选 Use Filters 。2、Actions当所有的配置完成了,点击 R...

weixin_39893274的博客 1037

可输入可选择的下拉框(input select)并且输入框获得下拉的内容

1、JSP代码                   请选择.... 11 22 33 2、JS方法 function setRuleContent(){        var selectValue = $('#_select option:selected').text();//选中select的内容        //alert("select

汪缓的博客 3万+

接口自动化初步实践(一)之fiddler抓包

接口自动化初步实践(一)之fiddler抓包前言一、设置过滤?二、设置代理三、初次尝试抓包总结 前言 “ 熟练使用抓包工具,对于接口测试初期的接口分析来说很重要,也能快速梳理出清晰的接口内容” 一、设置过滤? 首先,Fiddler作为抓包工具能在你的设备上抓取各种的访问数据,我们需要定向的过滤掉我们不需要的接口项目,只留下我们项目内的数据 如图:首先在fiddler中将底部的过滤选择为 “Non-Browser”过滤掉来自浏览器的数据 其次,在Filters页签中,勾选“Use Filters”—选择下

qq_41453554的博客 308

可输入和过滤的下拉框

<input list="testList"> <datalist id="testList"> <option value="op1">op1</option> <option value="op2">op2</option> <option value="op3">op3</option> </datalist>

q956095638的博客 375

QT 搜索下拉框

下拉界面展示模糊查询项目效果思路代码主界面ui界面头文件源文件下拉界面ui界面头文件源文件谢谢~~~ 效果 思路 输入栏使用linEdit ,获取焦点,展示下拉界面,界面显示当前栏位内内容的模糊查询信息;失去焦点或点击界面其他位置,下拉界面小时。 下拉界面使用QWidget,根据lineEdit的内容展示对应的信息 代码 主界面 ui界面 一个输入栏 ,剩下的是模拟查询结果展示栏位 头文件 virtual void showEvent(QShowEvent *event); vi

光顶术士的博客 1801

输入框下拉提示的设计与实现

下拉提示(通常指自动完成或建议功能)是一种输入辅助机制。当用户开始在输入框中键入文字时,它会根据输入内容给出一系列匹配的选项供用户选择。这不仅加快了输入速度,还减少了用户因手动输入而产生的错误。在深入探讨如何实现下拉提示之前,理解其基础概念至关重要。它是提升用户界面交互性和效率的关键技术之一。在后续章节中,我们将详细探讨不同的实现方式,包括原生JavaScript、jQuery插件以及前端框架中的实现,以及如何处理静态与动态数据源,并进一步优化用户体验和性能。

weixin_42097508的博客 549

bootstrap实现输入框组带可选择的下拉框

原本的代码可见菜鸟教程 https://www.runoob.com/bootstrap/bootstrap-input-groups.html bootstrap示例可以实现输入框组和带有下拉菜单的按钮 <div class="input-group"> <input type="text" class="form-control"> <div class="input-group-btn"> <button type="button" cl

光明小学王小雨的博客 6872

JS实现点击下拉菜单把选择的内容同步到input输入框内的实例

下面小编就为大家分享一篇JS实现点击下拉菜单把选择的内容同步到input输入框内的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

带下拉框的input文本(两种实现方式)

第一种 为了样式好看一些我是搭配的bootstarp使用的,如何不使用bootstarp去掉class="form-control" 和class="form-group col-lg-3"属性 <div class="form-group col-lg-3"> <input type="text" id="input" style="position:absol...

祁_z 1万+

js下拉选择框与输入框联动实现添加选中值到输入框的方法

主要介绍了js下拉选择框与输入框联动实现添加选中值到输入框的方法,涉及javascript中onchange事件及页面元素遍历的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下

传输线的特征阻抗

信号源内阻与所接传输线的特性阻抗大小相等且相位相同,或传输线的特性阻抗与所接负载阻抗的大小相等且相位相同,分别称为传输线的输入端或输出端处于阻抗匹配状态,简称为阻抗匹配。否则,便称为阻抗失配。有时也直接叫做匹配或失配。指一个电路输入端的等效阻抗。在输入端上加上一个电压源U,测量输入端的电流I,则输入阻抗Rin就是U/I。可以把输入端想象成一个电阻的两端,这个电阻的阻值,就是输入阻抗。- 对于电压驱动的电路,输入阻抗越大,则对电压源的负载就越轻,因而就越容易驱动,也不会对信号源有影响;

学海无涯的专栏 4464

下拉框输入检索

select可以直观的展示多个选项供用户选择,可当选项过多时,在成百上千个记录中找到自己需要的内容就很考验人的视力了。 如果能根据输入的内容检索出需要的项,无疑能大大减少查找范围。 select本身不提供输入功能,只能通过样式模拟下拉框,废话不多说:

u014388814的专栏 1290

Visual Studio报错TRK0005找不到CL.exe?三步彻底解决环境变量问题

本文详细解析了Visual Studio报错TRK0005找不到CL.exe的根本原因,并提供了三步彻底解决环境变量问题的方案。从验证安装完整性到配置永久环境变量,再到注册表级修复,帮助开发者建立健壮的开发环境配置体系,确保编译链稳定运行。

weixin_30839881的博客 459

影刀RPA实操指南_复杂表单自动化填写从下拉框到文件上传的全场景实战

本文是影刀RPA表单自动化填写的实战指南,针对不同表单控件提供针对性解决方案。文章涵盖了普通文本框、下拉框(原生/自定义/可搜索)、日期选择器、文件上传、复选框/单选框等常见控件的处理技巧,特别强调了动态表单的等待机制和提交前的验证步骤。通过电商后台商品上架的完整案例,详细演示了复杂表单的自动化流程。核心要点包括操作前状态确认、动态加载等待、文件拖拽上传优先、JS绕过日期组件等实用技巧,帮助RPA开发者解决90%的表单自动化难题。

聪明的你,肯定能在地球上另一个位置找到我!RPA自动化流程机器人定制,代做,问题咨询! 282

VS Code ESP-IDF无法找到源文件、头文件波浪线解决

背景:想要编译小智AI项目,可以正常编译。但是一些头文件,例如#include <nvs.h>等无法找到。

Hot_Ant的博客 1490

EAAI title-page-template 怎么填写: 期刊投稿作者信息填写指南

本文详细介绍了期刊投稿时作者信息填写的规范要求。主要内容包括:1)核心填写原则(信息一致性、标注清晰性、通讯作者唯一性);2)具体填写方法演示(作者姓名、单位/机构、通讯作者);3)常见错误规避指南(如单位上标错误、邮箱无效等);4)提供可直接套用的规范模板。特别强调作者姓名拼写、单位标注、通讯作者指定等关键细节,并以深圳大学和同济大学研究团队为例进行说明,帮助投稿者避免因格式问题被退回修改。

ZhangJiqun&191cm&85kg 1086

带输入框的选择框实现

闲来无事,用jquery模拟了一个下拉框,可以通过输入框对下拉列表进行过滤. 原理: 1.下拉框由div和文本框组成, 2.点击下拉框弹出下拉列表 3.向文本框输入值时对下拉框进行过滤 4.选择值后将值回显到输入框 依赖: jquery 1.7 jquery-ui 1.8 实现见附件,已经在IE8下测试....

lic0112的专栏 564

点云目标检测:open3d多窗口联动可视化

多个模型之间的对比除了指标之外,还需要可以直接直观的对比可视化结果,这次介绍一下如何使用open3d同时打开两个窗口分别加载两个模型的结果进行对比,同时实现两个窗口的联动,也就是当一个窗口拖动或者缩放时另外一个窗口也跟着做同样的变换。

zhaoguanhua的博客 4688

在网页子文本框模拟特定的鼠标滚轮_Web网页测试用例还不会?那是因为你还没看这篇爆肝干货...

今天牛鹭学院给大家奉上一篇深度好文、软件测试干货,看完学完的你一定会收获满满!Web测试中,各类web控件测试点总结界面检查进入一个页面测试,首先是检查title、页面排版、字段等,而不是马上进入文本框校验。页面名称title是否正确当前位置是否可见 您的位置:xxx>xxxx文字格式统一性排版是否整齐列表项显示字段是否齐全,列表项字段名称是否跟表单统一同一页面,是否出现 字段名称相同、值取...

weixin_39522408的博客 480

我用 GPT-5.5 十分钟搞定一篇文献综述!附全流程指南

每一个框架中提出的逻辑链接,都必须至少有一篇提供文本中的文献作为支撑、严格禁止虚构变量、逻辑关系或研究结果、如果某些变量或关系在文本中未提及,必须明确声明“在提供的文本中未找到相关信息”、引用格式必须严格遵循原文提供的“作者/年份”格式,例如:[Smith, 2022]。各位同仁好,我是七哥。扫描提供的文献摘要,识别存在冲突的结果或理论、分析这些文献之间的差异,并总结可能导致差异的原因、输出一个结构化的学术争论段落,清楚呈现文献间的分歧和潜在影响因素、对于缺失或不明确的信息,按约束条件如实标注。

智能AI让学术科研更容易 370

YOLO26优化:AAAI2026 | 融合PartialNet Block的C3k2-YOLO高效目标检测网络 | 轻量化涨点设计

PartialNet Block 结合YOLO26的C3k2模块,进行二次创新。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 592

Fiddler过滤后抓包教程

Fiddler抓包可以完成我们移动开发者的调试测试需求。但是多余的网页请求和手机的其他链接影响我们手机开发的需求。所以我们需要排除其他无用的包,只关注我们指定的域名的请求包。 如下图,先整体看看: 1、 打开fiddler,找到Filters选项并点击打开。 如图所示: 默认情况下,这个页面是灰色的,代表默认不过滤任何请求。现在我们勾选 Use Filters 。 2、Actions 当所有的配置完成了,点击 Run Filterset now 就可以立即生效了。同时我们可以维护多套filters,在

Acheng123的博客 3541

52-Halcon-- smooth_object_model_3d函数功能(滑处理3D对象模型)

Halcon中smooth_object_model_3d算子详解 该算子用于3D模型平滑处理,提供三种算法:'laplacian'(快速去噪)、'taubin'(高质量防收缩)和'low_pass'(频域滤波)。核心参数包括迭代次数(默认5)、平滑强度(0-1)和边缘保护选项。典型应用包括扫描数据去噪、CAD模型光顺和逆向工程优化。支持自适应平滑、结合模型简化等高级技巧,并可通过分块处理优化大型模型性能。参数组合需根据具体场景选择,如快速去噪推荐拉普拉斯方法(5次迭代,强度0.3),特征保持推荐低通滤波(

weixin_45590420的博客 873

Fiddler抓包使用教程-过滤

Fiddler抓包使用教程-过滤 转载请标明出处:http://blog.youkuaiyun.com/zhaoyanjun6/article/details/72929800 本文出自【赵彦军的博客】 Fiddler抓包可以完成我们移动开发者的调试测试需求。但是多余的网页请求和手机的其他链接影响我们手机开发的需求。所以我们需要...

weixin_34026484的博客 1192

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: SQL语句将学生升降级.
下一篇: 今天干了件力活,手工写语句来完成数据库同步.
fcuandy
博客等级 码龄23年 780粉丝 32原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值