Jquery 来自动态使用的主干模板控件的事件未触发

Jquery 来自动态使用的主干模板控件的事件未触发,jquery,backbone.js,Jquery,Backbone.js,我需要根据用户的选择显示div:1、2或3。如果选择了一个,则只会从主干模板填充一个div。如果两个,将填充两个div,对于三个div,将填充三个div。第一个在主干初始化阶段填充。问题是,在初始化阶段从模板加载的来自第一个div的select控件将触发其更改事件。但另外两个div的选择控制按钮没有启动。我的代码结构如下: <input type="radio" name="chooseRadio" value="1" checked="checked" /> Choose

我需要根据用户的选择显示div:1、2或3。如果选择了一个,则只会从主干模板填充一个div。如果两个,将填充两个div,对于三个div,将填充三个div。第一个在主干初始化阶段填充。问题是,在初始化阶段从模板加载的来自第一个div的select控件将触发其更改事件。但另外两个div的选择控制按钮没有启动。我的代码结构如下:

    <input type="radio" name="chooseRadio" value="1" checked="checked" /> Choose 1
    <input type="radio" name="chooseRadio" value="2" /> Choose 2
    <input type="radio" name="chooseRadio" value="3" /> Choose 3
    <div id="locations">
        <div id="divLoc1">
        </div>
        <div id="divLoc2">
        </div>
        <div id="divLoc3">
        </div>
    </div>
    <script type="text/template" id="template1">
        <select id="select1" class="added-later">
            <option value="test1">test 1</option>
            <option value="test2">rest 2</option>
        </select>
    </script>
    <script type="text/javascript">
        $(function () {
            var loc = Backbone.Model.extend({
                current: 1,
                template: _.template($('#template1').html()),
                events: {
                    'change #select1': 'onSelectChange'
                },
                onSelectChange: function () {
                    alert('yes');
                },
                initialize: function () {
                    var loc1 = this.template();
                    $('#divLoc1').html(loc1);
                    $(this.loc2).hide();
                    $(this.loc3).hide();
                },
                maintainLocations: function () {
                    alert(this.current);
                    switch (this.current) {
                        case '1':
                            $('#divLoc2').hide();
                            $('#divLoc3').hide();
                            break;
                        case '2':
                            var loc1 = this.template();
                            $('#divLoc2').html(loc1);
                            $('#divLoc2').show();
                            $('#divLoc3').hide();
                            break;
                        case '3':
                            var loc1 = this.template();
                            $('#divLoc2').html(loc1);
                            $('#divLoc3').html(loc1);
                            $('#divLoc2').show();
                            $('#divLoc3').show();
                            break;
                    }
                }
            });
            var appView = new loc();

            $('input[name=chooseRadio]').click(function () {
                var val = $(this).val();
                appView.current = val;
                appView.maintainLocations();
            });

            $('#select1').change(function () {
                alert('fired!');
            });
        });

    </script>

我正在使用主干1.1.2。有什么想法吗?

这可能是因为当您连接jquery事件处理程序时,它只连接DOM中现有元素的处理程序

对于插入[或被插入]的每个新DOM元素,必须重新调用事件处理程序连接代码

例如

    function wireUpHandlers() {

      $('input[name=chooseRadio]').click(function () {
                    var val = $(this).val();
                    appView.current = val;
                    appView.maintainLocations();
                });

                $('#select1').change(function () {
                    alert('fired!');
                });


    }

    $(document).ready(function() {
        wireUpHandlers();
    });

现在,每当您在页面中添加新HTML时,请再次调用WireUpHandler,这些处理程序也将用于添加的新元素。

主干视图可以通过events属性从动态生成的DOM元素接收事件,只要动态生成的DOM元素是视图el的后代。但是@chridam我在这里使用的是模型,而不是视图。为什么您使用的模型就像它是视图一样?很明显,视图具有事件并与DOM交互,而不是与模型交互。您的代码不起作用,因为它没有任何意义。正如我所意识到的,上面的模型应该是视图,并且应该指定$el元素。之后,我可以从$el及其所有子项检测事件,并相应地采取行动。我想我弄乱了问题中的模型和视图概念。我一点也不清楚。谢谢大家。你们的方式是有效的,而且WireUpHandler无法脱离文档就绪块。然而,我正在寻找一种方法。你能为我的案子提出同样的建议吗?谢谢。据我所知,主干和jQuery事件处理程序不在同一条路径上。。因此,我不认为有任何方法可以做到这一点。因为无法让jQuery知道将事件处理程序绑定到主干追加的动态HTML元素