14.08.2009, 19:26
|
|
Рассеянный профессор
|
|
Регистрация: 06.04.2009
Сообщений: 2,379
|
|
Option.getValue
Если у option атрибут value не определен, то браузер при отсылке формы вместо value использует содержимое тега. И, конечно же, функция собирающая данные с этой формы, например, для ajax-запроса, должна делать все симметрично. Нужно узнать определен ли value у option, первое что вспомнилось - hasAttribute, но он не захотел работать в IE, полез подсматривать во фреймворки и вот что нашел:
PrototypeJs (1.6.1_rc3 , str 2900):
hasAttribute: function(element, attribute) {
attribute = Element._attributeTranslations.has[attribute] || attribute;
var node = $(element).getAttributeNode(attribute);
return !!(node && node.specified);
}
Может сложиться впечатление, что getAttributeNode добавляется самим фреймворком, но это не так, он (метод) даже на w3.org описан.
Jquery (1.3.2 , str 415):
return (elem.attributes.value || {}).specified ? elem.value : elem.text;
Оба варианта везде работают, вот теперь не знаю что выбрать.
Т. е. либо так:
return (elem.attributes.value || {}).specified ? elem.value : elem.text;
либо так:
return (elem.getAttributeNode('value') || {}).specified ? elem.value : elem.text;
Может кто-нибудь знает какой-либо недостаток (кроме разницы в производительности и количестве кода) у одного из вариантов?
Последний раз редактировалось Riim, 14.08.2009 в 19:29.
|
|
18.08.2009, 16:48
|
|
Профессор
|
|
Регистрация: 03.04.2009
Сообщений: 1,263
|
|
Кроме того, что:
Цитата:
|
В IE5.5 и младше getAttributeNode, setAttributeNode, removeAttributeNode - не поддерживаются
|
больше вроде бы разницы не нашел. И тот, и другой способы возвращают одно и то же:
Цитата:
|
elem.getAttributeNode('value') === elem.attributes.value //true
|
Здесь Тоже не замечено отличий, разве что отмечено, что
Цитата:
|
Стоит отметить, что свойство attributes на самом деле принадлежит типу node, а не только типу element. Немного странно и не влияет на ваше кодирование, но это надо знать.
|
И кстати, а Вы не знаете, что это за свойство elem.text, которое берется как альтернатива?
|
|
19.08.2009, 19:34
|
|
Рассеянный профессор
|
|
Регистрация: 06.04.2009
Сообщений: 2,379
|
|
Буду свойством attributes пользоваться, если что-нибудь плохое с ним обнаружится, то отпишусь здесь.
Сообщение от e1f
|
И кстати, а Вы не знаете, что это за свойство elem.text, которое берется как альтернатива?
|
http://htmlcoder.visions.ru/JavaScript/?31
|
|
20.08.2009, 13:54
|
|
Профессор
|
|
Регистрация: 03.04.2009
Сообщений: 1,263
|
|
А еще там же:
Цитата:
|
x.attributes['align']
Get the align attribute object of node x. If the node has no align attribute, it returns undefined (except in IE, where it returns an attribute object that has no value.)
|
Видимо, все же getAttributeNode() более подходящий, разве что Вам нужно проходится по принципиально всем имеющимя атрибутам и что-то с ними делать.
|
|
26.08.2009, 08:39
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
Сообщение от e1f
|
И кстати, а Вы не знаете, что это за свойство elem.text, которое берется как альтернатива?
|
в данном случае это HTMLOptionElement.text
Сообщение от Riim
|
Если у option атрибут value не определен, то браузер при отсылке формы вместо value использует содержимое тега. И, конечно же, функция собирающая данные с этой формы, например, для ajax-запроса, должна делать все симметрично
|
а почему не elem.value || elem.text ?
Сообщение от Riim
|
return (elem.getAttributeNode('value') || {}).specified ? elem.value : elem.text;
|
|| {} не обязательно, судя по quirksmode.org
p.s. работают оба варианта, не вижу особой разницы в данном конкретном случае
|
|
26.08.2009, 08:49
|
|
Рассеянный профессор
|
|
Регистрация: 06.04.2009
Сообщений: 2,379
|
|
Сообщение от x-yuri
|
а почему не elem.value || elem.text ?
|
Если value определен как пустая строка, то в таком варианте функция подставит text, а браузер пустую строку. Нужно что бы функция делала все симметрично браузеру.
Сообщение от x-yuri
|
работают оба варианта, не вижу особой разницы в данном конкретном случае
|
Я бы и не парился, если бы была особая разница.
|
|
26.08.2009, 09:21
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
Сообщение от Riim
|
Нужно что бы функция делала все симметрично браузеру
|
если бы я делал для себя, то я бы забил на пустую строку: не вижу ситуации, когда бы у меня в качестве value была пустая строка. А может и не только для себя - нечего пустую строку в качестве value пихать
Сообщение от Riim
|
Я бы и не парился, если бы была особая разница.
|
может Math.round(Math.random()); ? парится вредно
|
|
26.08.2009, 09:38
|
|
Рассеянный профессор
|
|
Регистрация: 06.04.2009
Сообщений: 2,379
|
|
Сообщение от x-yuri
|
если бы я делал для себя, то я бы забил на пустую строку: не вижу ситуации, когда бы у меня в качестве value была пустая строка. А может и не только для себя - нечего пустую строку в качестве value пихать
|
Можно и так, там просто подобных моментов довольно много получилось, и если везде немного по-своему сделать, то обязательно где-нибудь вылезет.
Сообщение от x-yuri
|
может Math.round(Math.random()); ? парится вредно
|
Наверно это шутка какая-то, только вот я фполусне и нифига не понял .
|
|
|
|