在IE6-7中将$(this)与live / delegate结合使用?

时间:2011-08-09 21:00:25

标签: jquery internet-explorer jquery-selectors

我似乎无法从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>

示例使用live(),但我也尝试使用.delegate()进行变体。除IE6 / 7外,这两种方法都适用于所有浏览器。我也尝试过使用click作为事件。有什么想法吗?

我也尝试了here提供的解决方案。问题似乎是在$(this)中没有被正确解释,好像我在live / change / delegate中放置了一个警报,它会正常启动。

6 个答案:

答案 0 :(得分:1)

$(this + ':selected')无效。它将尝试将DOM元素的字符串表示(可能是[object HTMLSelectElement])与:selected连接起来,从而产生“selector”$('[object HTMLSelectElement]:selected')

我想你只想要$(this)。无论如何,select不能是selected

通常,如果您已经有一组选定元素,则可以使用.filter() [docs]过滤某些元素。如果要查找特定的后代,请使用.find() [docs]


但是,您也可以在插入元素后附加事件处理程序:

// or $('#sg-1').change(...
$('.setgroup').change(function(){
    updateSelected($(this).val(), json);
});

DEMO

答案 1 :(得分:1)

使用:

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

答案 2 :(得分:1)

试试这个

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

答案 3 :(得分:1)

您的选择器出错。您正在尝试将元素引用与字符串连接。这不会给你一个有效的选择器。要纠正它,你需要:

$(":selected", this)

或:

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

但是,比这些选项中的任何一个更好的是直接在选择中使用.val()

$(this).val()

答案 4 :(得分:1)

这似乎有效:

$('.setgroup').live('change',function(){

        updateSelected($(this).find(':selected').val(), json);

    });

http://jsfiddle.net/q2wkd/3/

答案 5 :(得分:1)

  

对于未来的访客:

.live()现已弃用。对于跨浏览器支持,在较低版本中使用jQuery 1.7+或.on()时使用.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
});