Недавно столкнулся с одной особенностью JavaScript, а точнее класса Date. Во всех известных мне языках программирования (и других языках) 01-01-2000 - это первое января двухтысячного года. В JavaScript - это первое февраля двухтысячного года.
Чтобы получить первое января нужно создавать объект Date так: new Date(2000, 0, 1). Соответственно от остальных месяцев тоже нужно отнять единицу, т.к. в конструкторе класса Date они нумеруются с 0 по 11.
пятница, 12 ноября 2010 г.
суббота, 6 ноября 2010 г.
Осторожно, динамическая типизация JavaScript
Недавно возникла такая проблема - все браузеры, кроме Internet Explorer (чудеса случаются), получая параметра от элемента, считали этот параметр строкой, а не числом. Это происходило примерно в следующей ситуации:
Internet Explorer в value[i] запишет 1, 2, 3 и т.д. Другие браузеры запишут туда 01, 11, 21 и т.д. Вроде, результат очевиден: к выражению содержащему только цифры прибавляется число в явном виде - должно получиться число. Однако это понимает только Internet Explorer.
Если возникнет подобный случай, сразу используйте функцию parseInt(objects[i].getAttribute('i')).
for (var i = 0; i < objects.length; i++) //objects - строки таблицы, например
{
objects[i].setAttribute('i', i); //i сейчас точно является числом
}
...
for (var i = 0; i < objects.length; i++) //objects - те же строки таблицы
{
value[i] = objects[i].getAttribute('i') + 1; //что окажется в value[i]?
}
Internet Explorer в value[i] запишет 1, 2, 3 и т.д. Другие браузеры запишут туда 01, 11, 21 и т.д. Вроде, результат очевиден: к выражению содержащему только цифры прибавляется число в явном виде - должно получиться число. Однако это понимает только Internet Explorer.
Если возникнет подобный случай, сразу используйте функцию parseInt(objects[i].getAttribute('i')).
пятница, 5 ноября 2010 г.
Забавные комментарии в коде
//Mr. Compiler, please do not read this.
last = first; /* Biblical reference */
long long ago; /* in a galaxy far far away */
//Comment this later
//I am not sure if we need this, but too scared to delete.
$this->getSelect()->where('main_table.product_id = -1');//Mom, Dad... sorry
/* Logger */
private Logger logger = Logger.getLogger();
Комментарии взяты с сайта www.remobred.ru.
четверг, 4 ноября 2010 г.
Очень краткий курс AJAX
Основная идея AJAX - отправка запроса на сервер и получения ответа от него без перезагрузки текущей страницы. AJAX поддерживается всеми современными браузерами, поэтому устанавливать какие-либо дополнительные компоненты не потребуется. Если вы знаете JavaScript и PHP (или любой другой серверный язык), то можете считать, что уже на 90% знаете AJAX. Если не знаете, то изучайте.
Решим типичную для AJAX задачу - реализуем на сайте часы, показывающие время на сервере. Для этого при загрузке страницы нам нужно создать специальный объект JavaSctipt, который будет отправлять запрос на сервер и получать ответ от него:
В файле script.php получаем время:
На этом курс окончен.) Ещё раз хочу подчеркнуть - не важно какой язык используется на стороне сервера. В request.responseText окажется то, что вы увидите, введя адрес своего скрипта в браузер (например, www.site.ru/script.php).
Решим типичную для AJAX задачу - реализуем на сайте часы, показывающие время на сервере. Для этого при загрузке страницы нам нужно создать специальный объект JavaSctipt, который будет отправлять запрос на сервер и получать ответ от него:
var request = null; //Cпециальный объект
if (window.XMLHttpRequest)
{
request = new XMLHttpRequest(); //Для всех браузеров, кроме IE
}
else if (window.ActiveXObject)
{
request = new ActiveXObject("Microsoft.XMLHTTP"); //Для IE
}
UpdateTime(); //Запускаем обновление времени
function UpdateTime()
{
//Проверяем готовность к отправке запроса
if(request.readyState == 4 || request.readyState == 0)
{
//Указывает метод передачи, путь к скрипту и будет ли запрос выполнятся асинхронно
request.open("GET", "script.php", true);
//Отключаем кэширование результатов (для IE)
request.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
//Назначаем функцию, обрабатывающую ответ от сервера
request.onreadystatechange = function()
{
//Проверяем - получен ли ответ
if(request.readyState == 4)
{
if(request.status == 200)
{
//Записываем ответ от сервера в div
document.getElementById('divTimer').innerHTML = request.responseText;
//Повторяем запрос через 500 миллисекунд
setTimeout('UpdateTime()', 500);
}
}
};
//Отправляем запрос
request.send(null);
}
else
{
//Если специальный объект был занят, повторяем запрос через 500 миллисекунд
setTimeout('UpdateTime()', 500);
}
}
В файле script.php получаем время:
<?php echo date('H-i-s'); ?>
На этом курс окончен.) Ещё раз хочу подчеркнуть - не важно какой язык используется на стороне сервера. В request.responseText окажется то, что вы увидите, введя адрес своего скрипта в браузер (например, www.site.ru/script.php).
среда, 3 ноября 2010 г.
Mozilla - баг div c размерами 100% и overflow auto
Если вам повезло, то вы не столкнулись с некорректным поведением браузера Mozilla Firefox по отношению к элементам с размерами 100% и overflow auto. А мне не повезло. Рассмотрим, что именно происходит:
На рисунке показано, что в Mozilla div увеличился и вышел за пределы страницы, полоса прокрутки в нём не появилась. В остальных браузерах элемент отображается правильно. Код страницы выглядит так:
Я долго искал решение в CSS, но не нашёл. Поэтому пришлось решать проблему через JavaScript. В моём случае было несколько div с обозначенной проблемой, поэтому код написан для любого количества элементов:
Функцию AutoSize нужно вызвать при загрузке страницы и изменении её размера:
Пока с этим кодом у меня никаких проблем не было. Всё исправно работает.
На рисунке показано, что в Mozilla div увеличился и вышел за пределы страницы, полоса прокрутки в нём не появилась. В остальных браузерах элемент отображается правильно. Код страницы выглядит так:
<body>
<table width="100%" height="100%">
<tr>
<td></td>
<td width="300">
<div id="d1" style="width: 100%; height: 100%; overflow: auto; border: solid;">
Большой текст или большой дочерний элемент.
</div>
</td>
</tr>
</table>
</body>
Я долго искал решение в CSS, но не нашёл. Поэтому пришлось решать проблему через JavaScript. В моём случае было несколько div с обозначенной проблемой, поэтому код написан для любого количества элементов:
//Массив с id элементов, размер которых нужно контролировать
var resizes = new Array("d1", "d2", "d3");
//Функция для правильного изменения размеров
function AutoSize()
{
if(IsMozilla())
{
//Два цикла нужны для корректного изменения размеров
//В противном случае элементы растягивают друг друга
for (var i = 0; i < resizes.length; i++)
{
var obj = document.getElementById(resizes[i]);
obj.style.height = '1px';
}
for (var i = 0; i < resizes.length; i++)
{
var obj = document.getElementById(resizes[i]);
obj.style.height = obj.parentNode.offsetHeight;
}
}
}
//Функция для определения того, что сайт запущен в Mozilla
function IsMozilla()
{
var brow = navigator.userAgent.toLowerCase();
return (brow.indexOf("gecko") >= 0 && brow.indexOf("chrome") < 0 && brow.indexOf("safari") < 0);
}
Функцию AutoSize нужно вызвать при загрузке страницы и изменении её размера:
<body onLoad="AutoSize();" onResize="AutoSize();">
Пока с этим кодом у меня никаких проблем не было. Всё исправно работает.
вторник, 2 ноября 2010 г.
Проект write2know - поиск совместными усилиями
Сидел я как-то вечером за своим новым ноутбуком - спокойно работал над сайтом. Вдруг, звонит мне директор нашей компании и спрашивает - знаю ли я Delphi. Большую часть времени я программировал на C# и Delphi не знаю, но он всё-равно сказал мне прийти на совещание в начале недели.
На совещании говорилось о созданиии программы для обсуждения поисковых запросов. Ничего не поняли? И я сразу не понял. Суть проекта была в следующем: пользователь вводит запрос, например, в Google, а другие пользователи видят этот запрос и могут комментировать его. Т.о. люди могут найти в комментариях то, чего не нашли в поисковике, или просто посмеяться.
Сначала я сделал приложение на C++ (которого тоже совсем не знал), т.к. требовалась максимальная кроссплатформенность, а .NET установлен далеко не у всех пользователей (Windows XP живее всех живых). Но такая реализация оказалась не совсем удобной. Поэтому пришлось ещё прилично поработать и сделать AJAX-сайт.
Сейчас сайт доступен по адресу write2know.ru.
На совещании говорилось о созданиии программы для обсуждения поисковых запросов. Ничего не поняли? И я сразу не понял. Суть проекта была в следующем: пользователь вводит запрос, например, в Google, а другие пользователи видят этот запрос и могут комментировать его. Т.о. люди могут найти в комментариях то, чего не нашли в поисковике, или просто посмеяться.
Сначала я сделал приложение на C++ (которого тоже совсем не знал), т.к. требовалась максимальная кроссплатформенность, а .NET установлен далеко не у всех пользователей (Windows XP живее всех живых). Но такая реализация оказалась не совсем удобной. Поэтому пришлось ещё прилично поработать и сделать AJAX-сайт.
Сейчас сайт доступен по адресу write2know.ru.
Подписаться на:
Комментарии (Atom)

