2011-11-23 87 views
1

與(我認爲)一個簡單的解決一個簡單的問題,但爲什麼不會以下(與線簡化版的事項)工作:變化值沒有工作

編輯: 我修改了代碼示例了一點,所以它可能使得它更清楚,爲什麼它有錯誤

我仍然懷疑有關的代碼,因爲它似乎醜陋,那裏面有很多無用的東西,但我沒有進入優化階段

HTML:

<div class="select-container"> 
    <input type="hidden" name="enroll-persons-field" id="enroll-persons-field"> 
    <select size="1" name="enroll-persons" id="enroll-persons" class="form-options" tabindex="7"> 
    <option value=""></option> 
     <optgroup label="Ik boek voor"> 
     <option value="1" selected>1 persoon&lt;/option> 
     <option value="2">2 personen&lt;/option> 
     <option value="3">3 personen&lt;/option> 
     <option value="4">4 personen&lt;/option> 
     <option value="5">5 personen&lt;/option> 
     <option value="more">meer dan 5 personen&lt;/option> 
     </optgroup> 
    <select> 
<div> 

[..] 

<input type="text" name="enroll-address" id="enroll-address" class="default-input-style" placeholder="Je adres" tabindex="10" required> 

現在我通過jQuery替換選擇列表來設置選項列表的樣式。我能想象它醜陋的做法,但到​​目前爲止,它的工作原理

$(".select-container").after("&lt;div class='select-list-container'>&lt;/div>"); 
$(".select-list-container").append("&lt;ul id='select-option-list'>"); 
$(".form-options option").each(function(){ 
    li = '&lt;li id="'+$(this).val()+'">'+$(this).attr('text')+'&lt;/li>'; 
    $("#select-option-list").append(li); 
}); 
$(".select-list-container").append("&lt;/ul>"); 
$(".form-options").hide(); 
$(".select-container").text($(".form-options option:last").attr('text')).click(function(){ 
    $(".select-list-container").toggle("fast"); 
}); 
$("#select-option-list li").live("click", function(){ 
    $(".select-container").text($(this).text()); 
    $(".select-list-container").toggle("fast"); 
    $("#enroll-persons-field").val($(this).attr("id")); 
}); 

希望本文將幫助

alert()undefined結果和$(this).attr('id')是一個合法的值。我測試了:)

EDIT2: 通過將隱藏的輸入字段的select-container div

謝謝大家的幫助外解決它!

+0

從我的pov無法工作的唯一原因是,如果隱藏元素動態添加和/或不在DOM作用域中,當分配值的腳本執行時......說隱藏字段,*註冊-persons-field *有一個默認值,你可以通過alert獲取該值嗎? – optimusprime619

+0

隱藏的字段僅在html中提供。當我給它一個值,alert()仍然返回undefined – Maurice

回答

3

在您的代碼中,$(this).attr('id')在文檔的上下文中運行,該文檔沒有稱爲ID的屬性。將其更改爲$("#enroll-persons-field").attr("id"),或將結果存儲在變量中並使用兩次。

+0

'這個==窗口//返回false' – gilly3

+0

@ gilly3:看起來上下文是'document'而不是'window'。我不知道jQuery將這些作爲上下文傳遞,並且我假定窗口,因爲這是默認的上下文。儘管如此,因爲這裏都不是正確的。 –

+0

我編輯我的文章與完整的代碼,它確實有一個屬性ID,因爲我早些時候定義,或者我失去了它? – Maurice

0

嘗試修改此

$("input#enroll-persons-field").val($(this).attr('id')); 

var text = $("input#enroll-persons-field").attr('id'); 
$("input#enroll-persons-field").val(text); 

如果你想保持你有什麼,你總是可以:

var this = $("input#enroll-persons-field"); 
+0

仍未定義 – Maurice

0
<input type="hidden" name="enroll-persons-field" value="myvalue" id="enroll-persons-field"> 

value是價值,id是id。

+0

也許這是我,但我不明白你的觀點 – Maurice

+0

沒關係,我的壞...;) –

2

從您發佈的代碼中,thisdocument。而$(this).attr("id")相當於document.id。除非您先前在JavaScript中設置了document.id,否則該值將不確定。

http://jsfiddle.net/DpuGh/

你需要去任何你希望this做個參考,並使用它。


順便說一句,$(this).attr("id")是一樣的this.id。這裏沒有意義調用jQuery的開銷。

+0

我總是認爲$(this)適用於被觸發的元素,在這種情況下(參見編輯代碼)被點擊的列表項目 – Maurice

+1

@Maurice - 確實。您的原始代碼在文檔就緒處理程序中有'$(this)',其文檔當然是文檔。在您更新的代碼中,$(this)代表選項元素,並且是正確的。 – gilly3

0

總之你

$("input#enroll-persons-field").val($(this).attr('id')); 

像gilly3指出,並不是指你想要的ID。

$("input#enroll-persons-field").val(function(){ return $(this).attr('id') }); 

會做你所期望的,因爲這ATTR(「ID」)指的是你的「#登記,人場」,而不是文件本身。

+0

不幸的是,這並沒有訣竅 – Maurice

+0

古怪,經過測試,修改後,迄今爲止的答案是無關緊要的。 – Jaibuu