2014-05-07 159 views
0

我正在嘗試使用JavaScript編寫簡單的可變長度列表,該列表可以通過onmouseout和onmouseover等簡單事件快速生成。該代碼在Google chrome中運行良好,但在Internet Explorer 8.0中運行良好,我能夠在JavaScript中的一行中找到錯誤。HTMLElement.id在Internet Explorer 8中無法正常工作

elem.id = id; 

下面是代碼:

<html> 

<head> 
<title>Testing codes</title> 
<meta charset="UTF-8"> 
<meta name="viewport" content="width=device-width, initial-scale=1.0"> 




<script type="text/javascript"> 

/** 
* @param {String} str The string in consideration 
* @param {String} endItem The string to check for at the end of <code>str</code> 
* @return true if the variable <code>str</code> ends with variable <code>endItem</code> 
*/ 
function endsWith(str,endItem){ 

if(typeof str === "string" && typeof endItem === "string"){ 
     var len = str.length; 
     var otherLen = endItem.length; 
    if(len === otherLen){ 
     return str === endItem; 
    } 
    else if(len < otherLen){ 
     return false; 
    } 
    else{ 
     return str.indexOf(endItem, len-otherLen) !== -1; 
    } 
} 
else{ 
    return false; 
} 
return false; 

}//end function 


/** 
* @param {Integer} obj 
* returns the pixel number 
* without the px unit 
*/ 
function getPixelSize(obj){ 
var i = obj.indexOf("px", 0); 
return parseInt(obj.substr(0, i) , 10); 
} 
/** 
* @param {Integer} obj 
* returns the pixel number 
* without the px unit 
*/ 
function getPercent(obj){ 
var i = obj.indexOf("%", 0); 
return parseInt(obj.substr(0, i) , 10); 
} 

/** 
* 
* @param {String} id The id if the element whose color is to be changed 
* @param {String} color The new color 
* @returns {void} 
*/ 
function colorChange(id,color){ 
var element = document.getElementById(id); 
    //alert('id='+id+',element='+element); 
element.style["background"] = color; 
} 

function getParent (id) { 
var elem = document.getElementById(id); 
     var parentElem = elem.parentElement; 
     if (!parentElem) { 
      parentElem = elem.parentNode; 
     } 

return parentElem; 
    } 
/** 
* 
* @param {String} id The id of the element whose parent we need. 
* @returns the parent element (not the id) 
*/ 
function getParentElement(id){ 
var div = document.getElementById(id); 
return div.offsetParent; 
} 
/** 
* 
* @param {HTMLElement} element The element whose right side 
* coordinates we need. 
* The value is returned in the same units as its left, either in px or %. 
* CAUTION: Both the width and the left side must have been styled in the same units 
* for this method to be of any use.   
* @returns {the coordinates of the right side of the element} 
*/ 
function getRight(element){ 
var left = element.style.left; 
var width = element.style.width; 
var isPixels = endsWith(left,'px'); 
if(isPixels === endsWith(width,'px')){ 
return isPixels?(getPixelSize(left)+getPixelSize(width))+"px": 

(getPercent(left)+getPercent(width))+"%";   
} 
alert('left and width must have the same style units for this method to work!'); 
return null; 

} 

/** 
    * 
    * @param {String} listID The id of the list to be removed. 
    */ 
function removeList(listID){ 
var list = document.getElementById(listID); 
var body = document.getElementsByTagName("body")[0]; 
if(list){ 
body.removeChild(list); 
} 
} 
/** 
    * @param {HTMLElement} element The element that spawns this list. 
    * @param {Array} values An array containing the text values to be displayed in the  
    * cells of the list. 
    * @param {Array} links An array containing the links that are navigated to when any  
    * cell is clicked.Its size must be the same as that of the 
    * <code>values</code> array. 
    * @param {String} fgColor The color used to display the text in each cell. 
    * @param {String} bgColor The color of the list's background. 
    * @param {String} linesColor The color used to paint the borders. 
    * @returns {String} the innerhtml value of the list. 
    */ 
function createList(element,values,links,fgColor,bgColor,linesColor){ 
alert(navigator.appVersion); 

if(links.length!==values.length){ 
return; 
} 
var listContainer; 
//The id of the container of the list...i,e the box that holds the list. 
var id = element.id+"_list"; 
var top = element.style.top; 
var left = element.style.left; 
var width = element.style.width; 

var body = document.getElementsByTagName("body")[0]; 

if(document.getElementById(id)){ 
listContainer=document.getElementById(id); 
body.removeChild(listContainer); 
} 
listContainer=document.createElement("div"); 







top = endsWith(top+"","px")?getPixelSize(top+"")+"px":getPercent(top+"")+"%"; 
left = endsWith(left+"","px")?getPixelSize(left+"")+"px":getPercent(left+"")+"%"; 
width = endsWith(width+"","px")?getPixelSize(width+"")+"px":getPercent(width+"")+"%"; 





    if(values.length>0){ 
listContainer.setAttribute("id",id); 




listContainer.style.position="absolute"; 
listContainer.style.borderColor=linesColor; 
listContainer.style.background=bgColor; 
listContainer.style.top=top; 
listContainer.style.left=getRight(element); 
listContainer.style.width=width; 


body.appendChild(listContainer); 


for(var i=0;i<values.length;i++){ 
    var $id = id+i; 

    var cellDiv = document.createElement("div"); 

    cellDiv.setAttribute("id" , $id); 

    cellDiv.style.position="relative"; 
    cellDiv.style["z-index"]="30"; 
    cellDiv.style['color']=fgColor; 
    cellDiv.style.background="pink"; 
    cellDiv.style.borderColor=linesColor; 
    cellDiv.style['font-weight']="bold"; 
    cellDiv.style.fontSize="small"; 
    cellDiv.style['border']="solid black"; 
    cellDiv.style['padding']="1px"; 
    cellDiv.style['margin']="0px"; 

    listContainer.appendChild(cellDiv); 
    var onMouseOut = 'colorChange(\''+$id+'\',\''+bgColor+'\');'; 
    cellDiv.setAttribute('onMouseOut',onMouseOut); 


    var onMouseOver = 'colorChange(\''+$id+'\',\'gold\');'; 

    cellDiv.setAttribute('onMouseOver',onMouseOver); 
    var a = document.createElement('a'); 
    a.style.textDecoration="none"; 
    a.setAttribute("href",links[i]); 
    a.appendChild(document.createTextNode(values[i])); 

    cellDiv.appendChild(a); 
    var onClick = 'removeList(this.parentNode.id);'; 
    cellDiv.setAttribute('onClick',onClick); 




    }//end for loop 

    } 

    else{ 
    return; 
    } 
    } 
    </script> 
    </head> 

    <body id="bodyOfAll" onclick="var divID='myDiv_list'; removeList(divID);"> 

    <div id="myDiv" 

    style= 
    "position:absolute; 
    top:40%; 
    left:30%; 
    width:10%; 
    border:solid; 
    border-color:green; 
    background:blue; 
    color:white;" 

    onmouseover="var div =document.getElementById('myDiv');createList(div,new Array 
    ('Home','About Us','Bookworm Forum','Go to Practice Exams','Logout','Account  
    Settings'), 
    new Array('../jsp/home.jsp','#','../jsp/chatforum.jsp','../jsp/exampage.jsp', 
    '../jsp/logout.jsp','javascript:sendLogoutMessage();'),'green','#00FF00','#ADFF00');" 
    > 
Great! Cool apps! 
</div> 
</body> 
</html> 

的重要方法是createList(參數)和removeList(參數)。幫助器方法是colorChange()和getPixelSize(args)和getPercent(args) 此代碼可以在Internet Explorer 8中複製粘貼和檢查。它下拉列表,但不會在用戶將光標移動到其中時突出顯示其單個單元格並離開細胞。它在Google Chrome中運行良好。 當我檢查時,我從「查看源代碼」選項中的代碼中發現,應該是格式爲id ='idvalue'的動態生成元素的id不是格式id = idvalue,周圍沒有引號。這隻發生在Internet Explorer中,而不發生在Google Chrome中。這個ID被設置爲格式
elem.id = id; ...來自代碼。 我試過它的格式也是: elem.setAttribute(「id」,id); 也是,但結果是一樣的。 請問,這是我的代碼嗎?或者是否有一種特殊的格式用於在Internet Explorer中設置ID?並請我不使用jQuery。

+2

你真的應該使用jQuery ...對不起, –

回答

0

沒有什麼錯的ID,這些行會按預期工作不:

cellDiv.setAttribute('onMouseOut',onMouseOut); 
cellDiv.setAttribute('onmouseOver',onMouseOver); 

IE8忽略已通過setAttribute增加了事件處理程序。

設置屬性,而不是:

(function(n,i){ 
    n.onmouseout = function(){colorChange(i, bgColor);}; 
    n.onmouseover = function(){colorChange(i, 'gold');} 
})(cellDiv,$id); 
+0

感謝@Dr。莫爾,我會檢查出來謝謝 – gbenroscience

+0

真棒@Dr。 Molle,現在的亮點工作正常。但我再次查看了查看源,發現該ID仍然沒有引號。如:id = myDiv_list5,而不是id ='myDiv_list5'...這可能是什麼原因?它只發生在Internet Explorer中。 – gbenroscience

+0

不關心視圖源代碼,它只是瀏覽器的不正確表示。 –

相關問題