1. 论坛系统升级为Xenforo,欢迎大家测试!
    排除公告

找到个很好的js

本帖由 laogui2006-10-22 发布。版面名称:前端开发

  1. laogui

    laogui Administrator
    管理成员

    注册:
    2005-08-30
    帖子:
    15,216
    赞:
    35
    完美解决IE不支持伪类:focus的问题

    代码:
    /*#############################################################
    Name: Niceforms
    Version: 0.9
    Author: Lucian Slatineanu
    URL: http://www.badboy.ro/
    
    Feel free to use and modify but please provide credits.
    #############################################################*/
    
    //global variables that can be used by all the functions on this page.
    var selects;
    var inputs;
    var radios = new Array();
    var checkboxes = new Array();
    var hovers = new Array();
    var buttons = new Array();
    var selectText = "please select";
    
    //this function runs when the page is loaded so put all your other onload stuff in here too.
    function init() {
    	
    	//check if styles are enabled and only then start replacing elements
    	if(findPosX(document.getElementById('stylesheetTest')) == -999) {
    		replaceSelects();
    		replaceRadios();
    		replaceCheckboxes();
    	}
    	hoverEffects();
    	buttonHovers();
    }
    
    function replaceRadios() {
    	//get all the radio buttons on the page
    	var inputs = document.getElementsByTagName('input');
    	var j = 0;
    	for(var i=0; i < inputs.length; i++) {
    		if(inputs.type=='radio') {
    			radios[j] = inputs;
    			++j;
    		}
    	}
    	
    	//cycle through the radio inputs
    	for(var i=0; i <radios.length; i++) {
    		
    		//make them transparent
    		radios.className = "transparent";
    		
    		//get their position
    		var x = findPosX(radios);
    		var y = findPosY(radios);
    		
    		//build new div
    		var radioArea = document.createElement('div');
    		if(radios.checked) {radios.nextSibling.className = "chosen"; radioArea.className = "radioAreaChecked";}
    		else if(!radios.checked) {radioArea.className = "radioAreaUnchecked";}
    		radioArea.style.left = x + 'px';
    		radioArea.style.top = y + 'px';
    		radioArea.id = 'myRadio'+i;
    		radios.onclick = new Function('checkRadio('+i+')');
    		
    		//insert div
    		document.getElementsByTagName("body")[0].appendChild(radioArea);
    	}
    }
    
    function replaceCheckboxes() {
    	//get all the checkboxes on the page
    	var inputs = document.getElementsByTagName('input');
    	var j = 0;
    	for (var i2=0; i2 < inputs.length; i2++) {
    		if(inputs[i2].type=='checkbox') {
    			checkboxes[j] = inputs[i2];
    			++j;
    		}
    	}
    
    	//cycle through the checkboxes
    	for(var i2=0; i2 < checkboxes.length; i2++) {
    
    		//make them transparent
    		checkboxes[i2].className = "transparent";
    
    		//get their position
    		var x = findPosX(checkboxes[i2]);
    		var y = findPosY(checkboxes[i2]);
    
    		//build new div
    		var checkboxArea = document.createElement('div');
    		if(checkboxes[i2].checked) {checkboxes[i2].nextSibling.className = "chosen"; checkboxArea.className = "checkboxAreaChecked";}
    		else if(!checkboxes[i2].checked) {checkboxArea.className = "checkboxAreaUnchecked";}
    		checkboxArea.style.left = x + 'px';
    		checkboxArea.style.top = y + 'px';
    		checkboxArea.id = 'myCheck'+i2;
    		checkboxes[i2].onclick = new Function('checkCheck('+i2+')');
    
    		//insert div
    		document.getElementsByTagName("body")[0].appendChild(checkboxArea);
    	}
    }
    
    function replaceSelects() {
    	//get all the select fields on the page
        selects = document.getElementsByTagName('select');
    	
    	//cycle trough the select fields
        for(var i=0; i < selects.length; i++) {
    		
    		//create and build div structure
    		var selectArea = document.createElement('div');
    		var left = document.createElement('div');
    		var right = document.createElement('div');
    		var center = document.createElement('div');
    		var button = document.createElement('a');
    		var text = document.createTextNode(selectText);
    		center.id = "mySelectText"+i;
    		button.href="javascript:showOptions("+i+")";
    		selectArea.className = "selectArea";
    		left.className = "left";
    		right.className = "right";
    		center.className = "center";
    		right.appendChild(button);
    		center.appendChild(text);
    		selectArea.appendChild(left);
    		selectArea.appendChild(right);
    		selectArea.appendChild(center);
    		
    		//hide the select field
            selects.style.display='none'; 
    		
    		//insert select div
    		selects.parentNode.insertBefore(selectArea, selects);
    		
    		//build & place options div
    		var optionsDiv = document.createElement('div');
    		optionsDiv.className = "optionsDivInvisible";
    		optionsDiv.id = "optionsDiv"+i;
    		optionsDiv.style.left = findPosX(selectArea) + 'px';
    		optionsDiv.style.top = findPosY(selectArea) + 19 + 'px';
    		
    		//get select's options and add to options div
    		for(var j=0; j < selects.options.length; j++) {
    			var optionHolder = document.createElement('p');
    			var optionLink = document.createElement('a');
    			var optionTxt = document.createTextNode(selects.options[j].text);
    			optionLink.href = "javascript:showOptions("+i+"); selectMe('"+selects.id+"',"+j+","+i+");";
    			optionLink.appendChild(optionTxt);
    			optionHolder.appendChild(optionLink);
    			optionsDiv.appendChild(optionHolder);
    		}
    		
    		//insert options div
    		document.getElementsByTagName("body")[0].appendChild(optionsDiv);
    	}
    }
    
    function showOptions(g) {
    		elem = document.getElementById("optionsDiv"+g);
    		if(elem.className=="optionsDivInvisible") {elem.className = "optionsDivVisible";}
    		else if(elem.className=="optionsDivVisible") {elem.className = "optionsDivInvisible";}
    }
    
    function selectMe(selectFieldId,linkNo,selectNo) {
    	//feed selected option to the actual select field
    	selectField = document.getElementById(selectFieldId);
    	for(var k = 0; k < selectField.options.length; k++) {
    		if(k==linkNo) {
    			selectField.options[k].selected = "selected";
    		}
    		else {
    			selectField.options[k].selected = "";
    		}
    	}
    	//show selected option
    	textVar = document.getElementById("mySelectText"+selectNo);
    	var newText = document.createTextNode(selectField.options[linkNo].value);
    	textVar.replaceChild(newText, textVar.childNodes[0]);
    }
    
    function findPosY(obj) {
    	var posTop = 0;
    	while (obj.offsetParent) {
    		posTop += obj.offsetTop;
    		obj = obj.offsetParent;
    	}
    	return posTop;
    }
    function findPosX(obj) {
    	var posLeft = 0;
    	while (obj.offsetParent) {
    		posLeft += obj.offsetLeft;
    		obj = obj.offsetParent;
    	}
    	return posLeft;
    }
    
    function checkRadio(g) {
    	if(radios[g].checked) {
    		for (var k = 0; k < radios.length; k++)
    		{
    			if(k != g) {
    				document.getElementById('myRadio'+k).className = "radioAreaUnchecked";
    				radios[k].nextSibling.className = "";
    			}
    			else if(k == g) {
    				document.getElementById('myRadio'+k).className = "radioAreaChecked";
    				radios[g].nextSibling.className = "chosen";
    			}
    		}
    	}
    	else if(!radios[g].checked) {document.getElementById('myRadio'+g).className = "radioAreaUnchecked"; radios[g].nextSibling.className = "";}
    }
    
    function checkCheck(g) {
    	if(checkboxes[g].checked) {
    		for(var k = 0; k < checkboxes.length; k++) {
    			if(k == g) {
    				document.getElementById('myCheck'+k).className = "checkboxAreaChecked";
    				checkboxes[g].nextSibling.className = "chosen";
    			}
    		}
    	}
    	else if(!checkboxes[g].checked) {
    		document.getElementById('myCheck'+g).className = "checkboxAreaUnchecked";
    		checkboxes[g].nextSibling.className = "";
    	}
    }
    
    function hoverEffects() {
    	//get all elements (text inputs, passwords inputs, textareas)
    	var elements = document.getElementsByTagName('input');
    	var j = 0;
    	for (var i4 = 0; i4 < elements.length; i4++) {
    		if((elements[i4].type=='text')||(elements[i4].type=='password')) {
    			hovers[j] = elements[i4];
    			++j;
    		}
    	}
    	elements = document.getElementsByTagName('textarea');
    	for (var i4 = 0; i4 < elements.length; i4++) {
    		hovers[j] = elements[i4];
    		++j;
    	}
    	
    	//add focus effects
    	for (var i4 = 0; i4 < hovers.length; i4++) {
    		hovers[i4].onfocus = function() {this.className += "Hovered";}
    		hovers[i4].onblur = function() {this.className = this.className.replace(/Hovered/g, "");}
    	}
    }
    
    function buttonHovers() {
    	//get all buttons
    	var elements = document.getElementsByTagName('input');
    	var j = 0;
    	for (var i5 = 0; i5 < elements.length; i5++) {
    		if(elements[i5].type=='submit') {
    			buttons[j] = elements[i5];
    			++j;
    		}
    	}
    	
    	//add hover effects
    	for (var i5 = 0; i5 < buttons.length; i5++) {
    		buttons[i5].onmouseover = function() {this.className += "Hovered";}
    		buttons[i5].onmouseout = function() {this.className = this.className.replace(/Hovered/g, "");}
    	}
    }
    
    
    //window.onload = init;
     
  2. Hoofei

    Hoofei New Member

    注册:
    2005-12-10
    帖子:
    3,162
    赞:
    35
    收藏了...
     
  3. Ulysses

    Ulysses New Member

    注册:
    2006-02-05
    帖子:
    10,018
    赞:
    16
    niceforms,以前在网页设计版面我发过的……

    :focus,可以用 onfocus() 行为来实现……
     
  4. lonely

    lonely New Member

    注册:
    2005-12-08
    帖子:
    685
    赞:
    11
    楼主可以说清楚点,究竟是什么作用呢?
     
  5. Hoofei

    Hoofei New Member

    注册:
    2005-12-10
    帖子:
    3,162
    赞:
    35
  6. laogui

    laogui Administrator
    管理成员

    注册:
    2005-08-30
    帖子:
    15,216
    赞:
    35
    IE下无效
     
  7. Hoofei

    Hoofei New Member

    注册:
    2005-12-10
    帖子:
    3,162
    赞:
    35
    所以你上面发的这个不错...