Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Облегчение себе работы (https://javascript.ru/forum/misc/16657-oblegchenie-sebe-raboty.html)

MCTrane 16.04.2011 19:04

Облегчение себе работы
 
Вот решил заменить document.getElementById(x) на byid(x),document.getElementById(x).value на valid(x), document.getElementById(x).innerHTML на htmlid(x) и т.д. Это сильно повлияет на работу скрипта? Такое можно делать или это очень плохо? Только не надо давать ссылки на готовые решения, я и сам знаю как это сделать) Хочется самому)

walik 16.04.2011 19:09

Навряд ли это сильно повлияет на работу скрипта. Другие библиотеки так делают и ничего, вроде все живы))))

Kolyaj 16.04.2011 19:34

Цитата:

Сообщение от MCTrane
document.getElementById(x) на byid(x)

Обычно меняют на $

MCTrane 16.04.2011 21:07

Kolyaj,
Это как? т.е. $id?

ksa 16.04.2011 21:13

Цитата:

Сообщение от MCTrane
Это как? т.е. $id?

Нет, вот как

$(id)

Kolyaj 16.04.2011 21:13

Функцию называют $.
$(id).
А ещё лучше, когда $ может принимать id или сам элемент, тогда нивелируется разница между элементом и его id.

function $(el, doc) {
    doc = doc || document;
    return typeof el == 'string' ? doc.getElementById(el) : el;
}

MCTrane 16.04.2011 21:14

Спасибо

x-yuri 17.04.2011 12:05

Цитата:

Сообщение от Kolyaj
Обычно меняют на $

а потом создают объект-обертку и начинают изобретать свой jquery :)
function $( id ){
  return new MyFramework(id);
}

function MyFramework( id ){
  this._el = typeof id == 'stirng' ? document.getElementById(id) : id;
}

MyFramework.prototype.val = function(){
  return this._el.value;
}

Kolyaj 17.04.2011 13:01

Цитата:

Сообщение от x-yuri
а потом создают объект-обертку

Неудобно. Я в результате пришёл к обычным функциям, которые принимают в первом параметре элемент.
https://github.com/Kolyaj/CrossJS/bl...rce/dom.js#L93

x-yuri 17.04.2011 14:34

опять же, непривычно. И не обязательно делать именно так как в jquery, можно сделать отдельную обертку для группы элементов, как в mootools

Kolyaj 17.04.2011 15:29

Неудобно, но обёртка ещё хуже тем, что надо помнить, какие методы нативные, а какие кастомные. Или же реализовывать кастомный алиас для каждого нативного метода. Все три способа хреновые, я выбрал для себя меньшее из зол.

Лучший вариант -- расширение прототипа -- недоступен в IE.

monolithed 17.04.2011 15:56

Цитата:

Сообщение от Kolyaj
недоступен в IE

в каком смысле?

Kolyaj 17.04.2011 16:16

В прямом. У DOM элементов в IE нет прототипов.

monolithed 17.04.2011 16:47

Цитата:

Сообщение от Kolyaj
В прямом. У DOM элементов в IE нет прототипов.

хм. невнимательно прочитал :)
Однако в IE8 можно уже и так:

//Element.getElementsByClassName IE8+
function getElementsByClass(getClass){
	if(document.querySelectorAll) {
		return document.querySelectorAll("." + getClass);
	}
	else if(document.getElementsByClassName) {
		return document.getElementsByClassName(getClass);
	}
	else {
		var list = document.getElementsByTagName('*'), i = list.length,
		classArray = getClass.split(/\s+/), result = [];
		while(i--) {
			if(list[i].className.search('\\b' + classArray + '\\b') != -1) {
				result.push(list[i]);
			}
		}
		return result;
	}
};
HTMLDocument.prototype.getElementsByClassName = Element.prototype.getElementsByClassName = getElementsByClass;

оффтоп
вообще интересно что Node.ELEMENT_NODE/Node.TEXT_NODE в IE9 по прежнему не определяются, зато 10-ю очень хорошо расширили (только что проверил там есть поддержка!)

tenshi 17.04.2011 17:28

var newOffset= getElementOffset('#xxx') + 10
setElementOffset( '#xxx', new Offset )

-- vs --

var el= $('#xxx')
var newOffset= el.offset() + 10
el.offset( newOffset )

===

не задалбывает каждой функции передавать элемент первым параметром?

tenshi 17.04.2011 17:30

monolithed, а для ие7- можно задать одноразовый экспрешн, который добавит нужные методы при добавлении элемента в дом.

Kolyaj 17.04.2011 17:58

Цитата:

Сообщение от tenshi
не задалбывает каждой функции передавать элемент первым параметром?

Не задалбывает перед каждой функцией писать имя переменной с точкой?

x-yuri 17.04.2011 19:18

Цитата:

Сообщение от Kolyaj
Неудобно

хорошо, почему?

Цитата:

Сообщение от Kolyaj
но обёртка ещё хуже тем, что надо помнить, какие методы нативные, а какие кастомные. Или же реализовывать кастомный алиас для каждого нативного метода. Все три способа хреновые, я выбрал для себя меньшее из зол.

Лучший вариант -- расширение прототипа -- недоступен в IE.

теоретически мне кажется лучшим вариант с оберткой с алиасами. А какой третий вариант? Первый - получать ссылку на элемент и вызывать нативный метод, второй - делать алисы в обертке

http://blogs.msdn.com/b/ie/archive/2...-download.aspx
по-моему они решили запомниться этими рыбками. И, кстати, быстро у них появилось preview следующей версии

Цитата:

Сообщение от tenshi
monolithed, а для ие7- можно задать одноразовый экспрешн, который добавит нужные методы при добавлении элемента в дом.

а можешь кодом продемонстрировать?

Цитата:

Сообщение от Kolyaj
Не задалбывает перед каждой функцией писать имя переменной с точкой?

мне кажется, твой вариант - это жертва ради производительности, к которой ты привык

Kolyaj 17.04.2011 20:36

Цитата:

Сообщение от x-yuri
хорошо, почему?

Это я про своё решение, если что :)

Проблема: добавить методы для работы с DOM-элементами.

Хорошее решение: расширение прототипа. Не будь IE, проблем бы не было.

Есть три удовлетворительных решения:
1. Обёртка (jQuery, ExtJS).
2. Добавление методов прямо в DOM-элементы (PrototypeJS, раньше по крайней мере).
3. Обычные функции, принимающие первым аргументом DOM-элемент.

Я для себя выбрал третий вариант.

Цитата:

Сообщение от x-yuri
мне кажется, твой вариант - это жертва ради производительности, к которой ты привык

Производительность во всех случаях одинаковая, а вот сжимаемость увеличивается. Но больше меня коробит требование предобработки DOM-элементов, чтобы обёртку создать.

x-yuri 17.04.2011 21:05

Цитата:

Сообщение от Kolyaj
Но больше меня коробит требование предобработки DOM-элементов, чтобы обёртку создать.

а что за предобработка?

monolithed 17.04.2011 21:25

Цитата:

Сообщение от x-yuri
по-моему они решили запомниться этими рыбками.

да уж http://ie.microsoft.com/testdrive/Pe...k/Default.html :D
это не все http://ie.microsoft.com/testdrive/Vi...p/Default.html

Kolyaj 17.04.2011 21:41

Цитата:

Сообщение от x-yuri
а что за предобработка?

Вызов функции $ в случае jQuery. В случае ExtJS это Ext.get(). Т.е. нельзя просто взять элемент и что-то с ним сделать, сначала нужно обернуть.

tenshi 18.04.2011 02:21

что-то типа

var ss= document.createStylesheet()
ss.cssText= '*{zoom:expression(runtimeStyle.zoom=1,mixin(this, HTMLElement.prototype))}'
document.getElementsByTagName('head')[0].appendChild( ss )

вместо zoom лучше использовать что-то более редкое

with-love-from-siberia 18.04.2011 11:39

Цитата:

Сообщение от Kolyaj (Сообщение 101142)
Вызов функции $ в случае jQuery. В случае ExtJS это Ext.get(). Т.е. нельзя просто взять элемент и что-то с ним сделать, сначала нужно обернуть.

Имеется в виду, что функции не возвращают просто элемент, но обязательно "обернутый" в другую структуру. Правильно?

Kolyaj 18.04.2011 11:47

Правильно.


Часовой пояс GMT +3, время: 00:42.