Pull to refresh
164
0
Роман Дворнов @lahmatiy

Веб-исследователь

Send message
Попробуйте сделать. Будет интересно взглянуть, потому что в свое время у меня не получилось в IE вклинуть слой между слоем контейнером и некоторыми его элементами. В других браузерах было все отлично.
Елки палки. Ну не путайте сайт с веб-приложением. Ajax и все такое без JS не работают. Попробуйте тот же Google Maps без JS.
А насчет запрета правого клика и т.п. согласен, но вы говорите про сайты. А данный код направлен только на веб-приложения.
Использовать свою CSS можно в большинстве браузеров в Opera, FireFox, Internet Explorer. В некоторых только для всех сразу (как в IE). В некоторых можно и свои JS использовать.
Только часто ли вы используете дополнительные CSS/JS в различного рода почтовых веб-клиентах, и других сервисах (Google Maps и т.п.). Есть всякие надстройки для популярных приложений, которые прячут ненужное, или добавляют доп. фишки, но основную суть оставляют (потому что они слишком сложно организованы, чтобы вмешиваться в их работу).
К тому же, еще раз повторяюсь, тут смысл не в том как насолить пользователю, а в обратном. В веб-приложениях выделение текста часто мешает работе некоторой функциональности.
Пожалуйста, читайте внимательней:
Оговоримся, что я не имею ввиду полный запрет с целью защиты текста, а запрет на выделение всевозможных подписей, надписей и т.п. где выделение мешает работе интерфейса и пользователю (чаще всего при drag&drop, или выделении текста при двойном клике). Это в первую очередь касается веб-приложений и ни в коем случае не касается информационных сайтов.
Очень интересно как вы это сделаете кроссбраузерно, особенно в IE. Я как то пытался сделать подобное (совсем не для обсуждаемой задачи) почти везде работало, кроме IE.
К тому же логика верстки настолько усложняет, что мама не горюй.
Ctrl+A скорее лишнее :)
В основном борьба направлена на выделение текста мышью, когда оно не нужно. То есть вместо выделения пользователю предоставляется некоторая другая функциональность, к примеру Drag&Drop или действие на двойной клик.
Есть еще задумки, чтобы выделяя текст выделялись только некоторые текстовые узлы. То есть не выделялись узлы которые не несут информационной нагрузки, к примеру, примеры заполнения полей формы или комментарии к полям, а остальные попадали в выделение.
Вот вам примеры:
1. Некоторый текст, двойной клик по абзацу (параграфу) дает возможность его отредактировать (появляется окно с текстом для редактирования, или сам абзац заменяется TEXTAREA). К примеру в Opera это сделать невозможно (там нельзя перехватить dblclick), интуитивная реакция браузера в даном моменте никому не нужна.
2. Drag&Drop. Вы начинаете тащить элемент. Под курсором таскается копия перетаскиваемого элемента, при этом текст на странице начинает выделяться, реагируя на движения мыши (как будто вы просто выделяете текст), что не очень приятно.
3. Вы хотите выделить несколько строк в таблице. Нажимаете кнопку мыши, начинаете тащить, рисуется рамка выделения. После отпускания строки под рамкой выделяются. Но если вы начнете выделять рамкой нажав на текст, то текст таблицы тоже будет выделяться что в данном случае совсем не нужно.
и т.д. и т.п.
А как же нажатие на элементы (кнопки, ссылки etc), эффект наведения (hover) etc?
Данный скрипт всего лишь не дает выделять текст который не нужно никогда выделять, например, подписи к полям, заголовки колонок таблицы и т.п. Я об этом написал в начале статьи. Защищать текст от копирования никто не собирался.
Зачем кешировать результат теста, если это выполняется один раз?
Как ни странно, в начале файла browser.js.
Вот почему у меня заработало чудесным образом, я немного поменял этот файл (добавил один перевод строки), и фикс перестал использоваться. Не перестаю удивляться.

Когда Opera маскируется под другой браузер, то просто меняет значение UserAgent, все остальное остается прежним.

А насчет правильного фикса, то вот пример того как это делаю я, без ущерба для окружающих. У Оперы есть проблема с методом splice когда второй параметр не указан, то опера ведет себя неверно. Вот фикс:

(function(){ 
var native = Array.prototype.splice;
if ([1,2,3,4,5].splice(3).length == 2)
Array.prototype.splice =
function(){
var params;
for (var i = 0; i < arguments.length; i++)
params.push(arguments);
if (params.length < 2)
params[1] = this.length;
return native.apply(this, params);
}
})();

Как тут можно заметить, фикс не проверяет - является ли браузер Оперой или другим, он просто знает что у определнных браузеров есть такая проблема - проверяет есть ли у данного. Если да, делаем подмену, если нет - то ничего не меняем.

Да как раз про этот перечень я и говорил в тексте. Одно "но". Статья эта давно не обновлялась, и не отражает все фиксы.
О чем и речь.
Починить это поведение (то что у меня не работает) можно, но ведь это не особенность работы браузера, а просто заплатка для того чтобы сайты на Prototype работали, и которая "вроде бы никому не мешает". Проверили пару сайтов, на том и успокоились. Теперь я должен сделать заплатку в своем приложении. Завтра они ее "отменят", заплатка будет ненужной. И т.д.?
Что-то мне не нравятся перспективы :)
В винде %APPDATA%/Opera/[папка в которой установлена опера]/profile/browser.js
Не думаю :)
Больше всего расстраивает в этом тот факт, что не ясно почему так. И так постоянно. Если смотреть на другие браузеры, то там либо работает, либо не работает. А в Опере может работать, а может и не работать - причем причину выяснить часто (как в данном случае) просто невозможно.
Хотя может мы чего то не знаем?
Боюсь что нет. Или заставить всех пользователей Опера потереть этот файл? И то мне кажется не поможет, потому что он постоянно обновляется и подгружается.
Не соглашусь с вами. Что правильного в том что они фиксят работу своего продукта под конкретные условия. А что если его (сайт) завтра переделают, или пофиксят под оперу? В итоге сайт не будет работать потому что опера фиксит то что уже исправлено/изменено. Мне кажется разработчики сайта должны сами заботиться о работоспособности оного в разных браузерах + Опера заботиться чтобы работали сайты без костылей. А так выглядит все таким образом что программу подгоняют под тесты, то есть на данном наборе данных работает, а чуть в сторону все - не работает. А потом разработчики ломают голову почему один и тот же код на этом сайте работает, а на моем нет :(
Кхм.. Ну тогда что-то вроде:

Function.prototype.limitExecByInterval = function(interval) {
var fn = this;
var timer, expireTime = 0;
return function() {
var elapseTime = expireTime - new Date();
if (elapseTime <= 0)
{
timer = clearTimeout(timer);
fn.apply(this, arguments);
expireTime = Number(new Date()) + interval;
} else
if (!timer)
{
var args = arguments;
var scope = this;
timer = setTimeout(function(){
expireTime = 0;
args.callee.apply(scope, args);
}, elapseTime);
}
}
}
</pre>
ЗЫ Насчет того что код более сложный для понимания - кому как :)
я бы сделал все таки немного иначе

Function.prototype.limitExecByInterval = function(interval) {
var fn = this, result;
var timer, startTime = 0;
return function() {
if ((new Date() - startTime) >= interval)
{
timer = clearTimeout(timer); // запрещаем повторное выполнение функции после fn.apply(),
// ведь по его завершению ее выполнения может истечь интервал
// и она вызовется снова
result = fn.apply(this, arguments);
startTime = new Date();
} else
if (!timer)
{
var args = arguments;
var scope = this;
timer = setTimeout(function(){
startTime = 0; // делаем возможным выполнение функции fn, при любом раскладе
args.callee.apply(scope, args);
}, interval);
}
return result;
}
}

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity