92 заметки с тегом

javascript РСС

5 января, 23:42

JavaScript: определяем браузер по работе с масивами

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>

Найдено на хабре
javascript

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
javascript

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;
	})

Примера не будет, мне лень.
javascript   css   jquery

27 августа 2011, 14:06

Проверка типа данных

var toType = function (obj) {
    return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase();
}
Наткнулся на ноут-киппер, решил себе схоронить :)
javascript

1 апреля 2011, 20:07

Javascript Capitalize :D

var uc_prop = prop.charAt(0).toUpperCase() + prop.substr(1)
javascript

25 января 2011, 11:13

javascript: выколиглаз

Вставьте этот код в адресную строку :)




javascript

13 января 2011, 9:34

«Обратный» паттерн

var oppositeOf = {
  'up' : 'down',
  'down' : 'up',
  'left' : 'right',
  'right' : 'left',
  'black' : 'white',
  'white' : 'black'
};

oppositeOf['left'];
// => 'right'
javascript

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);
javascript

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()();
}
javascript

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


javascript

19 октября 2010, 14:31

javascript: unterminated string errors

Если вам встретились ошибки:
unterminated string literal
unterminated regular expression literal

Паниковать не стоит, это всего лишь сервер обрывает ваш скрипт на каком либо тэге, то ли в строке, то ли в регекспе.

Если есть строка
$str .= "</a>"
Или любая подобная, нужно её немножко конвертнуть
$str .= "</" + "a>"

зы: пришлось чинить стандартные скрипты, которые работали много лет, потому что хостер что-то нахимичил в конфиге апача. Что именно предстоит ещё узнать.

Это всё! Всем хорошего кодинга.
javascript

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"));
})();


javascript

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

}
javascript

9 июня 2010, 10:18

Сравнение таблиц в двух БД (и больше) Избранное

Когда дохера работы, начинаешь страдать такой ерундой :)
Раз в несколько месяцев приходится сравнивать БД, и каждый раз в ручную. Один даже раз софт сутки искал, но он ужасен, весь. Немного пострадав, минут 30, получился такой код:
  • собираем всё в масcив;
  • выводим всё красиво в табличках;
  • подключаем jQ и делаем удобную «обёрточку»;
  • ...
  • Profit
<?php
  $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>
javascript   mysql   php

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;
        }
    }
firefox   javascript

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);

Для удобства, запихаем его в текстареа
firebug   javascript   snippet

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;

}
javascript

12 мая 2010, 21:21

Javascript: простенькая истина оптимизации #1

Хехе, что бы всё было быстро и классно, вставки и аппенды в ДОМ делайте как можно реже, даже если это выглядит не очень красиво, зато прирост в скорости невообразимый! :)
javascript   истинка

5 мая 2010, 10:49

JavaScript: как colSpan у колонки поменять?

// ЫЕ любит так
obj.colSpan = "3";
// Делать нужно так
obj.setAttribute("colspan", "3");
javascript

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('') + []
javascript
Ctrl +  Ранее