2012-02-10 253 views
-1

我與JS存在衝突。我有兩個爲網站上的select元素編寫的腳本。一個用於提交它沒有提交按鈕和一個自定義樣式的選擇。這裏有兩個:解決Javascript衝突

<script type="text/javascript"><!-- 
       var dropdown = document.getElementById("stallions"); 
       function onStallion() { 
        if (dropdown.options[dropdown.selectedIndex].value != null) { 
        location.href = dropdown.options[dropdown.selectedIndex].value; 
        } 
       } 
       dropdown.onchange = onStallion; 
      --></script> 

// Jquery plugin for styling selectboxes from DressCode. 

$(document).ready(function(){ 
// first locate all of the select tags on the page and hide them 
$("select#stallions").css('display','none'); 
//now, for each select box, run this function 
$("select#stallions").each(function(){ 

    var curSel = $(this); 
    // get the CSS width from the original select box 
    var gddWidth = $(curSel).css('width'); 
    var gddWidthL = gddWidth.slice(0,-2); 
    var gddWidth2 = gddWidthL - 28; 
    var gddWidth3 = gddWidthL - 16; 
    // build the new div structure 
    var gddTop = '<div style="width:' + gddWidthL + 'px" class="selectME" tabindex="0"><div class="cornerstop"><div><div></div></div></div><div class="middle"><div><div><div>'; 
    //get the default selected option 
    var whatSelected = $(curSel).children('option:selected').text(); 
    //write the default 
    var gddFirst = '<div class="first"><span class="selectME gselected" style="width:'+ gddWidth2 + 'px;">'+ whatSelected +'</span><span id="arrowImg"></span><div class="clears"></div></div><ul class="selectME">'; 
    // create a new array of div options from the original's options 
    var addItems = new Array();  
    $(curSel).children('option').each(function() {   
     var text = $(this).text(); 
     var selVal = $(this).attr('value'); 
     var before = '<li style="width:' + gddWidthL + 'px;"><a href="#" rel="' + selVal + '" tabindex="0" style="width:' + gddWidth3 + 'px;">'; 
     var after = '</a></li>';   
     addItems.push(before + text + after); 
    }); 
    //hide the default from the list of options 
    var removeFirst = addItems.shift(); 
    // create the end of the div selectbox and close everything off 
    var gddBottom ='</ul></div></div></div></div><div class="cornersbottom"><div><div></div></div></div></div>' 
    //write everything after each selectbox 
    var GDD = gddTop + gddFirst + addItems.join('') + gddBottom; 
    $(curSel).after(GDD); 
    //this var selects the div select box directly after each of the origials 
    var nGDD = $(curSel).next('div.selectME'); 

    $(nGDD).find('li:first').addClass("first"); 

    $(nGDD).find('li:last').addClass('last'); 
    //handle the on click functions - push results back to old text box 
    $(nGDD).click(function(e) { 
     var myTarA = $(e.target); 
     var myTarT = $(e.target).text(); 
     var myTar = $(e.target); 
     //if closed, then open 
     if($(nGDD).find('li').css('display') == 'none') 
      { 
        //this next line closes any other selectboxes that might be open 
        $('div.selectME').find('li').css('display','none'); 
        $(nGDD).find('li').css('display','block'); 

        //if user clicks off of the div select box, then shut the whole thing down 
        $(document.window || 'body').click(function(f) { 
          var myTar2 = $(f.target); 
          if (myTar2 !== nGDD) {$(nGDD).find('li').css('display','none');} 
        }); 
          return false; 
      } 
      else 
      {  
        if (myTarA == null){ 
         $(nGDD).find('li').css('display','none'); 
           return false; 
          } 
          else { 
           //set the value of the old select box 
           $(curSel).val(myTarA); 
           //set the text of the new one 
           $(nGDD).find('span.gselected').text(myTarT); 
           $(nGDD).find('li').css('display','none'); 
           return false; 
          } 
      } 
    //handle the tab index functions 
    }).focus(function(e) {   


     $(nGDD).find('li:first').addClass('currentDD'); 
     $(nGDD).find('li:last').addClass('lastDD'); 
     function checkKey(e){ 
      //on keypress handle functions 
      function moveDown() { 
       var current = $(nGDD).find('.currentDD:first'); 
       var next = $(nGDD).find('.currentDD').next(); 
       if ($(current).is('.lastDD')){ 
       return false; 
       } else { 
        $(next).addClass('currentDD'); 
        $(current).removeClass('currentDD'); 
       } 
      } 
      function moveUp() { 
       var current = $(nGDD).find('.currentDD:first'); 
       var prev = $(nGDD).find('.currentDD').prev(); 
       if ($(current).is('.first')){ 
       return false; 
       } else { 
        $(prev).addClass('currentDD'); 
        $(current).removeClass('currentDD'); 
       } 
      } 
      var curText = $(nGDD).find('.currentDD:first').text(); 
      var curVal = $(nGDD).find('.currentDD:first a').attr('rel'); 
      switch (e.keyCode) { 
       case 40: 
        $(curSel).val(curVal); 
        $(nGDD).find('span.gselected').text(curText); 
        moveDown(); 
        return false; 
        break; 
       case 38: 
        $(curSel).val(curVal); 
        $(nGDD).find('span.gselected').text(curText); 
        moveUp(); 
        return false; 
        break; 
       case 13: 
        $(nGDD).find('li').css('display','none'); 
        }  
     } 
     $(document).keydown(checkKey); 
    }).blur(function() { 
      $(document).unbind('keydown'); 
    }); 
}); 
}); 

第一個嵌入頁面的PHP文件,第二個是從外部的js文件拉動。我測試了一下,我知道它們之間有衝突。如果我使用第二個腳本,提交的第一個腳本不起作用。如果我刪除第二個腳本,它的工作非常好。

我很樂意爲導致錯誤的原因以及我如何解決問題尋求幫助。謝謝您的幫助!

回答

2

問題在於DressDown代碼與下拉菜單交互的方式。

如果你有這樣的行(69行):

//set the value of the old select box 
$(curSel).val(myTarA); 

它不觸發列表平變化。你可以簡單地在該行後面添加location.href,它應該做你想做的事:

.... 
//set the value of the old select box 
$(curSel).val(myTarA); 
location.href = myTarA; 
//set the text of the new one 
.... 
+0

我試過了,但它只在select時再次加載相同的頁面。它應該重定向到適當的鏈接。 – 2012-02-11 12:23:20

+0

我也試過在這裏根據需要發生什麼根據第一個代碼:location.href = dropdown.options [dropdown.selectedIndex] .value;但它不起作用,它只是重新加載相同的頁面。 – 2012-02-11 13:37:04

+0

您是否嘗試向代碼添加警報(myTarA)以查看正在傳遞的值?由於我不知道你的下拉菜單中有什麼,所以很難排除過去的某個問題。 – 2012-02-11 16:40:50