2013-02-18 97 views
0

在我的頁面中,我使用了一個下拉菜單。當更改下拉值時,它將調用名爲sample的函數。但onchange功能不起作用。任何人都可以幫助我解決這個問題。Dropdown onchange函數調用不起作用

<!doctype html>  
<html lang="en"> 
<head> 
    <meta charset="utf-8" /> 
    <title>jQuery UI Autocomplete - Combobox</title> 
    <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.1/themes/base/jquery-ui.css" /> 
    <script src="http://code.jquery.com/jquery-1.9.1.js"></script> 
    <script src="http://code.jquery.com/ui/1.10.1/jquery-ui.js"></script> 
    <link rel="stylesheet" href="/resources/demos/style.css" /> 
    <style> 
    .ui-combobox { 
     position: relative; 
     display: inline-block; 
    } 
    .ui-combobox-toggle { 
     position: absolute; 
     top: 0; 
     bottom: 0; 
     margin-left: -1px; 
     padding: 0; 
     /* support: IE7 */ 
     *height: 1.7em; 
     *top: 0.1em; 
    } 
    .ui-combobox-input { 
     margin: 0; 
     padding: 0.3em; 
    } 
    </style> 

JS文件

<script> 
    (function($) { 
     $.widget("ui.combobox", { 
      _create: function() { 
       var input, 
        that = this, 
        wasOpen = false, 
        select = this.element.hide(), 
        selected = select.children(":selected"), 
        value = selected.val() ? selected.text() : "", 
        wrapper = this.wrapper = $("<span>") 
         .addClass("ui-combobox") 
         .insertAfter(select); 

       function removeIfInvalid(element) { 
        var value = $(element).val(), 
         matcher = new RegExp("^" + $.ui.autocomplete.escapeRegex(value) + "$", "i"), 
         valid = false; 
        select.children("option").each(function() { 
         if ($(this).text().match(matcher)) { 
          this.selected = valid = true; 
          return false; 
         } 
        }); 

        if (!valid) { 
         // remove invalid value, as it didn't match anything 
         $(element) 
          .val("") 
          .attr("title", value + " didn't match any item") 
          .tooltip("open"); 
         select.val(""); 
         setTimeout(function() { 
          input.tooltip("close").attr("title", ""); 
         }, 2500); 
         input.data("ui-autocomplete").term = ""; 
        } 
       } 

       input = $("<input>") 
        .appendTo(wrapper) 
        .val(value) 
        .attr("title", "") 
        .addClass("ui-state-default ui-combobox-input") 
        .autocomplete({ 
         delay: 0, 
         minLength: 0, 
         source: function(request, response) { 
          var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i"); 
          response(select.children("option").map(function() { 
           var text = $(this).text(); 
           if (this.value && (!request.term || matcher.test(text))) 
            return { 
             label: text.replace(
              new RegExp(
               "(?![^&;]+;)(?!<[^<>]*)(" + 
               $.ui.autocomplete.escapeRegex(request.term) + 
               ")(?![^<>]*>)(?![^&;]+;)", "gi" 
              ), "<strong>$1</strong>"), 
             value: text, 
             option: this 
            }; 
          })); 
         }, 
         select: function(event, ui) { 
          ui.item.option.selected = true; 
          that._trigger("selected", event, { 
           item: ui.item.option 
          }); 
         }, 
         change: function(event, ui) { 
          if (!ui.item) { 
           removeIfInvalid(this); 
          } 
         } 
        }) 
        .addClass("ui-widget ui-widget-content ui-corner-left"); 

       input.data("ui-autocomplete")._renderItem = function(ul, item) { 
        return $("<li>") 
         .append("<a>" + item.label + "</a>") 
         .appendTo(ul); 
       }; 

       $("<a>") 
        .attr("tabIndex", -1) 
        .attr("title", "Show All Items") 
        .tooltip() 
        .appendTo(wrapper) 
        .button({ 
         icons: { 
          primary: "ui-icon-triangle-1-s" 
         }, 
         text: false 
        }) 
        .removeClass("ui-corner-all") 
        .addClass("ui-corner-right ui-combobox-toggle") 
        .mousedown(function() { 
         wasOpen = input.autocomplete("widget").is(":visible"); 
        }) 
        .click(function() { 
         input.focus(); 

         // close if already visible 
         if (wasOpen) { 
          return; 
         } 

         // pass empty string as value to search for, displaying all results 
         input.autocomplete("search", ""); 
        }); 

       input.tooltip({ 
        tooltipClass: "ui-state-highlight" 
       }); 
      }, 

      _destroy: function() { 
       this.wrapper.remove(); 
       this.element.show(); 
      } 
     }); 
    })(jQuery); 

    $(function() { 
     $("#combobox").combobox(); 
     $("#toggle").click(function() { 
      $("#combobox").toggle(); 
     }); 
    }); 
function sample() 
{ 
alert("testing"); 
}  
</script> 
</head> 
<body> 

HTML編碼

<div class="ui-widget"> 
    <label>Your preferred programming language: </label> 
    <select id="combobox" onchange="sample();"> 
     <option value="">Select one...</option> 
     <option value="ActionScript">ActionScript</option> 
     <option value="AppleScript">AppleScript</option> 
     <option value="Asp">Asp</option> 
     <option value="BASIC">BASIC</option> 
     <option value="C">C</option> 
     <option value="C++">C++</option> 
     <option value="Clojure">Clojure</option> 
     <option value="COBOL">COBOL</option> 
     <option value="ColdFusion">ColdFusion</option> 
     <option value="Erlang">Erlang</option> 
     <option value="Fortran">Fortran</option> 
     <option value="Groovy">Groovy</option> 
     <option value="Haskell">Haskell</option> 
     <option value="Java">Java</option> 
     <option value="JavaScript">JavaScript</option> 
     <option value="Lisp">Lisp</option> 
     <option value="Perl">Perl</option> 
     <option value="PHP">PHP</option> 
     <option value="Python">Python</option> 
     <option value="Ruby">Ruby</option> 
     <option value="Scala">Scala</option> 
     <option value="Scheme">Scheme</option> 
    </select> 
</div> 
<button id="toggle">Show underlying select</button> 


</body> 
</html> 
+0

什麼是你寫有問題的js文件的名稱? – Hkachhia 2013-02-18 12:11:18

+0

我從這個URL的編碼只用於自動完成功能http://jqueryui.com/resources/demos/autocomplete/combobox.html – Rithu 2013-02-18 12:13:51

+0

沒有必要在js文件中寫腳本標記,但在你的js文件中你有寫腳本標記以及html代碼。爲什麼? – Hkachhia 2013-02-18 12:17:16

回答

3

默認平變化的選擇框的事件,因爲它得到的jQuery UI轉換將無法正常工作。

使用jQuery UI內置事件一樣:

$("#combobox").autocomplete({ 
change: function(event, ui) { alert("testing");} 
}); 

編號:http://api.jqueryui.com/autocomplete/#event-change

---- ----編輯

解決方案是在這裏: 可能的重複:jquery UI Combobox ONCHANGE

+0

不適用於我 – cIph3r 2013-02-18 12:40:19

+0

你在哪裏寫你的代碼 – 2013-02-18 12:43:43

+0

在匿名函數的結尾,使組合框到一個在這行後面的組合框 – cIph3r 2013-02-18 12:44:52

0

這是因爲jqueryUI(或你的代碼?!)隱藏了原來的組合框,並用它自己替換它。

使用螢火蟲或類似物來檢查組合框。它被隱藏了!

您可以使用JS-事件偵聽解決它,像你這樣在這裏:

$("#toggle").click(function() { 
$("#combobox").toggle(); 
}); 

然而,

$(".ui-combobox input").change(function(){ 
    sample(); 
}); 

這是不行的,因爲變化不是由選擇觸發。 只能通過手動輸入。 所以你將不得不觸發它:

select: function(event, ui) { 

       $(this).trigger("change"); // here 
          ui.item.option.selected = true; 
          that._trigger("selected", event, { 
           item: ui.item.option 
          }); 
         }, 
+0

任何編碼該事件監聽器處理的示例 – Rithu 2013-02-18 12:24:52