Общее·количество·просмотров·страницы

Java Dev Notes - разработка на Java (а также на JavaScript/Python/Flex и др), факты, события из АйТи

Показаны сообщения с ярлыком javascript. Показать все сообщения
Показаны сообщения с ярлыком javascript. Показать все сообщения

пятница, 20 мая 2011 г.

Баг-репорт ExtJS 4.0.0

Сегодня утром отправил баг-репорт на форум Sencha. См. Null error (Null Pointer Exception) in Ext.data.Connection.

Ошибка заключается в следующем: иногда xhr.getAllResponseHeaders() возвращает null. А возвращаемое значение не проверяется и используется сразу.

Вот сниппет из класса Ext.data.Connection:

/**
* Create the response object
* @private
* @param {Object} request
*/

createResponse : function(request) {
var xhr = request.xhr,
headers = {},
lines = xhr.getAllResponseHeaders().replace(/\r\n/g, '\n').split('\n'),
count = lines.length,
line, index, key, value, response;
 
// other code goes here....
}


Несложно догадаться, что строка
lines = xhr.getAllResponseHeaders().replace(/\r\n/g, '\n').split('\n'),
 
приведет к ошибки, если xhr.getAllResponseHeaders() возвратит null. Что и происходит в данном случае.

Фикс этого безобразия следующий:

lines = xhr.getAllResponseHeaders() ? xhr.getAllResponseHeaders().replace(/\r\n/g, '\n').split('\n') : '',

среда, 28 апреля 2010 г.

Консоль Firebug не показывает свойство next у объектов

Обнаружил интересный косяк Firebug: почему-то в консоли Firebug не отображается свойство next у объекта.

Вводим следующий код:

var o = {};
o.next = 'suxxx';
o.next1 = '111';
console.debug(o);
 


Смотрим скриншот - не показывается свойство next:



Но в то же время, можно вывести в консоль значение этого свойства:

var o = {};
o.next = 'suxxx';
o.next1 = '111';
console.debug(o.next);
 


Скриншот:



Firefox:

Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3

Firebug: 1.5.3.


Вот такие интересные дела творятся в датском королевстве...

четверг, 4 марта 2010 г.

Генерация GUID на JavaScript

Как сгенерировать GUIDна JavaScript:

Способ номер раз (JavaScript GUID generator):

function S4() {
return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
}
function guid() {
return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());
}


Способ номер два (by StackOverflow How to create a GUID / UUID in Javascript):

function createUUID() {
// http://www.ietf.org/rfc/rfc4122.txt
var s = [];
var hexDigits = "0123456789ABCDEF";
for (var i = 0; i < 32; i++) {
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
}
s[12] = "4"; // bits 12-15 of the time_hi_and_version field to 0010
s[16] = hexDigits.substr((s[16] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
 
var uuid = s.join("");
return uuid;
}


One-liner solution (все с того же поста на StackOverflow):

'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
return v.toString(16);
}).toUpperCase();


Здесь находится мемо, которое затем стало RFC4122: A Universally Unique IDentifier (UUID) URN Namespace

Robert Kieffer опубликовал файл Math.uuid.js, который содержит две реализации генератора UUID: RFC 4122 (функция Math.uuid) и более компактную RFC4122v4 (функция Math.uuid2). Ниже привожу исходник:

/*!
Math.uuid.js (v1.4)
http://www.broofa.com
mailto:robert@broofa.com
 
Copyright (c) 2009 Robert Kieffer
Dual licensed under the MIT and GPL licenses.
*/

 
/*
* Generate a random uuid.
*
* USAGE: Math.uuid(length, radix)
* length - the desired number of characters
* radix - the number of allowable values for each character.
*
* EXAMPLES:
* // No arguments - returns RFC4122, version 4 ID
* >>> Math.uuid()
* "92329D39-6F5C-4520-ABFC-AAB64544E172"
*
* // One argument - returns ID of the specified length
* >>> Math.uuid(15) // 15 character ID (default base=62)
* "VcydxgltxrVZSTV"
*
* // Two arguments - returns ID of the specified length, and radix. (Radix must be <= 62)
* >>> Math.uuid(8, 2) // 8 character ID (base=2)
* "01001010"
* >>> Math.uuid(8, 10) // 8 character ID (base=10)
* "47473046"
* >>> Math.uuid(8, 16) // 8 character ID (base=16)
* "098F4D35"
*/

Math.uuid = (function() {
// Private array of chars to use
var CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
 
return function (len, radix) {
var chars = CHARS, uuid = [];
radix = radix || chars.length;
 
if (len) {
// Compact form
for (var i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];
} else {
// rfc4122, version 4 form
var r;
 
// rfc4122 requires these characters
uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
uuid[14] = '4';
 
// Fill in random data. At i==19 set the high bits of clock sequence as
// per rfc4122, sec. 4.1.5
for (var i = 0; i < 36; i++) {
if (!uuid[i]) {
r = 0 | Math.random()*16;
uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
}
}
}
 
return uuid.join('');
};
})();
 
// A more compact, but less performant, RFC4122v4 compliant solution:
Math.uuid2 = function() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
return v.toString(16);
}).toUpperCase();
};


Остальные реализации генератора GUID на JavaScript можно найти в уже упоминавшемся топике How to create a GUID / UUID in Javascript на StackOverflow.

понедельник, 28 декабря 2009 г.

Удаление элемента из массива JavaScript

Как не надо удалять элемент из массива в JavaScript:

var list = [4,5,6];
delete list[1];
print(list); // [4, undefined, 6]
 


Как правильно:

var list = [4,5,6];
list.splice(1, 1); // Remove one element, returns the removed ones.
print(list); // [4, 6]


И еще правильно:

var visibleIds = [4,5,6];
visibleIds.splice(visibleIds.indexOf(5), 1);
print(visibleIds); // [4, 6]


См. также JavaScript: Remove element from Array.

среда, 25 ноября 2009 г.

Node.JS - JavaScript-фреймворк для обработки ввода-вывода

Node.JS - JavaScript-фреймворк для обработки ввода-вывода. В качестве движка JavaScript используется V8 - движок от Google Chrome. Сайт проекта: http://nodejs.org/.

Несмотря на то, что большинство разработчиков использует JavaScript в качестве клиентского языка в браузере, появление встраиваемых движков, таких как Rhino от Mozilla (Rhino написан на Java) или V8 от Google (V8 написан на С++) сделало возможным выполнение JavaScript-сценариев на сервере. Одним из примеров таких систем и является Node.JS. JavaScript здесь выступает лишь как язык сценария, он связан с библиотеками на Python или С/С++, которые и выполняют основную работу (через функции epoll, kqueue, /dev/poll, or select).

О преимуществах Node.JS подробнее рассказано здесь.

А вот статья на InfoQ, по которой я и нашел Node.JS:
Evented I/O for Javascript with Google V8-based Node.js

V8 JavaScript Engine

V8 - это опен-соурсный JavaScript-движок, который используется в браузере Google Chrome. V8 написан на С++.

V8 реализуетECMAScript, согласно третьему изданию стандарта ECMA-262, и работает под Windows XP и Vista, Mac OS X 10.5 (Leopard), и Linux-системами на IA-32 или ARM процессорах.

V8 может запускаться отдельно, а также быть встроенным в любое C++ приложение.

Сайт проекта: http://code.google.com/p/v8/.

Одним из преимуществ V8 является его сборщик мусора, т.е. garbage collector. Он придает производительность этому движку.

Одним из наиболее широких применений JavaScript, как клиентского языка, является манипуляция с DOM. Однако, DOM предоставляет браузер (например, Google Chrome), а не движок. V8 предоставляет все типы данных, операторы, объекты и функции, определенные в стандарте ECMA.

суббота, 7 ноября 2009 г.

Google открывает ключевые инструменты разработки

В посте от 5 Ноября 2009 года Introducing Closure Tools компания Google объявила об открытии нескольких своих ключевых инструментов разработки на JavaScript (Closure Compiler, Closure Library, Closure Templates, Closure Inspector), надеясь, что они позволят программистам создавать веб-приложения быстрее.

При помощи этих инструментов созданы популярные веб-приложения (Gmail, Google Docs и Google Maps).

Closure Compiler
Closure Compiler - JavaScript-оптимизатор, который сжимает код JavaScript, а также выполняет оптимизацию кода (это опционально). Существует три уровня сжатия и оптимизации:

  • WHITESPACE_ONLY - удаление пробелов в комментариев из кода

  • SIMPLE_OPTIMIZATIONS - локальная оптимизация частей скрипта, которые не взаимодействуют с внешним кодом. Обычно, это переименование локальных переменных

  • ADVANCED_OPTIMIZATIONS - агрессивная оптимизация


Closure Compiler имеет REST-интерфейс. Помимо этого можно скачать JAR-файл, который содержит Closure Compiler, и пользоваться им локально.

Closure Compiler для работы требует Java 6.

Closure Library
Кросс-браузерная JavaScript-библиотека, которая содержит утилиты для обращения к DOM, модель событий, коммуникацию с сервером, структуры данных, большое количество виджетов и другое.

Closure Templates
Шаблонизатор, работающий и на клиенте, и на сервере.

Closure Inspector
Расширения для FireBug for FireFox. Добавляет следующие фичи в файербаг:

  • мэппинг исходного кода - при выполнении жатого кода мэппит его на несжатый оригинал

  • улучшенное отображение stack trace

  • интеграцию с юнит-тестированием

Постоянные читатели