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

Posted

技术标签:

【中文标题】在 IE6-7 中将 $(this) 与 live/delegate 结合使用?【英文标题】:Using $(this) in combination with live/delegate in IE6-7? 【发布时间】:2011-10-23 14:15:00 【问题描述】:

我似乎无法从在 IE6/IE7 中查看时动态创建的选择选项中获取值。 IE 总是返回 undefined 作为值。

我有一个设置a fiddle,下面是一个示例的完整源代码(如果您尝试在 IE6/7 中使用 fiddle ...呵呵):

<!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 中放置了一个警报,它会正确触发。

【问题讨论】:

【参考方案1】:

$(this + ':selected') 将不起作用。它将尝试将 DOM 元素的字符串表示形式(可能是 [object HTMLSelectElement])与 :selected 连接起来,从而产生“选择器”$('[object HTMLSelectElement]:selected')

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

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


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

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

DEMO

【讨论】:

我最初的反应是错误的——$(this) 实际上在 IE6 和 IE7 中可以与 live 一起使用。 问题显然是字符串连接:$(this + ':selected') -- IE 怪胎,显然其他浏览器放弃了连接,只是尝试 $(this),它有效。 @hztetra:它不应该在任何浏览器中工作,但你是对的,它在 Chrome 中工作。奇怪....我希望您现在至少知道将this 与字符串连接是错误的。没关系,在其他浏览器上也行,不正确。 @hztetra:不,它不会忽略串联。您可以尝试alert($(this + ':selected').selector) 来查看结果选择器。我不知道它为什么起作用。 我确实这样做了,并且正在查看我是否在其他任何地方尝试过 :) 感谢您的帮助。【参考方案2】:

用途:

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

【讨论】:

它确实有效——这是我的错误(保存一个文件并查看另一个文件;))。谢谢:)【参考方案3】:

试试这个

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

【讨论】:

【参考方案4】:

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

$(":selected", this)

或:

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

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

$(this).val()

【讨论】:

【参考方案5】:

这似乎有效:

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

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

    );

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

【讨论】:

【参考方案6】:

对于未来的访客:

.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
);

【讨论】:

以上是关于在 IE6-7 中将 $(this) 与 live/delegate 结合使用?的主要内容,如果未能解决你的问题,请参考以下文章

在 jQuery 中将 live() 变成 on()

jQuery next() 不能与 live() 一起使用

在一个露天项目中将 live-search-docs 配置文件放在哪里?

IE6 + 7 - 双底边距

jQuery解决IE6、7、8不能使用 JSON.stringify 函数的问题

如何在 React 中将函数与钩子绑定?