2

我要做的是断开选择,并取消一些热键(例如Ctrl+ aCtrl+cCtrl+ s

我的代码看起来像这样。

(function($){

    $.fn.ctrl = function(key, callback) {
        if(typeof key != 'object') key = [key];
        callback = callback || function(){
            return false;
        }
        return $(this).keydown(function(e) {
            var ret = true;
            $.each(key,function(i,k){
                if(e.keyCode == k.toUpperCase().charCodeAt(0) && e.ctrlKey) {
                    ret = callback(e);
                }
            });
            return ret;
        });
    };


    $.fn.disableSelection = function() {
        $(window).ctrl(['a','s','c']);
        return this.each(function() {           
            $(this).attr('unselectable', 'on')
            .css({
                '-moz-user-select':'none',
                '-o-user-select':'none',
                '-khtml-user-select':'none',
                '-webkit-user-select':'none',
                '-ms-user-select':'none',
                'user-select':'none'
            })
            .each(function() {
                $(this).attr('unselectable','on')
                .bind('selectstart',function(){
                    return false;
                });
            });
        });
    }
});
$(document).ready(function() {
    $(':not(input,select,textarea)').disableSelection(); <== ERROOR
    $("#navigation").treeview({
        persist: "location",
        collapsed: true,
        unique: true
    });
});

问题是,当我在 Firefox 上打开页面时,在 firebug 上收到以下错误消息

$(":not(input,select,textarea)").disableSelection is not a function 

我错过了什么?有什么建议么?提前谢谢

4

2 回答 2

11

您忘记将 jQuery 传递给您的函数(为了执行它!):

(function($){

    $.fn.ctrl = function(key, callback) { ... }

    $.fn.disableSelection = function() { ... }

})(jQuery); // <--- you forgot this!
于 2012-07-17T15:58:14.943 回答
4
(function($){
   ...
});

很好,从未执行过IEFE 闭包(应该称为 NEFE :-))。通过附加括号来调用它,并将它们之间的参数(例如...(jQuery))传递给函数。或者离开整个函数,在你的情况下你根本不需要闭包。

顺便说一句,您永远不应该尝试使您的页面无法使用 - 用户会逃避它。并且不要忘记尝试使内容不可复制永远不会阻止内容被复制。

于 2012-07-17T15:58:40.637 回答