2011-08-09 60 views
1

我似乎無法從在IE6/IE7中查看時動態創建的選擇選項中獲取值。 IE總是返回undefined作爲值。

我有一個設置a fiddle,以下是一個例子的完整源代碼(如果你試圖在IE6/7用小提琴...嘿嘿):

<!doctype html> 
<head> 
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script> 
<script> 
var json = "blah blah blah"; 

jQuery(document).ready(function(){ 

    $('#myForm').html('<select id="sg-1" class="setgroup" name="sg-1"><option value="s-1">Something</option><option value="s-2">Another</option><option value="s-3">Third</option><option value="s-4">Fourth</option></select>'); 

    $('.setgroup').live('change',function(){ 
     updateSelected($(this + ':selected').val(), json); 
    }); 

}); 

function updateSelected(value, json){ 
    //do some stuff with the json in my app 
    $('#selected').html(value + ' was selected'); 
} 
</script> 
</head> 
<body> 
<form id="myForm"> 
</form> 
<p id="selected" style="font-size:20px; color:#f00;"></p> 
</body> 
</html> 

的示例使用現場( ),但是我也使用.delegate()嘗試了一個變體。這兩種方法都適用於除IE6/7以外的所有瀏覽器。我也嘗試使用點擊作爲事件。有任何想法嗎?

我也嘗試過提供的解決方案(s)here。這個問題似乎在$(this)中沒有被正確解釋,就好像我將一個alert放在live/change/delegate中,它會正確觸發。

回答

1

$(this + ':selected')不起作用。它會嘗試連接一個DOM元素的字符串表示,該元素可能是[object HTMLSelectElement],與:selected連接,產生「選擇器」$('[object HTMLSelectElement]:selected')。我想你只想要$(this)。無論如何,A select不能是selected

通常,如果您已經有一組選定的元素,則可以使用.filter()[docs]過濾某些元素。如果你想找到特定的後代,然後使用.find()[docs]


但是,你還可以將事件處理程序中插入的元素後:

​​

DEMO

+0

我原來是輸入反應在犯錯 - $(這)是實際可行的用'live'在IE6和IE7。 – Nick

+0

問題顯然是字符串連接:'$(this +':selected')' - IE怪胎,顯然其他瀏覽器放棄串接,只是試圖$(this),它的工作。 – Nick

+0

@hztetra:它不應該在任何瀏覽器中工作,但你是對的,它在Chrome中起作用。奇怪的....我希望你現在知道,至少它是錯誤的連接'this'與一個字符串。它在其他瀏覽器中工作並不重要,它是不正確的。 –

1

用途:

$('.setgroup').live('change',function(){ 
    updateSelected($(this).val(), json); 
}); 
+0

它適用於IE7。我沒有檢查IE6。 http://jsfiddle.net/q2wkd/5/ – Darm

+0

它確實有效 - 這是我的一個錯誤(保存一個文件並查看另一個文件;))。謝謝 :) – Nick

1

試試這個

$('.setgroup').live('change',function(){ 
    updateSelected($(this).val(), json); 
}); 
1

您在選擇器中出現錯誤。您試圖將元素引用與字符串連接起來。這不會給你一個有效的選擇器。要糾正它,你想要麼:

$(":selected", this) 

或:

$(this).find(":selected") 

但是,比這些選項更好的將是在選擇只使用.val()直接:

$(this).val() 
1

對於未來的用戶:

.live()現在已經過時了。對於跨瀏覽器支持,當您在較低版本中使用jQuery 1.7+或.delegate()時,請使用.on()

。對()的例子:

jQuery(document).on('change', '.setgroup', function(){ 
     updateSelected($(this).val(), json); // your javascript code goes here 
}); 

.delegate()例如:

$(document).delegate('.setgroup', 'change', function() { 
    updateSelected($(this).val(), json); // your javascript code goes here 
});