如何将JQuery函数应用于除某些元素之外的所有元素?

4

我在这个问题上有些困惑。我有一个Web应用程序,其中使用了简单的JQuery插件:

$.extend($.fn.disableTextSelect = function() {
    return this.each(function(){
        if($.browser.mozilla){//Firefox
            $(this).css('MozUserSelect','none');
        }else if($.browser.msie){//IE
            $(this).bind('selectstart',function(){return false;});
        }else if ($.browser.webkit) { // chrome, webkit
          $(this).css('webkitUserSelect','none');
          this.onselectstart = function () { return false; };
        }else{//Opera, etc.
            $(this).mousedown(function(){return false;});
        }
    });
});

这个插件通常禁用所有浏览器上的鼠标文本选择。我将其调用在 #desktop 元素上,这基本上是主要包装器:

$('#desktop').disableTextSelect();

我使用这个,因为它禁用了#desktop内所有元素的鼠标文本选择。然而,在#desktop中有一些元素,我希望它们具有正常的文本选择行为。是否有一些简单的方法来实现代码,使其成为全局规则的例外?

2个回答

4
JQuery支持not()选择器(这里)。你可以使用那些你希望具有正常行为的元素的区分特征作为not()选择器的参数。

我已经尝试过这个方法,但是似乎对子元素无效。或者是我的操作有误吗? $('#desktop').not('table,thead,th,tr,td').disableTextSelect(); - Frodik
问题在于desktop的子元素继承了CSS属性。尝试重新设置CSS值,使用$('table').css('webkitUserSelect', 'text')等。 - Harmen
好的,基本上我会像lonesomeday建议的那样使用解决方案,并将其作为插件功能实现,以便按你所说设置特定元素的.css()。 - Frodik

1

最简单的方法是在开始主要逻辑之前进行一些过滤。

$.extend($.fn.disableTextSelect = function() {
    return this.each(function(){
        if ($(this).parents('#excludedItems').length) { //or any other logic here
            return true; //move to the next item
        }

        if($.browser.mozilla){//Firefox
            $(this).css('MozUserSelect','none');
        }else if($.browser.msie){//IE
            $(this).bind('selectstart',function(){return false;});
        }else if ($.browser.webkit) { // chrome, webkit
          $(this).css('webkitUserSelect','none');
          this.onselectstart = function () { return false; };
        }else{//Opera, etc.
            $(this).mousedown(function(){return false;});
        }
    });
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接