微博@符号的用户名提示效果。(想@到谁?)_javascript技巧
在下面的文本框输入“@” 看一下效果吧!
已经解决 IE,FF ,CHORME 主流浏览器的兼容问题。有需要这个JS的朋友可以直接拿去用。
由于我实在无法把这个效果插入到这遍文章里。所以只能让大家下载我演示的文件了。
下载演示文件
思路
首先你是针对网页里面的textarea(这是一个很麻烦的标签) 这个标签的一些操作。
所以关于他的一些API你必须收集到。(下面会有提供)
A:是一个textarea
B:当前光标位置
我们的方案是 首先在页面创建一个(C)具有 visibility:hidden;(占位但是不显示) 属性的DIV。
他的位置,宽度,高度与A文本框一样(这意味着C现在与A已经重叠了)。
然后我们获取到B位置前面的所有文本(可以用js获取到),写入C 里面,在追加一个;
那么ID为FFF 的span标签的位置就是 B的位置。
HTML页面会多了一些这样的标签
可以获取到@符号的位置,其他问题都只是调试的问题了,就不多说了。你可以直接下载源码
textarea 的一些操作
/*
* TT textarea 操作函数
* info(t) 基本信息
* getCursorPosition(t) 光标位置
* setCursorPosition(t, p) 设置光标位置
* add(t,txt) 添加内容到光标处
*/
var TT = {
info:function(t){
var o = t.getBoundingClientRect();
var w = t.offsetWidth;
var h = t.offsetHeight;
return {top:o.top, left:o.left, width:w, height:h};
},
getCursorPosition: function(t){
if (document.selection) {
t.focus();
var ds = document.selection;
var range = null;
range = ds.createRange();
var stored_range = range.duplicate();
stored_range.moveToElementText(t);
stored_range.setEndPoint("EndToEnd", range);
t.selectionStart = stored_range.text.length - range.text.length;
t.selectionEnd = t.selectionStart + range.text.length;
return t.selectionStart;
} else return t.selectionStart
},
setCursorPosition:function(t, p){
var n = p == 'end' ? t.value.length : p;
if(document.selection){
var range = t.createTextRange();
range.moveEnd('character', -t.value.length);
range.moveEnd('character', n);
range.moveStart('character', n);
range.select();
}else{
t.setSelectionRange(n,n);
t.focus();
}
},
add:function (t, txt){
var val = t.value;
var wrap = wrap || '' ;
if(document.selection){
document.selection.createRange().text = txt;
} else {
var cp = t.selectionStart;
var ubbLength = t.value.length;
t.value = t.value.slice(0,t.selectionStart) + txt + t.value.slice(t.selectionStart, ubbLength);
this.setCursorPosition(t, cp + txt.length);
};
},
del:function(t, n){
var p = this.getCursorPosition(t);
var s = t.scrollTop;
t.value = t.value.slice(0,p - n) + t.value.slice(p);
this.setCursorPosition(t ,p - n);
D.FF && setTimeout(function(){t.scrollTop = s},10);
}
}
主要的一些JS
var AutoTips = function(A){
var elem = A.id ? D.$(A.id) : A.elem;
var checkLength = 5;
var _this = {};
var key = '';
_this.start = function(){
if(!D.$(config.boxID)){
var h = html.slice();
var info = TT.info(elem);
var div = D.DC('DIV');
var bs = D.BS();
h = h.replace('$top$',(info.top + bs.top)).
replace('$left$',(info.left + bs.left)).
replace('$width$',info.width).
replace('$height$',info.height).
replace('$SCTOP$','0');
div.innerHTML = h;
document.body.appendChild(div);
}else{
_this.updatePosstion();
}
}
_this.keyupFn = function(e){
var e = e || window.event;
var code = e.keyCode;
if(code == 38 || code == 40 || code == 13) {
if(code==13 && D.$(config.wrap).style.display != 'none'){
_this.enter();
}
return false;
}
var cp = TT.getCursorPosition(elem);
if(!cp) return _this.hide();
var valuep = elem.value.slice(0, cp);
var val = valuep.slice(-checkLength);
var chars = val.match(/(\w+)?@(\w+)$|@$/);
if(chars == null) return _this.hide();
var char = chars[2] ? chars[2] : '';
D.$(config.valuepWrap).innerHTML = valuep.slice(0,valuep.length - char.length).replace(/\n/g,'
').
replace(/\s/g,' ') + config.positionHTML;
_this.showList(char);
}
_this.showList = function(char){
key = char;
var data = DS.inquiry(friendsData, char, 5);
var html = listHTML.slice();
var h = '';
var len = data.length;
if(len == 0){_this.hide();return;}
var reg = new RegExp(char);
var em = ''+ char +'';
for(var i=0; i
h += html.replace(/\$ACCOUNT\$|\$NAME\$/g,data[i]['name']).
replace('$SACCOUNT$',hm).replace('$ID$',data[i]['user']);
}
_this.updatePosstion();
var p = D.$(config.position).getBoundingClientRect();
var bs = D.BS();
var d = D.$(config.wrap).style;
d.top = p.top + 20 + bs.top + 'px';
d.left = p.left - 5 + 'px';
D.$(config.listWrap).innerHTML = h;
_this.show();
}
_this.KeyDown = function(e){
var e = e || window.event;
var code = e.keyCode;
if(code == 38 || code == 40 || code == 13){
return selectList.selectIndex(code);
}
return true;
}
_this.updatePosstion = function(){
var p = TT.info(elem);
var bs = D.BS();
var d = D.$(config.boxID).style;
d.top = p.top + bs.top +'px';
d.left = p.left + bs.left + 'px';
d.width = p.width+'px';
d.height = p.height+'px';
D.$(config.boxID).scrollTop = elem.scrollTop;
}
_this.show = function(){
selectList.list = D.$(config.listWrap).getElementsByTagName('li');
selectList.index = -1;
selectList._this = _this;
_this.cursorSelect(selectList.list);
elem.onkeydown = _this.KeyDown;
D.$(config.wrap).style.display = 'block';
}
_this.cursorSelect = function(list){
for(var i=0; i
return function(){selectList.setSelected(i)};
})(i);
list[i].onclick = _this.enter;
}
}
_this.hide = function(){
selectList.list = null;
selectList.index = -1;
selectList._this = null;
D.ER(elem, 'keydown', _this.KeyDown);
D.$(config.wrap).style.display = 'none';
}
_this.bind = function(){
elem.onkeyup = _this.keyupFn;
elem.onclick = _this.keyupFn;
elem.onblur = function(){setTimeout(_this.hide, 100)}
//elem.onkeyup= fn;
//D.EA(elem, 'keyup', _this.keyupFn, false)
//D.EA(elem, 'keyup', fn, false)
//D.EA(elem, 'click', _this.keyupFn, false);
//D.EA(elem, 'blur', function(){setTimeout(_this.hide, 100)}, false);
}
_this.enter = function(){
TT.del(elem, key.length, key);
TT.add(elem, selectList.list[selectList.index].getElementsByTagName('A')[0].rel+' ');
_this.hide();
return false;
}
return _this;
}
作者:idche

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Que dois-je faire si Google Chrome indique que le contenu de cet onglet est partagé ? Lorsque nous utilisons Google Chrome pour ouvrir un nouvel onglet, nous rencontrons parfois une invite indiquant que le contenu de cet onglet est partagé. Alors, que se passe-t-il ? Laissez ce site fournir aux utilisateurs une introduction détaillée au problème de Google Chrome, invitant à partager le contenu de cet onglet. Google Chrome indique que le contenu de cet onglet est en cours de partage. Solution : 1. Ouvrez Google Chrome. Vous pouvez voir trois points dans le coin supérieur droit du navigateur « Personnaliser et contrôler Google Chrome ». l'icône. 2. Après avoir cliqué, la fenêtre de menu de Google Chrome apparaîtra ci-dessous et la souris se déplacera vers « Plus d'outils ».

Lorsque vous utilisez le système Win11, vous rencontrerez parfois une invite vous demandant de saisir le nom d'utilisateur et le mot de passe de l'administrateur. Cet article explique comment gérer cette situation. Méthode 1 : 1. Cliquez sur [Logo Windows], puis appuyez sur [Maj+Redémarrer] pour passer en mode sans échec ou entrez en mode sans échec de cette façon : cliquez sur le menu Démarrer et sélectionnez Paramètres ; Sélectionnez « Mise à jour et sécurité » ; sélectionnez « Redémarrer maintenant » dans « Récupération » après avoir redémarré et saisi les options, sélectionnez - Dépannage - Options avancées - Paramètres de démarrage -&mdash.

Au début des médias sociaux, vous pouviez changer votre nom de profil plusieurs fois, mais maintenant, changer de nom sur n'importe quelle application de médias sociaux s'accompagne de son propre ensemble de restrictions. Si vous souhaitez modifier votre nom d'affichage ou votre nom d'utilisateur sur Instagram, la publication ci-dessous vous expliquera à quelle fréquence vous pouvez les modifier, comment le faire et ce que vous pouvez faire lorsque vous ne pouvez pas changer votre nom sur la plateforme. Comment changer le nom d’affichage et le nom d’utilisateur sur Instagram ? Instagram propose deux emplacements pour votre nom : votre nom d'affichage et votre nom d'utilisateur, et heureusement, vous pouvez facilement modifier les deux dans l'application mobile. Le nom d'affichage est celui que vous entreriez normalement vrai

OOBE ou expérience prête à l'emploi est un processus conçu pour que les utilisateurs les guident à travers les différentes étapes des étapes post-installation. Cela inclut les pages de droits et d’accords, les pages de connexion, les options de connexion WiFi ou réseau, etc. Si vous rencontrez des problèmes OOBEKeyboard, OOBELOCAL ou OOBEREGION, vous ne pourrez pas passer aux étapes d'installation finales. Ne t'inquiète pas. Il existe quelques correctifs simples que vous pouvez utiliser pour résoudre ce problème. Solutions de contournement - Avant de faire quoi que ce soit d'autre, essayez ces solutions normales - 1. Lorsque vous recevez une invite d'erreur, continuez et cliquez sur l'invite « Réessayer ». Continuez à essayer au moins 7 à 8 fois supplémentaires. 2. Vérifiez la connectivité réseau. Si vous utilisez une connexion Ethernet ou Wi-Fi

De nos jours, de nombreux utilisateurs Windows qui aiment les jeux ont accédé au client Steam et peuvent rechercher, télécharger et jouer à n'importe quel bon jeu. Cependant, de nombreux profils d'utilisateurs peuvent porter exactement le même nom, ce qui rend difficile la recherche d'un profil ou même la liaison d'un profil Steam à d'autres comptes tiers ou la participation à des forums Steam pour partager du contenu. Le profil se voit attribuer un identifiant unique à 17 chiffres, qui reste le même et ne peut être modifié à aucun moment par l'utilisateur, contrairement au nom d'utilisateur ou à l'URL personnalisée. Quoi qu'il en soit, certains utilisateurs ne connaissent pas leur Steamid, et il est important de le savoir. Si vous ne savez pas comment retrouver le Steamid de votre compte, pas de panique. Dans cet article

Dans iOS 17, Apple a remanié toute sa sélection de sonneries et de tonalités de texte, offrant plus de 20 nouveaux sons pouvant être utilisés pour les appels, les messages texte, les alarmes et bien plus encore. Voici comment les voir. De nombreuses nouvelles sonneries sont plus longues et semblent plus modernes que les anciennes sonneries. Ils incluent arpège, brisé, canopée, cabine, gazouillis, aube, départ, dolop, voyage, bouilloire, mercure, galaxie, quad, radial, charognard, semis, abri, saupoudrage, marches, heure du conte, taquiner, inclinaison, déplier et vallée. La réflexion reste l'option de sonnerie par défaut. Plus de 10 nouvelles tonalités de texte sont également disponibles pour les messages texte entrants, les messages vocaux, les alertes de courrier entrant, les alertes de rappel, etc. Pour accéder à de nouvelles sonneries et tonalités de texte, assurez-vous d'abord que votre iPhone

Comment remplir le nom d'utilisateur de Railway 12306 ? Vous pouvez remplir le nom d'utilisateur dans l'application Railway 12306, mais la plupart des amis ne savent pas comment remplir le nom d'utilisateur de Railway 12306. Vient ensuite le didacticiel graphique sur la façon de remplir dans le nom d'utilisateur du chemin de fer 12306 apporté par l'éditeur , les utilisateurs intéressés viennent y jeter un œil ! Didacticiel d'utilisation du Railway 12306 Comment remplir le nom d'utilisateur du Railway 12306 1. Ouvrez d'abord l'application Railway 12306 et cliquez sur [S'inscrire] en bas de la page principale. 2. Ensuite, sur la page de fonction d'enregistrement, entrez le nom d'utilisateur, le mot de passe et la confirmation ; mot de passe, etc.; 3. Enfin, entrez Une fois terminé, vous pouvez remplir l'enregistrement de l'utilisateur.

Comment gérer la vérification et les invites de saisie utilisateur dans Vue La gestion de la vérification et des invites de saisie utilisateur dans Vue est une exigence courante dans le développement front-end. Cet article présentera quelques techniques courantes et des exemples de code spécifiques pour aider les développeurs à mieux gérer la vérification des entrées utilisateur et les invites. Validation à l'aide de propriétés calculées Dans Vue, vous pouvez utiliser des propriétés calculées pour surveiller et valider les entrées utilisateur. Vous pouvez définir un attribut calculé pour représenter la valeur saisie par l'utilisateur et effectuer une logique de validation dans l'attribut calculé. Voici un exemple : data(){
