angularjs 使用Angular 指令禁用文本选择

lawou6xi  于 2023-02-18  发布在  Angular
关注(0)|答案(2)|浏览(185)

我正在学习JavaScript和AngularJS。
我想用Angular 指令禁用文本选择。
我有一个JavaScript代码用于该函数:

function clearSelection() {
    if(document.selection && document.selection.empty) {
        document.selection.empty();
    }
    else if(window.getSelection) {
        var sel = window.getSelection();
        sel.removeAllRanges();
    }
};

我正在写指令,但不知道如何将该函数添加到指令中。
指令:

...
.directive('disableTextSelection', function() {
    return {
        link: function($scope, $element, $attrs) {
            // Something here..
        }
    }
}
...

我想在HTML中这样做:

<table disable-text-selection>
    ...
</table>
92dk7w1h

92dk7w1h1#

AngularJS和更全球化的JavaScript都不是这样做的好东西。
应使用如下所示的CSS属性

.disable-text-selection {
    -webkit-touch-callout: none;
    -webkit-user-select: none;
    -khtml-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
}

编辑
Angular指令通常用于修改DOM或添加一些特性,如许多jQuery插件,而不是将函数绑定到DOMnode(或在本例中使用ng-click)。
您的函数可以清除IE上的选择,但必须绑定一个事件才能激活它。
无论如何,在您的情况下,您应该使用链接函数中提供的第二个参数(在编译和所有控制器声明之后调用),并将其绑定到您的函数调用。

link: function($scope, $element, $attrs) { 
    $element.bind('click', clearSelection) 
}
bcs8qyzn

bcs8qyzn2#

如果有人偶然发现了这个问题,并且仍然在考虑使用指令作为解决方案,我们实现了类似下面的东西,似乎对我们所有的情况都很有效

import { Directive, ElementRef, HostListener } from '@angular/core';

@Directive({
  selector: '[copyProtection]' ,
  host: {
    '[style.-webkit-touch-callout]': '"none"',
    '[style.-webkit-user-select]': '"none"',
    '[style.-khtml-user-select]': '"none"',
    '[style.-moz-user-select]': '"none"',
    '[style.-ms-user-select]': '"none"',
    '[style.user-select]': '"none"',
  }
})
export class CopyProtectionDirective {

  @HostListener('selectstart') onSelectStart() {
    return false;
  }

  constructor(private elementRef: ElementRef) { }
}

相关问题