javascript - jQuery 不调用警报框

标签 javascript jquery ajax

我有以下内容:

<script language="javascript" type="text/javascript">
    $(document).ready(function() {
        $.getJSON(
            "/myServer/getAllWidgets",
            function(data) {
                var optionsHTML = "<select id='widget-sel'>";
                optionsHTML += "<option selected='selected' id='default'>Select an option</option>";
                var len = data.length;
                for(var i = 0; i < len; i++) {
                    optionsHTML += '<option value="' + data[i] + '">'
                        + data[i] + '</option>';
                }

                optionsHTML += "</select>";

                $('#widget-sel-div').html(optionsHTML);
            }
        );

        $("#widget-sel").change(function() {
            alert("Hello!");
        });
    });
</script>

<div id="widget-sel-div"></div>

因此,我们的想法是,当 document.ready 触发时,它会使用选择框 (widget-sel) 填充 widget-sel-div code>),然后为该选择创建一个更改处理程序,仅打印“Hello!”通过警报框显示到屏幕。

当我运行这个程序时,我没有收到任何错误(Firebug 根本不提示),并且选择会填充来自对 /myServer/getAllWidgets 的 AJAX 调用的所有小部件。 问题是,更改处理程序不起作用:当我选择一个小部件时,我没有收到警报框。有人能发现我哪里出了问题吗?提前致谢。

最佳答案

在代码运行时,DOM 中不存在 #widget-sel 元素,因为您将其添加到 getJSON 的回调中(即异步)。当事件处理程序尚不存在时,您无法将其绑定(bind)到它。

为了解决这个问题,您可以使用 .on() 将事件处理程序委派到 DOM 树的更高层(在这种情况下,您可以使用父 div)。方法(jQuery 1.7+,如果您使用的是旧版本,请使用 .delegate() 代替):

$("#widget-sel-div").on("change", "#widget-sel", function () {
    alert("Hello!");
});

关于javascript - jQuery 不调用警报框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13745457/

相关文章:

javascript - 为什么我用rotateY(180deg)时有时间空白

javascript - Highcharts 错误 #13 和 AngularJs

javascript - 如何通过JQuery/Javascript优化列表框绑定(bind)C#代码?

ajax - 如何使用 mozilla sdk 分离内容脚本?

javascript - 使用 JavaScript 更改 anchor 文本

javascript - 我想在删除按钮旁边添加编辑按钮,这样我就可以编辑我已经插入的值

javascript - 如何渲染一个 React 组件 x 次?

javascript - jQuery 查找具有特定属性的所有元素并获取它的值

python - Bottle POST 方法 - 获取查询参数

javascript - 使用 jQuery.ajax 发送带有数据 :image/png;base64 的 multipart/formdata