- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
(function(G, D) {
"use strict";
var $ = G.jQuery,
listener;
function addListener(elem, fn) {
function handler(event) {
event = event || G.event;
var dx = event.DeltaX || event.wheelDeltaX || event.detail || 0,
dy = event.DeltaY || event.wheelDeltaY || event.detail || 0;
event.dx = dx === 0 ? 0 : dx / Math.abs(dx);
event.dy = dy === 0 ? 0 : dy / Math.abs(dy);
fn(event);
}
if (elem.addEventListener) {
if (D.hasOwnProperty('onwheel')) { //Modern browsers
listener = "wheel";
} else if (D.hasOwnProperty('onmousewheel')) { //Old browsers
listener = "mousewheel";
} else { //FF<17
listener = "MozMousePixelScroll";
}
elem.addEventListener(listener, handler, false);
} else { //IE<9
elem.attachEvent("onmousewheel", handler);
listener = "onmousewheel";
}
}
function removeListener(elem) {
if (elem.removeEventListener) {
elem.removeEventListener(listener);
} else {
elem.detachEvent(listener);
}
}
$.fn.mousewheel = function(fn) {
return this.each(function() {
addListener(this, fn);
});
};
$.fn.unmousewheel = function(fn) {
return this.each(function() {
removeListener(this, fn, false);
});
};
}(this, document));
Написал плагин для jQuery, который цепляет на элементы обработчик события вращения колесика мыши. Что скажете? Как бы вы написали функцию unmousewheel()?
1024-- 10.06.2014 17:44 # +1
2. removeEventListener удаляет undefined
dunmaksim 11.06.2014 08:07 # 0
absolut 11.06.2014 09:22 # +1
Только если там говна еще больше
1024-- 11.06.2014 11:55 # +4
1. Значение listener всё так же одно на всех, его всё ещё можно изменить.
2. Настоятельно рекомендую автору открыть https://developer.mozilla.org/en-US/docs/Web/API/EventTarget.removeEventListener и кормить removeEventListener нужными ему аргументами (да и detachEvent тоже)
В новой версии добавлено:
1. typeof x === "array". В текущей версии JS typeof [] === "object". [] instanceof Array может при каких-то случаях глюкнуть, но в вашем jQuery есть isArray http://api.jquery.com/jquery.isarray/
2. for (i in this.wheelEvents) - не надо так.
3. Кажется (по сигнатуре), что removeListener удаляет только одну функцию, но нет, это обман, он удаляет все сразу.
4. А в строке 58 пропущено "elem." Из-за того, что typeof elem.wheelEvents никогда не примет значение "array", строка 58 никогда не вызовется и "use strict" не спасёт.
5. elem.wheelEvents = []; - нехорошо как-то дополнять объекты
(хотя, в jQuery, судя по исходникам (src/data/Data.js, src/event.js), дополняют объект полем с уникальным для каждого экземпляра Data именем (jQuery.expando + Math.random()) и уникальным для каждого объекта значением (Data.uid++), а данные хранят в экземпляре Data). Раз уж так вышло, что в объект что-то добавлено, можно и строку listener в сам объект складывать.
Но раз в jQuery для привязывания событий используют Data, надо бы и автору посмотреть http://api.jquery.com/jquery.data/.
dunmaksim 11.06.2014 13:55 # 0
1024-- 11.06.2014 14:43 # +1
Я не знаю традиций пользователей jQuery, потому меня имена немного смущают: вдруг их кто-нибудь займёт. А может, так и надо.
> $.data(elem, "wheelListener", undefined);
Ха-ха, undefined не пройдёт.
http://james.padolsey.com/jquery/#v=1.10.2&fn=_internalData:
dunmaksim 11.06.2014 14:49 # 0
Хранить что-либо в свойствах объекта я тоже считаю неправильным, однако же, нет никакого другого способа в данном случае корректно управлять списком обработчиков.
kegdan 11.06.2014 09:39 # −1
dunmaksim 11.06.2014 10:02 # 0
https://github.com/dunmaksim/mousewheel
kegdan 11.06.2014 10:17 # −1
ну что за однострочное блядство(
dunmaksim 11.06.2014 10:27 # +1
roman-kashitsyn 11.06.2014 11:24 # +4
kegdan 11.06.2014 11:38 # −1
bormand 11.06.2014 11:28 # 0
kegdan 11.06.2014 11:37 # −1
в общем это некрасиво, а я эстет
dunmaksim 11.06.2014 12:04 # 0
kegdan 11.06.2014 12:06 # −2
bormand 11.06.2014 12:26 # 0
Я с тобой согласен. И, наверное, как минимум половина других разрабов тоже. Нормальный байткод как в жабе или шарпе был бы удобней и шустрее.
Но к сожалению минифицированный жабоскрипт это единственное промежуточное представление, которое работает в браузерах. И все новые языки типа кофейного свитка или печатного свитка компилятся именно в него. И новое внедрить будет очень сложно, а на практике - почти нереально. Так что считай это просто байткодом, и не читай :)
kegdan 11.06.2014 12:34 # −1
1024-- 11.06.2014 12:37 # +1
> Грустно все это.
Если минифицированный вариант будет длиннее где-то 500 символов, в большинстве случаев будет уже больше одной строчки. Не грусти, товарищ!
kegdan 11.06.2014 12:41 # 0
Спасибо, отпустило
bormand 11.06.2014 12:37 # 0
Бинарники ты тоже открываешь в редакторе, а потом обзываешь нечитаемым блядством? Просто считай эти файлы бинарниками. Увидел файл .min.js - пройди мимо, или найди его оригинал на сайте разрабов.
P.S. Отладчик огненной лисы, к слову, умеет превращать этот минифицированный код в читаемый и многострочный. Правда названия переменных он уже не восстановит, и они так и останутся a, b, c и т.п.
kegdan 11.06.2014 12:40 # −1
1024-- 11.06.2014 12:46 # +3
А вдруг он олдфаг и поклонник PDP-11. А тут уже 2014й на дворе и гигабайты нечитаемого блядства.
> Отладчик огненной лисы
(для справки) И Webkit Devtools умеет, кнопка {}
guest 12.06.2014 23:52 # −1
DrDre 12.06.2014 21:47 # +1
1024-- 12.06.2014 21:56 # +1
Lure Of Chaos 11.06.2014 14:49 # 0
mousewheel.min.map в помощь
kegdan 11.06.2014 10:21 # 0
а функции знака нет?
или компаратора -1,0,1 ?
типа
dx = comp(dx,0);
dunmaksim 11.06.2014 10:29 # +2
kegdan 11.06.2014 10:40 # −1
absolut 11.06.2014 10:44 # +5
dunmaksim 11.06.2014 11:01 # +4
американский форум: задал вопрос - получил ответ
немецкий форум: задал вопрос - дали ссылку, где можно получить ответ
русский форум: задал вопрос - объяснили, что твоя мать шлюха и ты сам не лучше
brutushafens 11.06.2014 14:50 # 0
bormand 11.06.2014 11:29 # 0
Есть, Math.sign(dx). Но вот за что я и обожаю js:
Chrome 32
Firefox (Gecko) 25
Internet Explorer Not supported
Opera Not supported
Safari Not supported
P.S. Но деление для определения знака это все же пиздец. Достойно отдельного ГК.
bormand 11.06.2014 11:32 # +2
dunmaksim 11.06.2014 12:05 # +1
kegdan 11.06.2014 12:07 # 0
Lure Of Chaos 11.06.2014 14:46 # 0
не быстрее, т.к. лучше проводить сравнение: x==0?0:x>0?1:-1
не нагляднее, т.к. целых два вложенных тернарника и без скобок
bormand 11.06.2014 15:03 # 0
Зависит от распределения: если нули встречаются чаще всех остальных чисел, ну ок, сначала лучше проверить на 0. Если положительные - то в моем варианте стоит поменять местами ветки. Но один хрен второй тернарник всяко быстрее деления...
> два вложенных тернарника и без скобок
Пыхопроблемы? :) Во всех остальных сиподобных языках цепочки тернарников нормально работают и даже неплохо читаются: если x отрицательный, то -1; если х положительный, то 1; иначе 0.
kegdan 11.06.2014 15:08 # 0
В хаски вообще можно описать унарный оператор? Или только функцию?
Компилиться, но не дает применить. Для бинарных операторов канает, sqr вместо # тоже.
Сорри за оффтоп, ничего вразумительного не могу найти, видимо слепой
1024-- 11.06.2014 15:19 # 0
Работает.
kegdan 11.06.2014 15:23 # 0
LispGovno 11.06.2014 20:43 # 0
bormand 11.06.2014 15:23 # 0
Нет.
Пруф: http://www.haskell.org/haskellwiki/Unary_operator
kegdan 11.06.2014 15:49 # 0
1024-- 11.06.2014 16:29 # 0
Но и одного унарного оператора хватит всем.
1024-- 11.06.2014 16:53 # 0
3.14159265 11.06.2014 16:58 # +3
>Во всех остальных сиподобных языках цепочки тернарников нормально работают и даже неплохо читаются: если x отрицательный, то -1; если х положительный, то 1; иначе 0.
Несишкобляственно. Быстрее без ветвлений.
(x>0)-(x<0)
Это смайл если что.
bormand 11.06.2014 18:27 # 0
LispGovno 11.06.2014 19:12 # 0
Всё верно?
bormand 11.06.2014 19:14 # +2
В каком языке? Если в жс - то почти всё неверно. Для крестов - тоже далеко не всё.
LispGovno 11.06.2014 20:36 # 0
bormand 11.06.2014 20:48 # +1
b1 `op` b2 вернет число, а не bool.
5.7:1 The additive operators + and - group left-to-right. The usual arithmetic conversions are performed for operands of arithmetic or enumeration type.
5:9 Many binary operators that expect operands of arithmetic or enumeration type cause conversions and yield result types in a similar way. The purpose is to yield a common type, which is also the type of the result. This pattern is called the usual arithmetic conversions, which are defined as follows:
<...>
— Otherwise, the integral promotions (4.5) shall be performed on both operands [54].
<...>
54) As a consequence, operands of type bool, wchar_t, or an enumerated type are converted to some integral type.
++b и b++ всегда помещают true в b (разбирали недавно, )
5.2.6:1 After the result is noted, the value of the object is modified by adding 1 to it, unless the object is of type bool, in which case it is set to true. [Note: this use is deprecated, see annex D. ]
--b и b++ не компилится вообще (разбирали в том же треде)
5.2.6:2 The operand of postfix -- is decremented analogously to the postfix ++ operator, except that the operand shall not be of type bool.
bormand 11.06.2014 19:24 # +1
1) Это реальный оператор языка, и мы исполняем каждую строчку твоего кода дословно, после чего она должна вернуть истину. Тогда утверждение true + true == true ложно, равно как и true + true == false.
2) Либо == тут наивно-декоративное и мы исполняем только левую часть. И если эту левую часть подставить в условие, то получим тот же самый эффект, что и если подставить туда правую часть: if (true + true) и if (true) сработают одинаково, а if (true + true) и if (false) - нет.
Т.е. true + true является истинным, но в то же время не == true...
3.14159265 11.06.2014 20:11 # +1
>> Но деление для определения знака это все же пиздец. Достойно отдельного ГК.
А вот я вступлюсь за код вышеобосранного кегдана. А там ведь результатов возврата 4, а не 3.
>Красиво, въебал плюс.
Его код был пока что единственным который выдает правильные результаты на всем множестве входных параметров (проверял в других языках - логика та же)
Сделал еще неочевиднее свой вариант.
http://ideone.com/I67qbb
bormand 11.06.2014 20:18 # 0
Данная функция имеет 5 видов возвращаемых значений: 1, -1, 0, 0 и NaN, которые означают "положительное число", "отрицательное число", "положительный ноль", "отрицательный ноль" и NaN соответственно.
1024-- 11.06.2014 20:26 # +1
А какой толк от них в жс? Чтобы делать 1/Math.abs(0) вместо 1/0?
wvxvw 11.06.2014 20:41 # +5
bormand 11.06.2014 20:24 # +1
http://ideone.com/98el0B
P.S. Побеждает код Кегдана, как самый первый из корректных. Жаль, что в нем деление.
1024-- 11.06.2014 20:34 # +1
И вообще в JS надо расширить список тестируемых значений:
http://ideone.com/nLBBIe
А вдруг...
bormand 11.06.2014 20:36 # 0
Нет, на js без юнит-тестов писать вообще невозможно.
Вот вроде бы все тесты проходит: http://ideone.com/MGZQK4
1024-- 11.06.2014 20:44 # 0
Ещё есть {valueOf: function(){ return 42;}}, {toString: function(){ return '42';}}, подобные объекты весело ломают код Кегдана в нуле ("=== помогает", говорили они).
3.14159265 11.06.2014 21:13 # +1
Блин слишком очевидно. Бульдозерный стиль. Сразу раскрывает карты NaN. Я хотел:
а) обойтись без встроенных функций
б) использовать только свойства чисел
в) чтоб код был коротким, но не очень понятным
Вот более короткий вариант:
А есть спека как sign должен себя вести в жс?
3.14159265 11.06.2014 21:21 # 0
>А есть спека как sign должен себя вести в жс?
Чего я спрашиваю. Там не всё так просто. Проверяю в фф
Math.sign(null)==0
Math.sign(false)==0
Math.sign(true)==1
А fatality выдаёт NaN.
Не вижу смысла задрачивать то что не является числом.
3.14159265 11.06.2014 21:10 # 0
А кстати да. И у another борманда тоже (хотя идея интересная).
Я-то только свои на бесконечностях проверял.
Ну оба tangled - мои. Всё отличие "tangled code:" от "3.14159265 code:", это отрицание и перестановка местами.
kegdan 11.06.2014 22:43 # 0
Я может и дурак, но не настолько, чтобы знак делением искать
3.14159265 11.06.2014 22:48 # +2
Ну да, я уже заметил что код пришёл из оп-поста и как подсказал 1024-- он неправилен на бесконечностях.
>Я может и дурак, но не настолько, чтобы знак делением искать
А как его искать-то? Что может быть лучше и короче:
((x>0)-(x<0)) / (+x==+x))
kegdan 11.06.2014 22:57 # 0
1024-- 11.06.2014 22:59 # 0
http://jsperf.com/gc-signum
Зато у Борманда быстрее. Он не преобразует тип и снимает пенки.
3.14159265 11.06.2014 23:04 # 0
Только неправильно
Math.sign(true)
Math.sign(false)
Math.sign(null)
3.14159265 11.06.2014 23:11 # 0
(x===+x ? (x>0)-(x<0) : +x);
http://jsperf.com/gc-signum/2
1024-- 11.06.2014 23:18 # 0
3.14159265 11.06.2014 23:43 # 0
А в хроме и опере ВНЕЗАПНО изначальное деление быстрее всех.
1024-- 11.06.2014 23:26 # 0
Деструктивный вариант близок к Math.sign http://jsperf.com/gc-signum/3
3.14159265 11.06.2014 23:30 # +1
Сделал тестирование чисто на числах, ибо по всякой херне типа функций считать знак и при этом хотеть скорости будет только безумец.
Да и насторожило как туго работает родной Math.sign - может на строки и функции он не заточен?
Результаты удивляют - Math.sign - хуже всех. Даже деление его обошло.
И что удивительно fatality тоже слабовато.
PS закешил длину массива и сделал прединкремент http://jsperf.com/gc-signum/4
Особо ничего не поменялось.
3.14159265 12.06.2014 00:20 # +1
http://ideone.com/fTlmN7
http://jsperf.com/gksign/2
?: реабилитирован - с минимальным фиксом даёт верный результат и эпично побеждает во всех трёх браузерах. Только фф додумался так же быстро выполнить моё странное байтоебство.
Простой код и здравый смысл восторжествовали над "умными" хаками, написанными ради потехи.
1024-- 12.06.2014 00:36 # +2
А сегодня мы будем тестить скорость работы сигнума на моём штеуде. Нечисла - питушня потому НаН, нулл и массивы оставим заедушным питушкам. Нормальные посоны используют тернарник, деление соснуло. Тернарник дал 1MOps. Питушиный Math.sign писали за еду, цари используют тернарники.
3.14159265 12.06.2014 00:39 # +3
Хак (x>0)-(x<0) ему бы понравился - работает быстро в фф, на всех числах, но не всех входных значениях.
В сленг сумасшедших я не умею, потому косплея не будет.
PS> А Math.sign то действительно петушиный и абсолютно бесполезные - работает в полутора браузерах и адски медленно.
brutushafens 12.06.2014 00:21 # +2
kegdan 12.06.2014 02:04 # −1
типа
3 =='3' - true
3 === '3' - false
1024-- 11.06.2014 21:21 # +2
3.14159265 11.06.2014 21:25 # +2
Может креста должно быть джва?
x==+x ? (x>0)-(x<0) : +x
А главное: коротко, никаких функций, и сходу нихера непонятно как оно работает! Но работает правильно.
1024-- 11.06.2014 21:36 # 0
3.14159265 11.06.2014 21:44 # 0
((x>0)-(x<0)) / (+x==x))
http://ideone.com/fTlmN7
1024-- 11.06.2014 21:50 # +1
+null==null -> false
+null==+null -> true
А в предыдущем примере - нет, т.к. null пойдёт по ветке сравнения с нулём, где правильно приведётся к нулю.
dunmaksim 11.06.2014 22:31 # +3
1024-- 11.06.2014 22:33 # +1
kegdan 11.06.2014 11:33 # 0
guest 10.06.2014 19:50 # +2
dunmaksim 10.06.2014 21:07 # 0
guest 10.06.2014 22:54 # 0
Алсо, можно как-то полностью отключить js без перезагрузки страницы, как в опере?
3.14159265 10.06.2014 23:26 # +4
guest 12.06.2014 23:53 # −1
LispGovno 13.06.2014 00:07 # −2
brutushafens 14.06.2014 16:55 # 0
kegdan 14.06.2014 18:28 # +1
dunmaksim 14.06.2014 13:40 # −1
1024-- 14.06.2014 15:01 # 0
Я сейчас в IE 11 переключился в режим IE 7, попробовал использовать detachEvent с одним аргументом - не удаляет.
2. delete (handlers[i]); скорее всего делает не то, что Вы ожидаете, скорее всего не нужно.
3. По поводу
Во-первых, "wheelEvents" более нигде не используется, во-вторых:
3.1. $.data работает с местным хранилищем jQuery, хранятся любые объекты
3.2. $.attr - с атрибутами объекта (DOM), аналогично встроеным elem.setAttribute, elem.getAttribute, хранятся строки
3.3. elem.что-то - свойства объекта, иногда синхронизируются с атрибутами, но не эквивалентны
Если Вы хотели написать if (!elem.hasOwnProperty(HANDLERS)), ничего не выйдет, в elem нет его (см. п.п. 3.1, 3.3). Тут надо либо смотреть результат $.data, либо найти в jQuery соответствующую функцию.
4. Удаление старых обработчиков в addListeners - всё же странная фича.
dunmaksim 14.06.2014 16:51 # 0
1. Никаких нативных JS-функций, привязанных к конкретному браузеру. Вместо этого с помощью jQuery(elem).on(); цепляется обработчик handler.
2. Соответственно, удаление обработчика с помощью jQuery(elem).off();.
3. Свойство handlers для объекта DOM удаляется целиком с помощью delete(). Будем надеяться, что браузер сможет правильно обработать эту ситуацию.
dunmaksim 14.06.2014 16:53 # +1
1024-- 14.06.2014 19:11 # 0
Я человек скромный, никого ни о чём не спрашивал :) Читал javascript.ru: учебник там хороший; есть статьи, хорошие и плохие; есть форум (вот наверно там Вам кто-нибудь что-нибудь подскажет). Информации с javascript.ru мне хватало, а дальше я просто гуглил. На stackoverlflow уже заданы все вопросы и есть все ответы.
1024-- 14.06.2014 19:22 # 0
Вон там ближе к низу страницы оффтоп так оффтоп: http://govnokod.ru/16162