jQuery事件委托

时间:2013-02-04 01:50:03

标签: javascript jquery javascript-events callback

我需要一些关于回调的帮助。出于某种原因,它们的效果并不好 我正在用jQuery制作游戏。我有一个<div id='button'></div>用于游戏中的所有按钮。游戏将有两个按钮来进行操作,并在其上面提出问题。问题由<h3 id='text'></h3>控制。我想知道的是,由于某种原因,我无法将回调函数设置为按钮的ID。在例子中, 我有或者没有,它们通过jQuery设置了自己的id:

$('#button').html('<button id='yes'>Yes</button><button id='no'></button>');
但出于某种原因,我可以设置这个:

$('yes').click(function(){
  //function I would want
});

当然,这不是我的代码所拥有的,这只是一个例子。这是真正的代码:

$(document).ready(function(){
    $('#main,#batman,#car,#cop,#hobo,#knife,#gangfight,#ganggun,#gangknife,#blood,#hr').hide(-100);
    var hr=$('#hr');
    var main=$('#main');
    var batman=$('#batman');
    var car=$('#car');
    var hobo=$('#hobo');
    var cop=$('#cop');
    var knife=$('#knife');
    var gangfight=$('#gangfight');
    var ganggun=$('#ganggun');
    var gangknife=$('#gangknife');
    var blood=$('#blood');
    var text=$('#text');
    var button=$('#button');
    $('#start').html('Are you ready to play?');
    $('#button').html('<button id="yes">Yes</button><button id="no">No</button>');
        $('#yes').click(function(){
            $('#yes,#no').hide(function(){
                $('#start').hide();
                main.fadeIn(-100);
                hr.fadeIn(-100,function(){
                text.delay(1000).html("You were just wandering around in the streets of new york, when suddenly.. You see batman!! You've never really liked him, what do you do?")
                    button.html('<button id="fight">Fight</button><button id="leave">Leave</button>',function(){
                        batman.fadeIn(1000);
                        $('fight').click(function(){
                        });
                        $('leave').click(function(){
                            text.fadeOut(function(){
                                text.text('Good call. As you leave, you encounter a hobo. What do you do?');
                            });
                        });
                    });
                });
            });
        });
        $('#no').click(function(){
            $('#yes,#no').hide();
            $('#start').text('Oh, okay then. Come back later!');
        });
    });

我只是想知道..如何将回调功能设置为'战斗'和'离开' 如果你想知道为什么一开始就有所有这些变量,那些只是图像和字符。

4 个答案:

答案 0 :(得分:3)

您不能在不存在的元素上设置click处理程序。你应该做的是使用.on绑定树上的元素。类似的东西:

$("#someparentelement").on("click", "#yes", function() {
    // your code
});

答案 1 :(得分:1)

您使用的是哪个版本的jQuery?你可能应该在这种情况下使用jQuery.on(),因为你的点击处理程序代码可能会在按钮在DOM中实际可用之前执行。

$("#button").on("click", "#yes", function (event) {
    // Your yes-button logic comes here.
});

有关详细信息和可能性,请参阅jQuery documentation中的.on(events [, selector ] [, data ], handler(eventObject))方法:

  

如果省略selector或为null,则事件处理程序称为直接或直接绑定。每次在所选元素上发生事件时都会调用该处理程序,无论它是直接发生在元素上还是来自后代(内部)元素的气泡。

     

提供选择器时,事件处理程序称为委托。当事件直接发生在绑定元素上时,不会调用处理程序,但仅适用于与选择器匹配的后代(内部元素)。 jQuery将事件从事件目标起泡到附加处理程序的元素(即最里面到最外层的元素),并为该路径上与选择器匹配的任何元素运行处理程序。

在这种情况下,您希望delegate该事件,因为当您绑定事件时,您的元素尚未在DOM中可用。

答案 2 :(得分:0)

请勿使用click(),使用on('click')并将其附加到文档中。

以这种方式创建处理程序,将确保任何新元素都能够触发事件。

答案 3 :(得分:0)

$('fight')选择战斗标记,而不是战斗ID的标记。尝试使用$('#fight')代替。