Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Option.getValue (https://javascript.ru/forum/misc/4711-option-getvalue.html)

Riim 14.08.2009 19:26

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;

Может кто-нибудь знает какой-либо недостаток (кроме разницы в производительности и количестве кода) у одного из вариантов?

e1f 18.08.2009 16:48

Кроме того, что:
Цитата:

В IE5.5 и младше getAttributeNode, setAttributeNode, removeAttributeNode - не поддерживаются
больше вроде бы разницы не нашел. И тот, и другой способы возвращают одно и то же:
Цитата:

elem.getAttributeNode('value') === elem.attributes.value //true
Здесь Тоже не замечено отличий, разве что отмечено, что
Цитата:

Стоит отметить, что свойство attributes на самом деле принадлежит типу node, а не только типу element. Немного странно и не влияет на ваше кодирование, но это надо знать.
И кстати, а Вы не знаете, что это за свойство elem.text, которое берется как альтернатива?

Riim 19.08.2009 19:34

Буду свойством attributes пользоваться, если что-нибудь плохое с ним обнаружится, то отпишусь здесь.

Цитата:

Сообщение от e1f
И кстати, а Вы не знаете, что это за свойство elem.text, которое берется как альтернатива?

http://htmlcoder.visions.ru/JavaScript/?31

Riim 19.08.2009 22:55

Еще нашел: http://www.quirksmode.org/dom/w3c_core.html
Получается, что attributes не работается в Konqueror.

e1f 20.08.2009 13:54

Цитата:

Сообщение от Riim (Сообщение 27646)
Еще нашел: http://www.quirksmode.org/dom/w3c_core.html
Получается, что attributes не работается в Konqueror.

А еще там же:
Цитата:

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() более подходящий, разве что Вам нужно проходится по принципиально всем имеющимя атрибутам и что-то с ними делать.

x-yuri 26.08.2009 08:39

Цитата:

Сообщение от 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. работают оба варианта, не вижу особой разницы в данном конкретном случае

Riim 26.08.2009 08:49

Цитата:

Сообщение от x-yuri
а почему не elem.value || elem.text ?

Если value определен как пустая строка, то в таком варианте функция подставит text, а браузер пустую строку. Нужно что бы функция делала все симметрично браузеру.

Цитата:

Сообщение от x-yuri
работают оба варианта, не вижу особой разницы в данном конкретном случае

Я бы и не парился, если бы была особая разница.

x-yuri 26.08.2009 09:21

Цитата:

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

если бы я делал для себя, то я бы забил на пустую строку: не вижу ситуации, когда бы у меня в качестве value была пустая строка. А может и не только для себя - нечего пустую строку в качестве value пихать :)

Цитата:

Сообщение от Riim
Я бы и не парился, если бы была особая разница.

может Math.round(Math.random()); ? ;) парится вредно

Riim 26.08.2009 09:38

Цитата:

Сообщение от x-yuri
если бы я делал для себя, то я бы забил на пустую строку: не вижу ситуации, когда бы у меня в качестве value была пустая строка. А может и не только для себя - нечего пустую строку в качестве value пихать

Можно и так, там просто подобных моментов довольно много получилось, и если везде немного по-своему сделать, то обязательно где-нибудь вылезет.

Цитата:

Сообщение от x-yuri
может Math.round(Math.random()); ? парится вредно

Наверно это шутка какая-то, только вот я фполусне и нифига не понял :) .


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