2010-01-26 24 views
31

Formda bir seçim elemanına sahip olmak istiyorum, ancak açılır menüdeki seçeneklerin yanı sıra, onu düzenlemek ve yeni bir seçenek eklemek için yararlı olabilir, ancak başka bir giriş metni ile değil hepsi bir arada. Mümkün mü?Düzenlenebilir 'Select' öğesi

+13

define([ 'lodash', 'services/errorHandler' ], function( _, errorhandler ) { var viewModel = function(optionsObservable, valueObservable) { var self = this; self.options = optionsObservable(); self.value = valueObservable; self.resetComboBoxValue = resetComboBoxValue; self.setTextFieldValue = setTextFieldValue; self.textFieldGotFocus = textFieldGotFocus; self.textFieldLostFocus = textFieldLostFocus; function resetComboBoxValue() { $('#comboBox').val(null); } function setTextFieldValue() { var selection = $('#comboBox').val(); self.value(selection); } function textFieldGotFocus() { $('#comboBox').addClass('select-editable-input-focus'); } function textFieldLostFocus() { $('#comboBox').removeClass('select-editable-input-focus'); } }; errorhandler.includeIn(viewModel); return viewModel; }); 

CSS. Şimdi yeni bir Google anahtar kelimesini biliyorsunuz :) – BalusC

+0

https://www.jqwidgets.com/jquery-widgets-documentation/documentation/jqxcombobox/jquery-combobox-getting-started.htm –

+0

Olası çoğaltılacak [HTML birleşik kutu seçeneği ile Bir giriş yazın] (http://stackoverflow.com/questions/14614702/html-combo-box-with-option-to-type-an-entry) –

cevap

73

Hiçbir şey imkansız. Burada, <select> değerinin değiştiği her zaman bir metin girişinin değerini ayarlayan bir çözüm var: Demo on JSFiddle
Rendering, Firefox ve Google Chrome'da test edilmiştir.

<style> 
    .select-editable { position:relative; background-color:white; border:solid grey 1px; width:120px; height:18px; } 
    .select-editable select { position:absolute; top:0px; left:0px; font-size:14px; border:none; width:120px; margin:0; } 
    .select-editable input { position:absolute; top:0px; left:0px; width:100px; padding:1px; font-size:12px; border:none; } 
    .select-editable select:focus, .select-editable input:focus { outline:none; } 
</style> 

<div class="select-editable"> 
    <select onchange="this.nextElementSibling.value=this.value"> 
    <option value=""></option> 
    <option value="115x175 mm">115x175 mm</option> 
    <option value="120x160 mm">120x160 mm</option> 
    <option value="120x287 mm">120x287 mm</option> 
    </select> 
    <input type="text" name="format" value=""/> 
</div> 

Ayrıca giriş list özniteliği ve <datalist> element ile HTML5'teki yapabilirsiniz:

<input list="browsers" name="browser"> 
<datalist id="browsers"> 
    <option value="Internet Explorer"> 
    <option value="Firefox"> 
    <option value="Chrome"> 
    <option value="Opera"> 
    <option value="Safari"> 
</datalist> 
+0

Bu giriş öğesi için bir kapatma etiketi olmamalı mı? –

+0

Sadece değiştirmek '>' 'etmek />' in '' olmasıdır ''. – Jamie

+1

girişi geçersiz bir öğedir ve bu nedenle (doctype'a bağlı olarak) bir kapanış etiketine sahip olmamalıdır (içeriği bulunamadığından) http://www.w3.org/html/wg/drafts/html/master/syntax. html # void-elements – Patrick

9
yukarıda cevap Benzer

ancak mutlak konumlandırma olmadan:

<select style="width: 200px; float: left;" onchange="this.nextElementSibling.value=this.value"> 
    <option></option> 
    <option>1</option> 
    <option>2</option> 
    <option>3</option> 
</select> 
<input style="width: 185px; margin-left: -199px; margin-top: 1px; border: none; float: left;"/> 

Yani bir giriş oluşturmak kutucuğuna tıklayın ve combobox'ın üstünden geçirin

+0

Daha kolay bir teşekkür. @camster –

0

Diğer yanıtlara göre, burada nakavt ile kullanım için bir ilk taslak geçerli: bağlayıcı

 <div data-bind="editableSelect: {options: optionsObservable, value: nameObservable}"></div> 

Nakavt veri

Kullanımı

composition.addBindingHandler('editableSelect', 
    { 
    init: function(hostElement, valueAccessor) { 

     var optionsObservable = getOptionsObservable(); 
     var valueObservable = getValueObservable(); 

     var $editableSelect = $(hostElement); 
     $editableSelect.addClass('select-editable'); 

     var editableSelect = $editableSelect[0]; 

     var viewModel = new editableSelectViewModel(optionsObservable, valueObservable); 
     ko.applyBindingsToNode(editableSelect, { compose: viewModel }); 

     //tell knockout to not apply bindings twice 
     return { controlsDescendantBindings: true }; 

     function getOptionsObservable() { 
     var accessor = valueAccessor(); 
     return getAttribute(accessor, 'options'); 
     } 

     function getValueObservable() { 
     var accessor = valueAccessor(); 
     return getAttribute(accessor, 'value'); 
     } 
    } 
    }); 

Görünüm

<select 
    data-bind="options: options, event:{ focus: resetComboBoxValue, change: setTextFieldValue} " 
    id="comboBox" 
    ></select> 
<input 
    data-bind="value: value, , event:{ focus: textFieldGotFocus, focusout: textFieldLostFocus}" 
    id="textField" 
    type="text"/> 

ViewModel düzenlenebilir bir açılan aynı zamanda bir "combobox" denir

.select-editable { 

    display: block; 
    width: 100%; 
    height: 31px; 
    padding: 6px 12px; 
    font-size: 12px; 
    line-height: 1.42857143; 
    color: #555555; 
    background-color: #ffffff; 
    background-image: none; 
    border: 1px solid #cccccc; 
    border-radius: 0px; 
    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 
    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 
    -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; 
    -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; 
    transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;padding: 0; 
} 


.select-editable select { 
    outline:0; 
    padding-left: 10px; 
    border:none; 
    width:100%; 
    height: 29px; 
} 


.select-editable input { 
    outline:0; 
    position: relative; 
    top: -27px; 
    margin-left: 10px; 
    width:90%; 
    height: 25px; 
    border:none; 
} 

.select-editable select:focus { 
    outline:0; 
    border: 1px solid #66afe9; 
    -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); 
    box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); 
} 




.select-editable input:focus { 
    outline:0; 
} 

.select-editable-input-focus { 
outline:0; 
    border: 1px solid #66afe9 !important; 
    -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); 
    box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); 
}