http://blog.94smart.com/index.php?q=node/256
http://www.kenlee.cn/index.php?job=art&articleid=a_20050614_031309
路径重定向以及tag 提示,代码很有意思,虽然看得人头疼…回头拉住zdg,一定要问个痛快。
var alltags = {”新闻”:{x:1,y:243},”互联网”:{x:58,y:164},”webdesign”:{x:1874,y:153},”blog”:{x:47,y:72},”Firefox”:{x:110,y:71},”Linux”:{x:184,y:45},”生活”:{x:8,y:31},”软件使用”:{x:113,y:25},”CSS”:{x:137,y:22},”opera”:{x:3426,y:13},”war3″:{x:2082,y:11},”Windows”:{x:384,y:11},”娱乐”:{x:2,y:7},”唐都房”:{x:3104,y:6},”私有”:{x:9,y:2},”test”:{x:344,y:2},”rdf”:{x:2098,y:2},”uidesign”:{x:3310,y:2},”Wiki”:{x:152,y:2},”RSS”:{x:435,y:2},”IT”:{x:5,y:1},”历史”:{x:421,y:1},”Feed”:{x:382,y:1},”browser”:{x:2497,y:1},”ajax”:{x:5144,y:1},”其他”:{x:10,y:0},”财经”:{x:4,y:0},”文化”:{x:7,y:0},”体育”:{x:3,y:0},”军事”:{x:6,y:0}};var tagselected = []
String.prototype.trim = function(){ return this.replace(/^s+|s+$/g,”) }
String.prototype.escRegExp = function(){ return this.replace(/[\$*+?()=!|,{}[].^]/g,’\$&’) }
String.prototype.unescHtml = function(){ var i,t=this; for(i in e) t=t.replace(new RegExp(i,’g'),e[i]); return t }
function Suggestions() { this.length=0; this.picked=0 }
var suggestions = new Suggestions()
var tagSearch=’ ‘, lastEdit=”
var h={}, sections=[{},{},{},{},{}], selected={}, currentTag={}, e={’<':'<','>‘:’>',’&':’&',’”‘:’”‘}
function init() { var elements = ['suggest','newTags','Tags'], t,i
for(i in elements) h[elements[i]] = document.getElementById(elements[i])
for(t in alltags) {
tagSearch += t + ‘ ‘
var tagid = alltags[t]['x']
var id = alltags[t]['y']
var title = t+’['+id+']‘
var sel = false
for (j in tagselected) {
if (tagid==tagselected[j]) { sel=true; break;}
}
if (sel){ h.Tags.options.add(new Option(title,tagid),0);h.Tags.options[0].selected=true}
else{ h.Tags.options.add(new Option(title,tagid));}
}
document.onkeydown = document.onkeypress = document.onkeyup = handler
updateHilight()
}
function makeTag(parent, tag, js) {
parent.appendChild(document.createTextNode(’ ‘))
var obj = document.createElement(’a')
obj.className = ‘tag’
obj.setAttribute(’href’,'javascript:’+js+’(”‘+tag.replace(/”/g,’\”‘)+’”)’)
obj.appendChild(document.createTextNode(tag))
if(alltags[tag] < 2) obj.style.color = '#66f'
if(alltags[tag] == 2) obj.style.color = '#44f'
parent.appendChild(obj)
return obj
}
function select(t) { var i; t=t.toLowerCase()
selected[t] = true; for(i in sections) if(sections[i][t]) sections[i][t].className = 'tag selected'
}
function deselect(t) { var i; t=t.toLowerCase()
delete selected[t]; for(i in sections) if(sections[i][t]) sections[i][t].className = 'tag'
}
function complete(tag) { var tagArray=h.newTags.value.split(' ')
if(typeof tag == 'undefined') tag = suggestions[suggestions.picked].innerHTML.unescHtml() // tab complete rather than click complete
tagArray[currentTag.index] = tag
var text = tagArray.join(' ')
h.newTags.value = (text.substr(-1,1) == ' ' ? text : text + ' ' )
hideSuggestions()
updateHilight()
focusTo(h.newTags)
}
// focus the caret to end of a form input (+ optionally select some text)
var range=0 //ie
function focusTo(obj, selectFrom) {
if (typeof selectFrom == 'undefined') selectFrom = obj.value.length
if(obj.createTextRange){ //ie + opera
if (range == 0) range = obj.createTextRange()
range.moveEnd("character",obj.value.length)
range.moveStart("character",selectFrom)
obj.select()
range.select()
setTimeout('range.select()', 10) // must use a timer to get around bullshit ie bug
} else if (obj.setSelectionRange){ //ff
obj.select()
obj.setSelectionRange(selectFrom,obj.value.length)
} else { //safari ![]()
obj.blur()
}}
function updateHilight() {
var tagArray=h.newTags.value.toLowerCase().split(' '), tagHash={}
if (tagArray[0].trim() == '') tagArray.splice(0,1);
for (t in tagArray) {
if(tagArray[t] != '') {
select(tagArray[t])
tagHash[tagArray[t]] = true
}}
for (t in selected) {if (!tagHash[t]) deselect(t)}
return [tagArray, tagHash]
}
function hideSuggestions() {h.suggest.parentNode.style.visibility='hidden'}
function showSuggestions() { suggest(0); h.suggest.parentNode.style.visibility='visible'}
function updateSuggestions() {
if(!getCurrentTag() || !currentTag.text) { hideSuggestions(); return false }
while (h.suggest.hasChildNodes()) h.suggest.removeChild(h.suggest.firstChild)
delete suggestions; suggestions = new Suggestions();
var tagArray = h.newTags.value.toLowerCase().split(' '), txt=currentTag.text.escRegExp(), tagHash={}, t
for(t in tagArray) tagHash[tagArray[t]] = true
var search = tagSearch.match(new RegExp(("\s("+txt+"[^\s]+)\s"), "gi"))
if(search){
for (i=0; i tl = search[i].trim() if(tagHash[tl]) continue // do not suggest already typed tag suggestions[suggestions.length] = makeTag(h.suggest, tl, 'complete') suggestions.length++ }} if (suggestions.length > 0) showSuggestions() else hideSuggestions() } function suggest(index) { if(suggestions.length == 1) index = 0 if(suggestions[suggestions.picked]) suggestions[suggestions.picked].className = ‘tag’ suggestions[suggestions.picked = index].className = ‘tag selected’ } function getCurrentTag() { if(h.newTags.value == lastEdit) return true // no edit if(h.newTags == ”) return false currentTag = {} var tagArray=h.newTags.value.toLowerCase().split(’ ‘), oldArray=lastEdit.toLowerCase().split(’ ‘), currentTags = [], matched=false, t,o for (t in tagArray) { for (o in oldArray) { if(typeof oldArray[o] == ‘undefined’) { oldArray.splice(o,1); break } if(tagArray[t] == oldArray[o]) { matched = true; oldArray.splice(o,1); break; } } if(!matched) currentTags[currentTags.length] = t matched=false } // more than one word changed… abort if(currentTags.length > 1) { hideSuggestions(); return false } currentTag = { text:tagArray[currentTags[0]], index:currentTags[0] } return true } function handler(event) { var e=(event||window.event) //w3||ie if (e.type == ‘keydown’) { if(suggestions.length > 0) { switch(e.keyCode) { case 38: suggest((suggestions.picked + 1) % suggestions.length); break case 40: suggest(suggestions.picked == 0 ? suggestions.length - 1 : suggestions.picked - 1); break }}} else if (e.type == ‘keypress’) { switch(e.keyCode){ case 38: case 40: if(e.preventDefault) e.preventDefault() //ff break; case 9: // tab if (e.preventDefault && h.suggest.parentNode.style.visibility == ‘visible’) { //ff complete() e.preventDefault() } break; default: lastEdit = h.newTags.value }} else if (e.type == ‘keyup’) { updateHilight() switch(e.keyCode) { //case 8: //backspace //case 46: //delete case 35: //end case 36: //home case 39: // right case 37: // left case 32: // space hideSuggestions(); break case 38: case 40: break; case 9: if(!e.preventDefault && h.suggest.parentNode.style.visibility == ‘visible’) complete() //ie break; default: updateSuggestions() }}}
Leave a reply