在特定DOM元素

时间:2015-09-03 06:35:31

标签: javascript jquery backbone.js

我正在尝试通过jquery绑定键盘事件ctrl + z,只有在渲染骨干视图时以及删除视图时,我正在解除绑定。但问题是我只想解除当前视图中的ctrl + z事件。

初始化视图:

$(document).keydown(function(e){
                if((e.which === 90 && e.ctrlKey && e.shiftKey) || (e.which === 89 && e.ctrlKey)){
                    console.log('control + shift + z || control + y');
                    //redoAction;
                }
                else if(e.which === 90 && e.ctrlKey){
                    console.log('control + z');
                    //undoAction;
                }          
            }); 

删除视图时:

$(document).off('keydown'); 

但是最后一个语句将取消绑定所有键盘监听器。我不希望这样。

3 个答案:

答案 0 :(得分:2)

在声明中为处理函数命名(或通过将其赋值给变量)。然后,您可以使用该名称来引用.off()中的处理程序:

// Create a named function
function handler (e) {
    if((e.which === 90 ...)
}

// Attach event
$(document).on('keydown', handler);
//Detach event
$(document).off('keydown', handler); 

答案 1 :(得分:0)

尝试使用带有选择器的“on”处理程序,然后您可以使用相同的选择器以'off'取消事件。以下是一个基本的例子,虽然不完全在你的问题空间,但这个概念也应该对你有用。

<p id="pOne">Click this paragraph to change its background color.</p>
<button id="btn1">Remove the click event with off()</button>

<script>
$(document).ready(function(){
    $(document).on("click","#pOne",function(){ //Notice use of "on" here
        $(this).css("background-color", "pink");
    });

    $("#btn1").click(function(){
        $(document).off('click','#pOne'); 
       //Notice here same selector: #pOne, used with "on"
    });
});
</script>

要检查特定事件,可以使用handler function作为与其他jQuery事件类似的最后一个参数。

来自jQuery 'Off' documentation

的更多信息

希望这可以帮助你。

答案 2 :(得分:0)

您可以利用jQuery的事件命名空间功能:

// Add multiple listeners under the 'foo' namespace.
$(document).on('keydown.foo', handler1);
$(document).on('keyup.foo', handler2);

// Unbind all listeners at once without keeping reference to the various handlers.
$(document).off('.foo');

这实际上是Backbone的View类使用的模式,可以轻松删除框架添加到视图的DOM元素的所有处理程序。