Как запретить выделение текста на JS

  • На форуме работает ручное одобрение пользователей. Это значит, что, если Ваша причина регистрации не соответствует тематике форума, а также Вы используете временную почту, Ваша учётная запись будет отклонена без возможности повторной регистрации. В дальнейшем - пожизненная блокировка обоих аккаунтов за создание мультиаккаунта.
  • Мы обновили Tor зеркало до v3!
    Для входа используйте следующий url: darkv3nw2...bzad.onion/
  • Мы вновь вернули telegram чат форуму, вступайте, общайтесь, задавайте любые вопросы как администрации, так и пользователям!
    Ссылка: https://t.me/chat_dark_time

GM`ka

Ненадежный

GM`ka

Ненадежный
13 Сен 2015
294
157
1. Выполнить preventDefault для событий onselectstart и onmousedown
Код:
var element = document.getElementById('content');
element.onselectstart = function () { return false; }
element.onmousedown = function () { return false; }
2. Добавить атрибут unselectable
Код:
$(document.body).attr('unselectable', 'on')
3. Добавить стиль user-select: none
Код:
.g-unselectable {
  -moz-user-select: none;
  -khtml-user-select: none;
  -webkit-user-select: none;
  user-select: none;
}
Есть и безумные решения данной проблемы:
4. По таймеру чистить Range, TextRange, Selection
5. Рендерить текст на канвасе
6. Использовать disabled textarea
Код:
<textarea disabled="disabled" style="border:none;color:#000;background:#fff; font-family:Arial;">
    Как запретить выделение текста на JS?
</textarea>
Вот микроплагин для jQuery, использующий методы 1-3
Код:
$.fn.disableSelection = function() {
    function preventDefault () {
        return false;
    }
    $(this).attr('unselectable', 'on')
           .css('-moz-user-select', 'none')
           .css('-khtml-user-select', 'none')
           .css('-o-user-select', 'none')
           .css('-msie-user-select', 'none')
           .css('-webkit-user-select', 'none')
           .css('user-select', 'none')
           .mousedown(preventDefault);
           .each(function() {
               this.onselectstart = preventDefault;
           });
};
Этот плагин не спасет от Ctrl+A Ctrl+C в тех браузерах, которые не поддерживают user-select или unselectable. А вообще запрещать выделение — зло.

Как узнать в какую сторону юзер крутит колесо мыши?
Есть 2 события, реагирующие на скролл колесом 'DOMMouseScroll' (Firefox) и 'mousewheel' (остальные)
Обработчик:
Код:
function wheel(event){
    var delta = 0;
    if (!event) event = window.event; // Событие IE.
    // Установим кроссбраузерную delta
    if (event.wheelDelta) {
        // IE, Opera, safari, chrome - кратность дельта равна 120
        delta = event.wheelDelta/120;
    } else if (event.detail) {
        // Mozilla, кратность дельта равна 3
        delta = -event.detail/3;
    }
    if (delta) {
        // Отменим текущее событие - событие поумолчанию (скролинг окна).
        if (event.preventDefault) {
            event.preventDefault();
        }
        event.returnValue = false; // для IE
       
        // если дельта больше 0, то колесо крутят вверх, иначе вниз
        var dir = delta > 0 ? 'Up' : 'Down',
    }
}
Не все элементы могут порождать скролл-событие. Зависит от конкретного браузера.

Как определить какая кнопка мыши нажата на JS?
Событие mousedown mouseup вызывают все кнопки мыши, click — только левая. В обработчике события необходимо проверить код кнопки event.button, чтобы узнать какая была нажата:
(0 — Левая, 1 — Средняя, 2 — Правая). В ИЕ8- все не так, см. код:
Код:
var button = document.getElementById('button'),
              //  0       1         2
    buttonMap = ['Left', 'Middle', 'Right'],
    handler = function (event) {
        event = event || window.event;
        alert(buttonMap[event.button] + ' id: ' + event.button);
    };

if (button.addEventListener) {
     button.addEventListener('mousedown',  handler, false);     
} else {
     // IE         0      1       2        3      4
     buttonMap = ['???', 'Left', 'Right', '???', 'Middle'];
     button.attachEvent('onmousedown',  handler);
}
jQuery чинит этот недостаток ИЕ, в нем стоит проверять event.which вместо магии с event.button
Код:
$('button').mousedown(function (event) {
    alert(['Left', 'Middle', 'Right'][event.which]);
});
Пример: jsfiddle.net/azproduction/W2XgH/

Как при помощи window.open() открыть именно новое окно, а не вкладку?
Это поведение зависит от конкретного браузера. Опера всегда открывает вкладку (но она представляется в виде окна), Сафари всегда открывают окно (поведение Сафари можно обойти). Хром, ФФ и ИЕ управляемы.

Если передать дополнительные параметры — позицию окна, то откроется новое окно:
Код:
window.open('http://www.google.com', '_blank', 'toolbar=0,location=0,menubar=0');
Если ничего не передать, то откроется таб:
Код:
window.open('http://www.google.com');
Чаще требуется отрыть новый таб, тут может быть проблема с сафари: по умолчанию (зависит от настроек) сафари при любом вызове функции window.open открывает новое окно. Но при клике на ссылку с нажатыми Ctrl+Shift/Meta+Shift всегда открывает новый таб (независимо от настроек). Для открытия нового таба будем эмулировать событие «click» с нажатыми Ctrl+Shift/Meta+Shift:
Код:
function safariOpenWindowInNewTab(href) {
    var event = document.createEvent('MouseEvents'),
        mac = (navigator.userAgent.indexOf('Macintosh') >= 0);

    // выполняем Ctrl+Shift+LeftClick/Meta+Shift+LeftClick (фокус)
    // создаем собственное событие
    event.initMouseEvent(
        /* type */          "click",
        /* canBubble */     true,
        /* cancelable */    true,
        /* view */          window,
        /* detail */        0,
        /* screenX, screenY, clientX, clientY */ 0, 0, 0, 0,
        /* ctrlKey */       !mac,
        /* altKey */        false,
        /* shiftKey */      true,
        /* metaKey */       mac,
        /* button */        0,
        /* relatedTarget */ null
    );

    // создаем ссылку в памяти и кликеам этм событием по ссылке - откроется новый таб
    $('<a/>', {'href': href, 'target': '_blank'})[0].dispatchEvent(event);
}
Как выполнить XHR без jQuery?

Не кросс-браузерная функция:
Код:
function xhr(m,u,c,x){with(new XMLHttpRequest)onreadystatechange=function(x){readyState^4||c(x.target)},open(m,u),send(с)}
Кросс-браузерная, немного длиннее:
Код:
function xhr(m,u,c,x){with(new(this.XMLHttpRequest||ActiveXObject)("Microsoft.XMLHTTP"))onreadystatechange=function(x){readyState^4||c(x)},open(m,u),send(с)}
Использование:
Код:
xhr('get', '//ya.ru/favicon.ico', function(xhr){console.dir(xhr)});
Получение произвольного значения массива :
Код:
var items = [12,548,'a',2,5478,'foo',8852,'Doe',2145,119];
var randomItem = items[Math.floor(Math.random() * items.length)];
Получение произвольного числа в определенном диапазоне :
Данный пример может использован, когда необходимо сгенерировать какие-либо фейковые данные, чтобы протестировать что-нибудь, к примеру, зарплаты, находящиеся между минимальными и максимальным значением:
Код:
var x = Math.floor(Math.random() * (max - min + 1)) + min;
Генерация численного массива от 0 до max:
Код:
var numbersArray = [] , max = 100;
// numbers = [0,1,2,3 ... 100]
for( var i=1; numbersArray.push(i++) < max;);
Генерация произвольного набора символов:
Код:
Код:
function generateRandomAlphaNum(len) {
  var rdmString = "";
  for( ; rdmString.length < len; rdmString  += Math.random().toString(36).substr(2));
  return  rdmString.substr(0, len);
}
 

О нас

  • Наше сообщество существует уже много лет и гордится тем, что предлагает непредвзятое, критическое обсуждение различных тем среди людей разных слоев общества. Мы работаем каждый день, чтобы убедиться, что наше сообщество является одним из лучших.

    Dark-Time 2015 - 2024

    При поддержке: XenForo.Info

Быстрая навигация

Меню пользователя