2015-06-09 35 views
0

當我添加javascript時,我需要有關選項菜單無法正常工作的幫助。當我添加JavaScript功能時,選項菜單無法正常工作

我找到了這種類型的下拉菜單的教程和菜單/下拉功能正在工作,除了我不能讓它做我需要什麼時,選擇一個選項。

當選擇「不可用」時,我想在菜單下打開2個div。我的代碼適用於不使用下面第一個示例中的JavaScript代碼的常規選項菜單,但在嘗試向此菜單中添加其他功能代碼時,它不起作用。有一些我沒有看到或理解的JavaScript使菜單工作。

這裏是原代碼:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<title>Untitled Document</title> 
<style> 
/*Form*/ 

* { 
    -webkit-box-sizing: border-box; 
    -moz-box-sizing: border-box; 
    box-sizing: border-box; 
} 
form > div { 
    clear: both; 
    overflow: hidden; 
    padding: 1px; 
    margin: 0; 
} 
input[type=text]:focus, input[type=email]:focus, input[type=url]:focus, input[type=password]:focus, textarea:focus { 
    outline: 0; 
    border: #f76e00 1px solid; 
} 

/*Dropdown*/ 

#dropdown { 
    background-color: #d8f3ff; 
    width: 100%; 
    padding: 10px; 
    text-align: left; 
} 
#dropdown2 { 
    background-color: #eaeaea; 
    width: 100%; 
    padding: 10px; 
    text-align: left; 
} 
#dropdown3 { 
    background-color: #d8f3ff; 
    width: 100%; 
    padding: 10px; 
    text-align: left; 
} 
.dropcont { 
    position: relative; 
    font-size: 12px; 
    color: #666; 
    text-decoration: none; 
    text-align: left; 
} 
.trigger { 
    color: #666; 
    padding: 10px; 
    font-size: 12px; 
    width: 100%; 
    background: #fff url(../images/select-arrow-open.png) 98% center no-repeat; 
    display: block; 
    border: 1px solid #ccc; 
    -webkit-box-sizing: border-box; 
    -moz-box-sizing: border-box; 
    box-sizing: border-box; 
    -webkit-transition: all 0.5s ease; 
    -moz-transition: all 0.5s ease; 
    -o-transition: all 0.5s ease; 
    transition: all 0.5s ease; 
    text-decoration: none; 
    text-align: left; 
} 
.trigger:hover { 
    color: #666; 
    background: #f5f5f5 url(../images/select-arrow-open.png) 98% center no-repeat; 
    border: #f76e00 1px solid; 
    text-decoration: none; 
    text-align: left; 
} 
.activetrigger { 
    color: #666; 
    padding: 10px; 
    font-size: 12px; 
    width: 100%; 
    background: #f5f5f5 url(../images/select-arrow-close.png) 98% center no-repeat; 
    display: block; 
    border: #f76e00 1px solid; 
    -webkit-box-sizing: border-box; 
    -moz-box-sizing: border-box; 
    box-sizing: border-box; 
    text-decoration: none; 
    text-align: left; 
} 
.activetrigger:hover { 
    background: #f5f5f5 url(../images/select-arrow-close.png) 98% center no-repeat; 
    color: #666; 
    text-decoration: none; 
} 
.activetrigger:active { 
    background: #f5f5f5 url(../images/select-arrow-close.png) 98% center no-repeat; 
    color: #666; 
    text-decoration: none; 
} 
.dropcont ul { 
    font-size: 12px; 
    border: #f76e00 1px solid; 
    border-top: none; 
    background: #fff; 
    list-style-type: none; 
    padding: 10px; 
    margin: 0; 
    width: 100%; 
    z-index: 100; 
    -webkit-box-sizing: border-box; 
    -moz-box-sizing: border-box; 
    box-sizing: border-box; 
    text-decoration: none; 
    text-align: left; 
} 
.dropcont ul li { 
    padding: 5px; 
    -webkit-transition: all 0.5s ease; 
    -moz-transition: all 0.5s ease; 
    -o-transition: all 0.5s ease; 
    transition: all 0.5s ease; 
    text-decoration: none; 
    text-align: left; 
} 
.dropcont ul li:hover { 
    background: #f5f5f5; 
    outline: none; 
    text-decoration: none; 
} 
.dropcont ul li:first-child { 
    display: none; 
} 
.dropcont ul li:last-child { 
    border-bottom: none; 
} 
.dropdownhidden { 
    display: none; 
} 
.dropdownvisible { 
    height: auto; 
} 
.dropdownvisible { 
    height: 100px; 
    overflow-y: scroll; 
    text-decoration: none; 
    text-align: left; 
} 
.label { 
    color: #666; 
    font-size: 12px; 
    margin-bottom: 5px; 
    display: block; 
    text-align: left; 
} 
a { 
    color: #666; 
    text-decoration: none; 
} 
a:hover { 
    color: #f76e00; 
} 
/* Navigation */ 

nav ul { 
    padding: 0 20px; 
} 
nav li { 
    list-style: none; 
    float: left; 
    margin-right: 20px; 
    padding: 10px; 
    font-weight: 300; 
} 
nav li.current { 
    background: #f5f5f5; 
    border: 1px solid #ccc; 
    border-bottom: none; 
} 
nav li.current a { 
    color: #777; 
    cursor: default; 
} 
#audiobook { 
    position: relative; 
    height: 200px; 
    width: 100%; 
    background-color: #6FF; 
} 
</style> 

<script> 
function tamingselect() 
{ 
    if(!document.getElementById && !document.createTextNode){return;} 

// Classes for the link and the visible dropdown 
    var ts_selectclass='turnintodpdn'; // class to identify selects 
    var ts_listclass='turnintoselect';  // class to identify ULs 
    var ts_boxclass='dropcont';   // parent element 
    var ts_triggeron='activetrigger';  // class for the active trigger link 
    var ts_triggeroff='trigger';   // class for the inactive trigger link 
    var ts_dropdownclosed='dropdownhidden'; // closed dropdown 
    var ts_dropdownopen='dropdownvisible'; // open dropdown 
/* 
    Turn all selects into DOM dropdowns 
*/ 
    var count=0; 
    var toreplace=new Array(); 
    var sels=document.getElementsByTagName('select'); 
    for(var i=0;i<sels.length;i++){ 
     if (ts_check(sels[i],ts_selectclass)) 
     { 
      var hiddenfield=document.createElement('input'); 
      hiddenfield.name=sels[i].name; 
      hiddenfield.type='hidden'; 
      hiddenfield.id=sels[i].id; 
      hiddenfield.value=sels[i].options[0].value; 
      sels[i].parentNode.insertBefore(hiddenfield,sels[i]) 
      var trigger=document.createElement('a'); 
      ts_addclass(trigger,ts_triggeroff); 
      trigger.href='#'; 
      trigger.onclick=function(){ 
       ts_swapclass(this,ts_triggeroff,ts_triggeron) 
       ts_swapclass(this.parentNode.getElementsByTagName('ul')[0],ts_dropdownclosed,ts_dropdownopen); 
       return false; 
      } 
      trigger.appendChild(document.createTextNode(sels[i].options[0].text)); 
      sels[i].parentNode.insertBefore(trigger,sels[i]); 
      var replaceUL=document.createElement('ul'); 
      for(var j=0;j<sels[i].getElementsByTagName('option').length;j++) 
      { 
       var newli=document.createElement('li'); 
       var newa=document.createElement('a'); 
       newli.v=sels[i].getElementsByTagName('option')[j].value; 
       newli.elm=hiddenfield; 
       newli.istrigger=trigger; 
       newa.href='#'; 
       newa.appendChild(document.createTextNode(
       sels[i].getElementsByTagName('option')[j].text)); 
       newli.onclick=function(){ 
        this.elm.value=this.v; 
        ts_swapclass(this.istrigger,ts_triggeron,ts_triggeroff); 
        ts_swapclass(this.parentNode,ts_dropdownopen,ts_dropdownclosed) 
        this.istrigger.firstChild.nodeValue=this.firstChild.firstChild.nodeValue; 
        return false; 
       } 
       newli.appendChild(newa); 
       replaceUL.appendChild(newli); 
      } 
      ts_addclass(replaceUL,ts_dropdownclosed); 
      var div=document.createElement('div'); 
      div.appendChild(replaceUL); 
      ts_addclass(div,ts_boxclass); 
      sels[i].parentNode.insertBefore(div,sels[i]) 
      toreplace[count]=sels[i]; 
      count++; 
     } 
    } 

/* 
    Turn all ULs with the class defined above into dropdown navigations 
*/ 

    var uls=document.getElementsByTagName('ul'); 
    for(var i=0;i<uls.length;i++) 
    { 
     if(ts_check(uls[i],ts_listclass)) 
     { 
      var newform=document.createElement('form'); 
      var newselect=document.createElement('select'); 
      for(j=0;j<uls[i].getElementsByTagName('a').length;j++) 
      { 
       var newopt=document.createElement('option'); 
       newopt.value=uls[i].getElementsByTagName('a')[j].href; 
       newopt.appendChild(document.createTextNode(uls[i].getElementsByTagName('a')[j].innerHTML)); 
       newselect.appendChild(newopt); 
      } 
      newselect.onchange=function() 
      { 
       window.location=this.options[this.selectedIndex].value; 
      } 
      newform.appendChild(newselect); 
      uls[i].parentNode.insertBefore(newform,uls[i]); 
      toreplace[count]=uls[i]; 
      count++; 
     } 
    } 
    for(i=0;i<count;i++){ 
     toreplace[i].parentNode.removeChild(toreplace[i]); 
    } 
    function ts_check(o,c) 
    { 
     return new RegExp('\\b'+c+'\\b').test(o.className); 
    } 
    function ts_swapclass(o,c1,c2) 
    { 
     var cn=o.className 
     o.className=!ts_check(o,c1)?cn.replace(c2,c1):cn.replace(c1,c2); 
    } 
    function ts_addclass(o,c) 
    { 
     if(!ts_check(o,c)){o.className+=o.className==''?c:' '+c;} 
    } 
} 

window.onload=function() 
{ 
    tamingselect(); 
    // add more functions if necessary 
} 
</script> 

</head> 

<body> 

<div id="dropdown2"> 
    <form action=""> 
    <label class="label">What is cost?</label> 
    <select class="turnintodpdn"> 
     <option>This is:</option> 
     <option value="1">Free</option> 
     <option value="2">Not free</option> 
    </select> 
    </form> 
</div> 

</body> 
</html> 

在該文件的頭我加入這個:

<script> 
function NotFreeSelectCheck(nfSelect) 
{ 
    if(nfSelect){ 
     slctOptionValue = document.getElementById("slctOption").value; 
     if(slctOptionValue == nfSelect.value){ 
      document.getElementById("NotFreeDivCheck").style.display = "block"; 
      document.getElementById("ppaddrss").style.display = "block"; 
     } 
     else{ 
      document.getElementById("NotFreeDivCheck").style.display = "none"; 
      document.getElementById("ppaddrss").style.display = "none"; 
     } 
    } 
    else{ 
     document.getElementById("NotFreeDivCheck").style.display = "none"; 
     document.getElementById("ppaddrss").style.display = "none"; 
    } 
} 
</script> 

這裏是更新的HTML:

<div id="dropdown2"> 
        <form action=""> 
        <label class="label">What is cost?</label> 
        <select class="turnintodpdn" id="getFvalue" onchange="NotFreeSelectCheck(this);"> 
         <option>This is:</option> 
         <option value="1">Free</option> 

<option id="slctOption" value="2">Not free</option> 
        </select> 
        </form> 
       </div> 


<div id="NotFreeDivCheck" style="display:none;"> 
Price field 
</div> 

<div id="ppaddrss" style="display:none;"> 
Payment Address 
</div> 

無不管我做什麼,當菜單中選擇「不可用」時,如果添加了jav,我無法打開div。第一個代碼示例中的ascript。如果我從第一個示例中刪除樣式和JavaScript函數,並將菜單設爲普通菜單,則代碼將工作,並顯示div「NotFreeDivCheck」和「ppaddrss」。我需要做些什麼來完成這項工作?

只是要清楚,你可以看到,這個代碼工作,如果從第一個例子中的JavaScript被刪除:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<title>Untitled Document</title> 

<script> 
function NotFreeSelectCheck(nfSelect) 
{ 
    if(nfSelect){ 
     slctOptionValue = document.getElementById("slctOption").value; 
     if(slctOptionValue == nfSelect.value){ 
      document.getElementById("NotFreeDivCheck").style.display = "block"; 
      document.getElementById("ppaddrss").style.display = "block"; 
     } 
     else{ 
      document.getElementById("NotFreeDivCheck").style.display = "none"; 
      document.getElementById("ppaddrss").style.display = "none"; 
     } 
    } 
    else{ 
     document.getElementById("NotFreeDivCheck").style.display = "none"; 
     document.getElementById("ppaddrss").style.display = "none"; 
    } 
} 
</script> 

</head> 

<body> 

<div id="dropdown2"> 
    <form action=""> 
    <label class="label">What is cost?</label> 
    <select id="getFvalue" onchange="NotFreeSelectCheck(this);"> 
     <option>This is:</option> 
     <option value="1">Free</option> 
     <option id="slctOption" value="2">Not free</option> 
    </select> 
    </form> 
</div> 

<div id="NotFreeDivCheck" style="display:none;"> Price field </div> 

<div id="ppaddrss" style="display:none;"> Payment Address </div> 

</body> 
</html> 

請幫助和感謝!

+3

哇,我知道,我從來沒有見過,在一個崗位多的代碼之前。請儘可能簡潔。你只需要添加能夠複製問題的代碼,而且很多代碼似乎都不相關。此外,圖片或實時鏈接會很好,以便我們更清楚地知道[瞄準/修復]。 – jaunt

+1

製作一個複製問題的jsfiddle。 – loli

回答

0

腳本您正在使用轉換所有的SELECT元素融入到DOM的下拉列表中,所以此行的功能不起作用:

slctOptionValue = document.getElementById("slctOption").value; 

因爲document.getElementById("slctOption")沒有定義。你可以硬編碼,因爲它只是一個值:

slctOptionValue = 2; 

此外,您onchange將永遠不會觸發因爲被替換的選擇。請修改此代碼:

newli.onclick=function(){ 
    this.elm.value=this.v; 
    NotFreeSelectCheck(this.elm); /* Added this line */ 
    ts_swapclass(this.istrigger,ts_triggeron,ts_triggeroff); 
    ts_swapclass(this.parentNode,ts_dropdownopen,ts_dropdownclosed) 
    this.istrigger.firstChild.nodeValue=this.firstChild.firstChild.nodeValue; 
    return false; 
} 

您還應該通過JSHint運行腳本。它缺少一些分號,並且有其他問題可以很好地清理。

這裏是一個的jsfiddle:http://jsfiddle.net/3k6795dm/17/

+0

你真棒,我想通過Paypal向你發送一些錢。讓我知道你是否會接受我的付款給你。非常感謝你的幫助! – Jason

+0

這裏不需要PayPal。綠色支票和upvotes是唯一的貨幣。這都是關於學習。 –