Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.08.2009, 19:26
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 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.
Ответить с цитированием
  #2 (permalink)  
Старый 18.08.2009, 16:48
Аватар для e1f
e1f e1f вне форума
Профессор
Отправить личное сообщение для e1f Посмотреть профиль Найти все сообщения от e1f
 
Регистрация: 03.04.2009
Сообщений: 1,263

Кроме того, что:
Цитата:
В IE5.5 и младше getAttributeNode, setAttributeNode, removeAttributeNode - не поддерживаются
больше вроде бы разницы не нашел. И тот, и другой способы возвращают одно и то же:
Цитата:
elem.getAttributeNode('value') === elem.attributes.value //true
Здесь Тоже не замечено отличий, разве что отмечено, что
Цитата:
Стоит отметить, что свойство attributes на самом деле принадлежит типу node, а не только типу element. Немного странно и не влияет на ваше кодирование, но это надо знать.
И кстати, а Вы не знаете, что это за свойство elem.text, которое берется как альтернатива?
Ответить с цитированием
  #3 (permalink)  
Старый 19.08.2009, 19:34
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

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

Сообщение от e1f
И кстати, а Вы не знаете, что это за свойство elem.text, которое берется как альтернатива?
http://htmlcoder.visions.ru/JavaScript/?31
Ответить с цитированием
  #4 (permalink)  
Старый 19.08.2009, 22:55
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Еще нашел: http://www.quirksmode.org/dom/w3c_core.html
Получается, что attributes не работается в Konqueror.
Ответить с цитированием
  #5 (permalink)  
Старый 20.08.2009, 13:54
Аватар для e1f
e1f e1f вне форума
Профессор
Отправить личное сообщение для e1f Посмотреть профиль Найти все сообщения от e1f
 
Регистрация: 03.04.2009
Сообщений: 1,263

Сообщение от Riim Посмотреть сообщение
Еще нашел: 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() более подходящий, разве что Вам нужно проходится по принципиально всем имеющимя атрибутам и что-то с ними делать.
Ответить с цитированием
  #6 (permalink)  
Старый 26.08.2009, 08:39
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 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. работают оба варианта, не вижу особой разницы в данном конкретном случае
Ответить с цитированием
  #7 (permalink)  
Старый 26.08.2009, 08:49
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от x-yuri
а почему не elem.value || elem.text ?
Если value определен как пустая строка, то в таком варианте функция подставит text, а браузер пустую строку. Нужно что бы функция делала все симметрично браузеру.

Сообщение от x-yuri
работают оба варианта, не вижу особой разницы в данном конкретном случае
Я бы и не парился, если бы была особая разница.
Ответить с цитированием
  #8 (permalink)  
Старый 26.08.2009, 09:21
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

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

Сообщение от Riim
Я бы и не парился, если бы была особая разница.
может Math.round(Math.random()); ? парится вредно
Ответить с цитированием
  #9 (permalink)  
Старый 26.08.2009, 09:38
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

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

Сообщение от x-yuri
может Math.round(Math.random()); ? парится вредно
Наверно это шутка какая-то, только вот я фполусне и нифига не понял .
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск