getElementsByTagName
Забавно, getElementsByTagName не только возвращает коллекцию элементов по имени тега, но и поддерживает эту коллекцию в актуальном состоянии.
Так, если я добавлю в документ еще один элемент с таким же именем, то количество элементов в коллекции созданной ранее изменится:
window.onload = function(){ var inputs = document.getElementsByTagName('input'); alert(inputs.length); var item = document.createElement('input'); document.body.appendChild(item); alert(inputs.length); }
Upd: действительно: The list is live, so changes to it internally or externally will cause the items they reference to be updated as well.
Маска, маска я тебя знаю
Понадобилось сделать картинку с неровными краями, причем картинка должна быть именно прозрачной, вариант сделать белый фон не прокатывает. Самым логичным было бы использовать наложение маски как это можно сделать скажем во флеше... но...
Почемуто в GD нет функций для работы с масками. Пришлось изобретать самим, и вот что получилось:
Так выглядит код маскирования:
$image = imagecreatefromgif('image.gif'); $mask = imagecreatefromgif('mask.gif'); $dest = imagecreatetruecolor(imagesx($image),imagesy($image)); imagemask($dest,$image,$mask); header('Content-type: image/jpeg'); imagepng($dest);
Код самой функции маскирования:
function imagemask($dest,$image,$mask){ $width = imagesx($image); $height = imagesy($image); $tc = imagecolorallocate($dest,0,0,0); imagecolortransparent($dest,$tc); for($i=0;$i<$width;$i++){ for($j=0;$j<$height;$j++){ $c = imagecolorat($image,$i,$j); $color = imagecolorsforindex($image,$c); $c = imagecolorat($mask,$i,$j); $mcolor = imagecolorsforindex($mask,$c); if (!($mcolor['red']==255 && $mcolor['green']==255 && $mcolor['blue']==255)){ $c = imagecolorallocate($dest,$color['red'],$color['green'],$color['blue']); imagesetpixel($dest,$i,$j,$c); } } } }
Правда расстраивает, что GD так и не научилась работать нормально с полупрозрачностью - если кто знает способ, расскажите плиз.
Занятный фокус с JS
За что я люблю JS это за то что на нем можно реализовать некоторые вещи совершенно нетривиальным способом. Например такая задача: Есть IFRAME который создается динамически, нужно привесить событие onload на объект window внутри этого IFRAME. Сразу после создания свойство contentWindow равно нулю, поэтому непосредственно после создания доступа к нему нет. Оно станет доступно через некоторое время. Логичным будет проверять на ноль свойство каждые сто миллисекунд пока оно не будет чему нибудь равно:
var onloadfunc = function(){ alert('loaded!!!'); }; (function(){ if (!iframe.contentWindow){ setTimeout(arguments.callee,100); return; } iframe.contentWindow.onload = onloadfunc; })();
В приведенном примере анонимная функция вызывает саму себя через каждые 100 миллисекунд. Интересно что когда это писал - забыл поставить точку с запятой в }; - это привело к интересной штуке - калбак стал вызываться на этапе инициализации - т.е. скобки имеют наивысший приоритет даже если между ними стоит перенос строки.
говорят SVN это дырка...
На Хабрахабре интересная статейка про то как люди часто пренебрегают элементарными средствами безопастности, выставляя служебные папочки .svn на всеобщее оборзение.
http://habrahabr.ru/blogs/infosecurity/70330/
Upd:
чтобы запретить это безобразие просто добавьте в .htaccess или в httpd.conf:
<IfModule mod_rewrite.c> RewriteRule ^(.*/)?\.svn/ - [F,L] ErrorDocument 403 "Access Forbidden" </IfModule>
Причем как то странно на одном сервере это не сработало, сработало вот это:
<DirectoryMatch "^/.*/(\.svn|CVS)/"> Order deny,allow Deny from all </DirectoryMatch>