PHP自动补全表单的两种方法

2025-05-27 0 79

效果图:

第一种:从数据库中检索之后补全

PHP自动补全表单的两种方法

第二种:邮箱等纯前端的补全

PHP自动补全表单的两种方法

先说第二种,使用开源的插件,所以相对简单。

github上面的项目 completer。

https://github.com/fengyuanchen/completer做法特别容易,github上面有详细的文档。

一开始尝试用这个来配上自己的后台代码,做成第一种的自动补全,搞了半天失败了。可能本人js太差,改动太多的话,代码很复杂,除非认真研究上面这个开源项目。

主要失败在我在后台数据库找出来的完整的模糊查询得到的数据,用上面的插件只能是补全在后面,没有办法完全替换输入值。比如你输入fafe,查到fafegeg, 但是下拉的表项中只能选到 fafefafegeg,因为是补全

下面说说第一个怎么做,百度不到什么好的经验介绍,就自己按自己的思路实现了:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203
/**

* php 返回模糊搜索的结果给自动完成

*/

public function actioncomplete($value,$blocked) {

//将输入的值与用户名和邮箱进行模糊查询

$result1 = user::find()->where(['blocked'=>$blocked])->andwhere(['type'=>$this->type])->andwhere(['like','username',$value])->all();

$result2 = user::find()->where(['blocked'=>$blocked])->andwhere(['type'=>$this->type])->andwhere(['like','email',$value])->all();

$string = '';

foreach ($result1 as $v) {

$string = $string.$v->username.',';

}

foreach ($result2 as $v) {

$string = $string.''.$v->email.',';

}

$string = $string.'';

//返回格式 类似username1,username2,email1,

return $string ;

}

//前端

<input type="text" id="o" onkeyup="lookup(event,this.value);" placeholder="按用户名和邮箱检索" name="value">

<div class="auto_hidden" id="auto"><!--自动完成 div--></div>

<button type="submit" style="height: 30px;width: 55px" class="btn">检索</button>

//js

<link href="<?= backend_css_url ?>/autocomplete.css" rel="external nofollow" rel="stylesheet" />

<script src="<?= backend_js_url ?>/autocomplete.js"></script>

<script language="javascript">

function lookup(event,inputstring) {

if(inputstring.length != 0) {

var blocked = '0';

var request = new xmlhttprequest();

request.open("get", "<?= pre_backend_url ?>user/complete&value=" + inputstring + "&blocked=" + blocked);

request.send(null);

request.onreadystatechange = function () {

if (request.readystate === 4) {

if (request.status === 200) {

var result = request.responsetext;

ss = result.split(",")

var autocomplete=new autocomplete('o','auto',ss);

autocomplete.start(event,ss);

}

}

}

}

} // lookup

</script>

//autocomplete.css

.auto_hidden {

width:204px;border-top: 1px solid #333;

border-bottom: 1px solid #333;

border-left: 1px solid #333;

border-right: 1px solid #333;

position:absolute;

display:none;

}

.auto_show {

width:204px;

border-top: 1px solid #333;

border-bottom: 1px solid #333;

border-left: 1px solid #333;

border-right: 1px solid #333;

position:absolute;

z-index:9999; /* 设置对象的层叠顺序 */

display:block;

}

.auto_onmouseover{

color:#ffffff;

background-color:highlight;

width:100%;

}

.auto_onmouseout{

color:#000000;

width:100%;

background-color:#ffffff;

}

//autocomplete.js

/*

通用: 自动补全(仿百度搜索框)

*/

var $ = function (id) {

return "string" == typeof id ? document.getelementbyid(id) : id;

}

var bind = function(object, fun) {

return function() {

return fun.apply(object, arguments);

}

}

function autocomplete(obj,autoobj,arr){

this.obj=$(obj); //输入框

this.autoobj=$(autoobj);//div的根节点

this.value_arr=arr; //不要包含重复值

this.index=-1; //当前选中的div的索引

this.search_value=""; //保存当前搜索的字符

}

autocomplete.prototype={

//初始化div的位置

init: function(){

this.autoobj.style.left = this.obj.offsetleft + "px";

this.autoobj.style.top = this.obj.offsettop + this.obj.offsetheight + "px";

this.autoobj.style.width= this.obj.offsetwidth - 2 + "px";//减去边框的长度2px

},

//删除自动完成需要的所有div

deletediv: function(){

while(this.autoobj.haschildnodes()){

this.autoobj.removechild(this.autoobj.firstchild);

}

this.autoobj.classname="auto_hidden";

},

//设置值

setvalue: function(_this){

return function(){

_this.obj.value=this.seq;

_this.autoobj.classname="auto_hidden";

}

},

//模拟鼠标移动至div时,div高亮

autoonmouseover: function(_this,_div_index){

return function(){

_this.index=_div_index;

var length = _this.autoobj.children.length;

for(var j=0;j<length;j++){

if(j!=_this.index ){

_this.autoobj.childnodes[j].classname='auto_onmouseout';

}else{

_this.autoobj.childnodes[j].classname='auto_onmouseover';

}

}

}

},

//更改classname

changeclassname: function(length){

for(var i=0;i<length;i++){

if(i!=this.index ){

this.autoobj.childnodes[i].classname='auto_onmouseout';

}else{

this.autoobj.childnodes[i].classname='auto_onmouseover';

this.obj.value=this.autoobj.childnodes[i].seq;

}

}

}

,

//响应键盘

presskey: function(event){

var length = this.autoobj.children.length;

//光标键"↓"

if(event.keycode==40){

++this.index;

if(this.index>length){

this.index=0;

}else if(this.index==length){

this.obj.value=this.search_value;

}

this.changeclassname(length);

}

//光标键"↑"

else if(event.keycode==38){

this.index--;

if(this.index<-1){

this.index=length - 1;

}else if(this.index==-1){

this.obj.value=this.search_value;

}

this.changeclassname(length);

}

//回车键

else if(event.keycode==13){

this.autoobj.classname="auto_hidden";

this.index=-1;

}else{

this.index=-1;

}

},

//程序入口

start: function(event,result){

if(event.keycode!=13&&event.keycode!=38&&event.keycode!=40){

this.init();

this.deletediv();

this.search_value=this.obj.value;

var valuearr=this.value_arr;

//valuearr.sort();

if(this.obj.value.replace(/(^\\s*)|(\\s*$)/g,'')==""){ return; }//值为空,退出

try{ var reg = new regexp("(" + this.obj.value + ")","i");}

catch (e){ return; }

var div_index=0;//记录创建的div的索引

for(var i=0;i<valuearr.length;i++){

if(reg.test(valuearr[i])){

var div = document.createelement("div");

div.classname="auto_onmouseout";

div.seq=valuearr[i];

div.onclick=this.setvalue(this);

div.onmouseover=this.autoonmouseover(this,div_index);

div.innerhtml= result[i];

console.log();

this.autoobj.appendchild(div);

this.autoobj.classname="auto_show";

div_index++;

}

}

}

this.presskey(event);

window.onresize=bind(this,function(){this.init();});

}

}

//-->

以上所述是小编给大家介绍的php自动补全表单的两种方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对快网idc网站的支持!

原文链接:http://m.blog.csdn.net/article/details?id=52296783&utm_source=tuicool&utm_medium=referral

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 PHP自动补全表单的两种方法 https://www.kuaiidc.com/73379.html

相关文章

发表评论
暂无评论