92 заметки с тегом
javascript РСС
5 января, 23:42
JavaScript: определяем браузер по работе с масивами

<script type="text/javascript"> function browser() { if(-[1,]){ var f = 1; var d={4294967296:'opera', d:'firefox', 4294967295:'chrome', '1' :''}; for(var i in d) if(f) f=0; else return d[i]; } else return 'ie'; } document.write(browser()); </script>
Найдено на хабре
1 комментарий5 января, 23:33
С новым годом
[][([]+{})[-~[]+(!![]<<!![]+!![])]+([]+{})
[-~[]]+([]+[][{}])[-~[]]+([]+!{})[!![]+!![]+
!![]]+([]+!![])[+![]]+([]+!![])[+!![]]+
([]+!![])[-[~[]+~[]]]+([]+{})[-~[]+(!![]<<!![]+
!![])]+([]+!![])[+![]]+([]+{})[-~[]]+([]+!![])
[+!![]]][([]+{})[-~[]+(!![]<<!![]+!![])]+([]+{})
[-~[]]+([]+[][{}])[-~[]]+([]+!{})[!![]+!![]+!![]]+
([]+!![])[+![]]+([]+!![])[+!![]]+([]+!![])
[-[~[]+~[]]]+([]+{})[-~[]+(!![]<<!![]+!![])]+
([]+!![])[+![]]+([]+{})[-~[]]+([]+!![])[+!![]]]
(([]+!![])[+!![]]+([]+{})[-~[]<<[-~[]+-~[]]]+
([]+!![])[-[]]+([]+[][{}])[-[]]+([]+!![])[+!![]]+
([]+[][{}])[-~[]]+([]+{})[~[]+(+!![]<<!![]+!![]+
!![])]+([]+![])[!![]+!![]+!![]]+([]+![])[!![]<<!![]+
!![]]+([]+![])[!![]+!![]]+([]+![])[-[]])()
[([{}-{}]+[])[-~[]]+([]+![])[!![]+!![]]+([]+![])
[!![]<<!![]+!![]]+([]+!![])[-~[]]+([]+!![])[+[]]](
[][([]+{})[-~[]+(!![]<<!![]+!![])]+([]+{})
[-~[]]+([]+[][{}])[-~[]]+([]+!{})[!![]+!![]+
!![]]+([]+!![])[+![]]+([]+!![])[+!![]]+
([]+!![])[-[~[]+~[]]]+([]+{})[-~[]+(!![]<<!![]+!![])]+
([]+!![])[+![]]+([]+{})[-~[]]+([]+!![])[+!![]]]
[([]+{})[-~[]+(!![]<<!![]+!![])]+([]+{})[-~[]]+
([]+[][{}])[-~[]]+([]+!{})[!![]+!![]+!![]]+
([]+!![])[+![]]+([]+!![])[+!![]]+([]+!![])
[-[~[]+~[]]]+([]+{})[-~[]+(!![]<<!![]+!![])]+
([]+!![])[+![]]+([]+{})[-~[]]+([]+!![])[+!![]]]
(([]+!![])[+!![]]+([]+{})[-~[]<<[-~[]+-~[]]]+
([]+!![])[-[]]+([]+[][{}])[-[]]+([]+!![])
[+!![]]+([]+[][{}])[-~[]]+([]+{})[~[]+(+!![]<<!![]+
!![]+!![])]+([]+![])[!![]+!![]+!![]]+([]+![])
[!![]<<!![]+!![]]+([]+![])[!![]+!![]]+([]+![])
[-[]])()[([]+![])[-~[]]+([]+!![])[+![]]+([]+{})
[-~[]]+([]+{})[!![]+!![]]](([]+![])[-~[]]+
([][([]+{})[-~[]+(!![]<<!![]+!![])]+([]+{})[-~[]]+
([]+[][{}])[-~[]]+([]+!{})[!![]+!![]+!![]]+([]+!![])
[+![]]+([]+!![])[+!![]]+([]+!![])[-[~[]+~[]]]+
([]+{})[-~[]+(!![]<<!![]+!![])]+([]+!![])[+![]]+
([]+{})[-~[]]+ ([]+!![])[+!![]]]+[])[(-~[]+[+![]])-!![]])+
([]+![])[-~[]]+
(/!/[([]+{})[-~[]+(!![]<<!![]+!![])]+([]+{})[-~[]]+([]+[][{}])
[-~[]]+([]+!{})[!![]+!![]+!![]]+([]+!![])[+![]]+([]+!![])[+!![]]+([]+!![])
[-[~[]+~[]]]+([]+{})[-~[]+(!![]<<!![]+!![])]+([]+!![])[+![]]+([]+{})
[-~[]]+([]+!![])[+!![]]]+[])[+!![]+[!![]<<!![]-~[]]]+
(/!/[([]+{})[-~[]+(!![]<<!![]+!![])]+([]+{})[-~[]]+([]+[][{}])
[-~[]]+([]+!{})[!![]+!![]+!![]]+([]+!![])[+![]]+([]+!![])[+!![]]+([]+!![])
[-[~[]+~[]]]+([]+{})[-~[]+(!![]<<!![]+!![])]+([]+!![])[+![]]+([]+{})
[-~[]]+([]+!![])[+!![]]]+[])[+!![]+[!![]<<!![]-~[]]]+
([]+[~[]/[]])[[[!![]+!![]]*[!![]+!![]]]*[!![]+!![]]]+
([]+{})[~[]+(+!![]<<!![]+!![]+!![])]+
([]+[][{}])[-~[]]+
([]+{})[-~[]<<[-~[]+-~[]]]+
([][([]+{})[-~[]+(!![]<<!![]+!![])]+([]+{})
[-~[]]+([]+[][{}])[-~[]]+([]+!{})[!![]+!![]+!![]]+([]+!![])
[+![]]+([]+!![])[+!![]]+([]+!![])[-[~[]+~[]]]+([]+{})[-~[]+
(!![]<<!![]+!![])]+([]+!![])[+![]]+([]+{})[-~[]]+([]+!![])
[+!![]]][([]+{})[-~[]+(!![]<<!![]+!![])]+([]+{})[-~[]]+
([]+[][{}])[-~[]]+([]+!{})[!![]+!![]+!![]]+([]+!![])[+![]]+
([]+!![])[+!![]]+([]+!![])[-[~[]+~[]]]+([]+{})[-~[]+
(!![]<<!![]+!![])]+([]+!![])[+![]]+([]+{})[-~[]]+([]+!![])
[+!![]]](([]+!![])[+!![]]+([]+{})[-~[]<<[-~[]+-~[]]]+
([]+!![])[-[]]+([]+[][{}])[-[]]+([]+!![])[+!![]]+([]+[][{}])
[-~[]]+([]+{})[~[]+(+!![]<<!![]+!![]+!![])]+([]+![])
[!![]+!![]+!![]]+([]+![])[!![]<<!![]+!![]]+([]+![])
[!![]+!![]]+([]+![])[-[]])()+[])[([]+![])[!![]+!![]+
!![]]+([]+![])[!![]+!![]]+([]+[][{}])[!![]+(!![]<<!![]+!![])]+
([]+{})[!![]+(!![]<<!![]+!![])]+([]+!![])[!![]+!![]+!![]]](~[]+~[])[-[]]+
([]+{})[~[]+(+!![]<<!![]+!![]+!![])]+
(~[]/[]+[])[-~[]<<-(~[]+~[]+~[])]+
([~[]<[]]+[])[-[~[]+~[]+~[]]]+
([{}-{}]+[])[-~[]]+
([]+!![])[+!![]]+
(/!/+[])[-~[]])Это Женя Степанищев написал здесь такое вот поздравление. Как-то раз я уже описывал, как работает данный «обфускатор», почему-то не могу найти, повторюсь :)
Пока я искал, все появилось в комментариях :)
Теперь немного о том как это сделано.Здесь он продолжил:
Проще всего получить буквы I, N, O, a, b, c, d, e, f, i, j, l, n, o, r, s, t, u, y. Они встречаются в различных словах самого языка. Например, нам нужна буква «f». Нет ничего проще, берём значение «false», вырезаем первую букву: «false»[0].
Перевести что угодно в строку можно прибавляя слева пустой массив, напимер «[]+![]» будет «false». Получить нулевой символ тоже легко, нужно перевести массив в число. Получается: «([]+![])[+[]]». Можно получать менее очевидные вещи: «[]+{}» будет «[object Object]», «{}-{}» — NaN, а «~[]/[]» — «-Infinity».
С некоторыми другими буквами пришлось повозиться. Например, над «w» я долго ломал голову, наконец решил попробовать получить глобальный «window», преобразовать в строку и взять букву из него.А тут закончил:
Очевидный способ через пустой call какого-нибудь метода отказался работать в Файрфоксе (строгий режим они что ли включили?), поэтому я добрался до него в два приёма.
Во-первых, сначала мне нужен был конструктор какого-нибудь метода, чтобы вызвать конструктор Function. Это я решил так: [].sort.constructor (sort — хорошее имя метода, все буквы просто достаются), точнее, вот так [][’sort’][’constructor’], буквы подставляются методом, описанным чуть выше.
Во-вторых, вызовом конструктора я создал функцию, которая вернула self: [].sort.constructor(’return self’)()
Дальше — дело техники. Я отрезал последние две буквы (в зависимости от браузера я могу получить объект «window» или «DOMWindow», первая буква не годится) и взял первую: [][’sort’][’constructor’](’return self’)()[’slice’](-2)[0]
Кстати, «alert» вызывается аналогичным образом — надо добраться до window и вызвать у него «alert»: window[’alert’](’параметры’). Собственно, то же с любой другой глобальной функцией. Я, например, использую ещё atob, чтобы получить букву «h» в слове «happy». Вызов window[’atob’](’aA’) даст искомую букву.И добавил
Букву «a» для параметра «atob» получить просто, можно, например, отрезать её от «false», а большой «A» сложнее. Я поступил следующим образом: преобразовал конструктор массива к строке: «[]+[].constructor». Получается следующее:
function Array() {
[native code]
}
Искомая буква там — под номером девять (если считать с нуля), я девятку получил вот так: +([-~[]]+-![])+~[] (в строковом представлении сложил один и ноль, преобразовал число, прибавил минус один).
В итоге, буква «h» получается как-то так: [].sort.constructor(’return self’)()[’atob’](«false»[1] + ([]+[].constructor)[9])
О! Надо ещё про букву «p» рассказать. Я получил её из объекта «RegExp», знакомым уже способом: «([]+/!/.constructor)[14]».FIN
10 декабря, 20:16
Скролл сверху и снизу блока
Wow, who is back. Да — это я с новым ДОУ (deer.org.ua, lol)
Разминка для мозгов :)
Код честно взят со стакексчендж (стаковерфлоу раньше). Я просто сделал с него джиквери решение
Примера не будет, мне лень.
Разминка для мозгов :)
<style type="text/css"> #doublescroll { overflow: auto; overflow-y: hidden; } #doublescroll p { margin: 0; padding: 1em; white-space: nowrap; } </style> <div id="doublescroll"> <p> Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </p> </div> <script type="text/javascript"> function DoubleScroll(element) { var scrollbar= document.createElement('div'); scrollbar.appendChild(document.createElement('div')); scrollbar.style.overflow= 'auto'; scrollbar.style.overflowY= 'hidden'; scrollbar.firstChild.style.width= element.scrollWidth+'px'; scrollbar.firstChild.style.paddingTop= '1px'; scrollbar.firstChild.appendChild(document.createTextNode('\xA0')); scrollbar.onscroll= function() { element.scrollLeft= scrollbar.scrollLeft; }; element.onscroll= function() { scrollbar.scrollLeft= element.scrollLeft; }; element.parentNode.insertBefore(scrollbar, element); } DoubleScroll(document.getElementById('doublescroll')); </script>
Код честно взят со стакексчендж (стаковерфлоу раньше). Я просто сделал с него джиквери решение
$("#doublescroll") .before($("<div></div>") .append($("<div></div>") .css({ "padding-top":"1px", "width": $("#doublescroll")[0].scrollWidth+"px" }) .text('\xA0') ) .css({ "overflow":"auto", "overflowY":"hidden" }). bind("scroll",function(){ $("#doublescroll")[0].scrollLeft = $(this)[0].scrollLeft; }) ) .bind("scroll",function(){ $(this).prev()[0].scrollLeft = $(this)[0].scrollLeft; })
Примера не будет, мне лень.
27 августа 2011, 14:06
Проверка типа данных
var toType = function (obj) { return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase(); }Наткнулся на ноут-киппер, решил себе схоронить :)
1 апреля 2011, 20:07
Javascript Capitalize :D
var uc_prop = prop.charAt(0).toUpperCase() + prop.substr(1)
25 января 2011, 11:13
javascript: выколиглаз
13 января 2011, 9:34
«Обратный» паттерн
var oppositeOf = { 'up' : 'down', 'down' : 'up', 'left' : 'right', 'right' : 'left', 'black' : 'white', 'white' : 'black' }; oppositeOf['left']; // => 'right'
12 января 2011, 12:37
Немножко чая
;(function(w) { var d = w.document, g = d.getElementById; var cup = g("tea-cup"); if (!cup) return; if (cup.className.indexOf("black") >= 0) cup.appendChild(d.createElement("sugar")); cup.style.visibility = "hidden"; })(window);
5 декабря 2010, 19:10
Javascript: забавный сдвиг!
Неожиданное использование сдвига, так — на будущее!
var array = [ function(){console.log("H")}, function(){console.log("e")}, function(){console.log("l")}, function(){console.log("l")}, function(){console.log("o")}, function(){console.log(" ")}, function(){console.log("w")}, function(){console.log("o")}, function(){console.log("r")}, function(){console.log("d")}, function(){console.log("!")} ]; while(array.length){ array.shift()(); }
24 ноября 2010, 11:40
JavaScript: is and setAttr functions
Первая функция для работы с атрибутами
Вторая для определения, с чем имеем дело :)
var attrWhiteList = /^(text|size|color|weight|true)$/; function setAttr(name, value) { if (arguments.length > 1) { if (attrWhiteList.test(name)) { this[name] = value; } } else if (name === Object(name)) { for (var key in name) if (attrWhiteList.test(key)) { this[key] = name[key]; } } }
Вторая для определения, с чем имеем дело :)
function is(o, type) { type = String(type).toLowerCase(); return (type == "null" && o === null) || (type == typeof o) || (type == "object" && o === Object(o)) || (type == "array" && Array.isArray && Array.isArray(o)) || Object.prototype.toString.call(o).slice(8, -1).toLowerCase() == type; } is(function(){}, "object"); // true is(function(){}, "function"); // true is([], "object"); // true is(new String("string"), "string"); // true
19 октября 2010, 14:31
javascript: unterminated string errors
Если вам встретились ошибки:
Паниковать не стоит, это всего лишь сервер обрывает ваш скрипт на каком либо тэге, то ли в строке, то ли в регекспе.
Если есть строка
зы: пришлось чинить стандартные скрипты, которые работали много лет, потому что хостер что-то нахимичил в конфиге апача. Что именно предстоит ещё узнать.
Это всё! Всем хорошего кодинга.
unterminated string literal unterminated regular expression literal
Паниковать не стоит, это всего лишь сервер обрывает ваш скрипт на каком либо тэге, то ли в строке, то ли в регекспе.
Если есть строка
$str .= "</a>"Или любая подобная, нужно её немножко конвертнуть
$str .= "</" + "a>"
зы: пришлось чинить стандартные скрипты, которые работали много лет, потому что хостер что-то нахимичил в конфиге апача. Что именно предстоит ещё узнать.
Это всё! Всем хорошего кодинга.
14 октября 2010, 9:06
Javascript: букмарклет для сбора всех свойств this
(function(){ var results = []; for(var p in this) { results.push(p); } alert("Leaked: \r\n" + results.join(" \r\n")); })();
15 июня 2010, 16:21
почти аналог GM_xmlhttpRequest
У замечательного аддона к ФФ обезьянке, есть функция для аджаксика. Когда хочется один такой скриптик пернести на Хромого, например, он начинает спрашивать эту функцию. Потому встречайте:
GM_xmlhttpRequest = function(params) { var request = new XMLHttpRequest() request.onreadystatechange = function() { if (params.onreadystatechange) params.onreadystatechange(request) if (request.readyState == 4) { if (request.status >= 200 && request.status < 400) if (params.onload) params.onload(request) else if (params.onerror) params.onerror(request) } } request.open(params.method, params.url, true) if (params.headers) for (name in params.headers) request.setRequestHeader(name, params.headers[name]) request.send(params.data) return request }
9 июня 2010, 10:18
Сравнение таблиц в двух БД (и больше)
Когда дохера работы, начинаешь страдать такой ерундой :)Раз в несколько месяцев приходится сравнивать БД, и каждый раз в ручную. Один даже раз софт сутки искал, но он ужасен, весь. Немного пострадав, минут 30, получился такой код:
- собираем всё в масcив;
- выводим всё красиво в табличках;
- подключаем jQ и делаем удобную «обёрточку»;
- ...
- Profit
$user = "root"; $userp = ""; mysql_connect("localhost", $user, $userp) or die(mysql_error()); $table2compare = array("test1", "test2"); $comparedtables = array(); $i = 0; foreach ($table2compare as $tablename){ $comparedtables["title"][$i] = $tablename; $db = mysql_query("SHOW TABLES IN $tablename"); while($dbt = mysql_fetch_array( $db )){ $table = mysql_query("SHOW COLUMNS FROM $dbt[0] FROM $tablename "); while($tbf = mysql_fetch_array( $table )) $comparedtables["tables"][$dbt[0]][$i][] = $tbf; } $i++; } echo "<table><tr>"; for ($j = 0; $j < $i; $j++) echo "<td>".$comparedtables["title"][$j]."</td>"; echo "</tr>"; foreach ($comparedtables["tables"] as $table => $fields) { echo "<tr>"; for ($j = 0; $j < $i; $j++) { if ($j > 0) $eq = $fields[$j] == $fields[0]; else $eq = true; echo "<td valign='top' ".(!$eq ? "style='background: #fcc;'" : "").">"; if (empty($fields[$j])) continue; echo "<span>$table</span><br><table rules=all frame=box cellpadding='2'> <tr> <td>Field</td> <td>Type</td> <td>Null</td> <td>Key</td> <td>Default</td> <td>Extra</td> </tr>"; foreach ($fields[$j] as $field) echo "<tr> <td>$field[0]</td> <td>$field[1]</td> <td>$field[2]</td> <td>$field[3]</td> <td>$field[4]</td> <td>$field[5]</td> </tr>"; echo "</table></td>"; } echo "</tr>"; } echo "</table>"; mysql_close(); <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.2.min.js"></script> <script type="text/javascript"> $(function(){ $("table table").hide(); $("table span").click(function(){ $(this).next().next().toggle(); }).css({"cursor":"pointer"}); }); </script>
26 мая 2010, 16:25
getBoxObjectFor для FireFox 3.6 и выше
if(typeof document.getBoxObjectFor == "undefined") { document.getBoxObjectFor = function(elem) { var obj = new Object; var rect = elem.getBoundingClientRect(); obj.y = rect.top; obj.x = rect.left; obj.width =Math.abs(rect.right-rect.left); obj.height = Math.abs(rect.bottom-rect.top); return obj; } }
17 мая 2010, 9:47
Firebug Lite Snippet (bookmarklet)
Сниппет, он же букмарклет в данном случае, это исполняемый из адресной строки браузера ДжС код. Его можно даже добавить в закладки, для удобства. Вот.
А вот и он
Для удобства, запихаем его в текстареа
А вот и он
javascript:var firebug=document.createElement('script'); firebug.setAttribute('src', 'http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'); document.body.appendChild(firebug); (function(){if(window.firebug.version) {firebug.init();}else{setTimeout(arguments.callee);}})(); void(firebug);
Для удобства, запихаем его в текстареа
15 мая 2010, 21:18
Javascript: get Array Unique Values
getUniqueValues = function (arr) { var hash = new Object(); for (j = 0; j < arr.length; j++) {hash[arr[j]] = true} var array = new Array(); for (value in hash) {array.push(value)}; return array; }
12 мая 2010, 21:21
Javascript: простенькая истина оптимизации #1
Хехе, что бы всё было быстро и классно, вставки и аппенды в ДОМ делайте как можно реже, даже если это выглядит не очень красиво, зато прирост в скорости невообразимый! :)
5 мая 2010, 10:49
JavaScript: как colSpan у колонки поменять?
// ЫЕ любит так obj.colSpan = "3"; // Делать нужно так obj.setAttribute("colspan", "3");
27 апреля 2010, 15:21
Ещё один клёвы квиз, разбираем, что к чему :)
James Padolsey забецал клёвейший квиз, подумать пришлось, жаль ответы прям в коде.
Поехали
Поехали
//1: логическое И, в итоге 3 1 && 3 //2: И даёт "foo" из ИЛИ тоже "foo" 1 && "foo" || 0 //3: тут из логического ИЛИ почему-то отвалилось "фуу", правильный ответ 1 - не понял 1 || "foo" && 0 //4: последний в списке через запятые, получим 3 (1,2,3) //5: пустой шифтуй-не-шифтуй, всё равно количество 0 x = {shift:[].shift}; x.shift(); x.length; //6: будет масив с [0], почему? не ясно {foo:1}[0] //7: получаем true [true, false][+true, +false] //8: '52'.split('') = [5,2], [5,2][0] = 5, ++5 = 6, ответ 6 ++'52'.split('')[0] //9: a: b: c: d: e: f: g: 1, 2, 3, 4, 5; тут типо ответ 5, что и как мне не ясно //10: нет объекта ["b"], error {a: 1, b: 2}[["b"]] //11: "b45" "b" + 45 //12: у меня [обжект Обжект], автор говорит что "2" {a:{b:2}} //13: лишняя пара скобок, undefined (function(){}()) //14: 0. - число, число в строку "0", длина этого 1, [1,2,3,4,5][1] = 2 [1,2,3,4,5][0..toString.length] //15: "[Обжект]бе" больше "[Обжект]а" ({} + 'b' > {} + 'a') //16: false -> this всегда обжект Number.prototype.x = function(){ return this === 123; }; (123).x(); //17: "," -> массив из 2ух пустых, после джоин Array(2).join() //18: vars не определён vars: var vars = vars; //19: 123 { foo = 123 } //20: внутри "х" не определён, undef x = 1; (function(){return x; var x = 2;}()) //21: delete от строки вернёт false delete [].length; //22: тут "1", почему пока не разобрался RegExp.prototype.toString = function() {return this.source}; /3/-/2/; //23: error - ошибка синтаксиса {break;4;} //24: строка == обжект, в итоге фелс 'foo' == new function(){ return String('foo'); }; //25: [f,o,o] 'foo'.split('') + []
