javascript - jQuery:最后不适用于混合标签

标签 javascript jquery html

我的 html 如下所示:

<td id="sample">
    <select>
        <option>
    </select>
    <br/>
    <select>
        <option>
    </select>
    <br/>
//...
</td>

我知道我们应该使用 div 而不是 table,但我们的整个网页都是这样设计的,更改它有点耗时。

我想要做的是将事件处理程序添加到最后一个选择标签的更改中。我努力了: $("#sample > select:last")$("#sample").find("select).last()但他们都倾向于在 br 标签之前找到最后一个选择,这意味着第一个选择。我可能可以通过在代码中添加属性来解决这个问题,但这将导致添加全局变量和大量代码。有更清洁的解决方案吗?

编辑: 抱歉,我没有正确理解我的问题,非常感谢所有评论。我想我的问题实际上是我将事件处理程序放在文档就绪部分并附加更多 <select>在该事件处理程序中。因此,每次我尝试触发事件时,它总是会到达原始的 last 元素。

我的代码如下:

$('#sample > select:last').on('change', function() {
    $('#sample > select:first').clone().show().appendTo('#sample');
    $("<br/>").appendTo('#sample');
});

虽然我找到了原因,但我仍然对解决它感到困惑。对此有什么解决方案吗?

最佳答案

您正在动态创建元素,因此您需要动态事件委托(delegate):

动态委派的工作原理如下:

 $("staticElement").on("someevent", "dynamicElement", function)

它用于将事件附加到父元素,并更新最近附加的子元素的外观。
解释一下,在执行时,如果您直接将事件附加到某些元素,例如:$(".foo").click(fn)$(".foo").on("click", fn) 它不会考虑稍后添加的 .foo 元素,因为它们不是 当时在 .foo 集合中。
通过将事件分配给静态父级,事件委托(delegate)将冒泡反向搜索接收该事件的子级(与选择器参数匹配并且是通过 event.target 的同一事件的发起者)。

在您的示例中:

// static Parent // evt ,    dynamic 
$("#sample").on("change",   "> select:last",   function() {
    $('#sample > select:first').clone().show().appendTo('#sample');
    $("<br/>").appendTo('#sample');
});

您的问题的更多详细信息请参见:http://api.jquery.com/on/#direct-and-delegated-events

关于javascript - jQuery:最后不适用于混合标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27516173/

相关文章:

javascript - JS 正则表达式获取两个字符之间的值

php - PHP 和 Jquery 中倾斜和倾斜字符的自定义验证规则

javascript - Node 使用 mysql 或 lodash 将多行合并为一行

javascript - 模式仅在多个按钮上显示最后一个按钮内容

javascript - 呈现为文本内容的内联脚本

php - html 表单预设值字段

javascript - 防止 Jquery Mobile 处理 URL 哈希?

javascript - jQuery JSONP AJAX 请求有时会失败,并显示 "TypeError: Cannot call method ' 完成'未定义”

javascript - Chrome 浏览器版本 72.0.3626.96 错误触发<输入类型 ="file"> 从 javascript 函数单击(文件选择对话框)

c# - HTML 标签 :label with onclick asp. 网络方法。