2014-10-15 2 views
-3

Допустим, у нас есть форма со следующими входами: (да и то, что если мы действительно хотим, чтобы эти имена)Элементы формы перезапись по умолчанию свойства объекта формы

<form id="form-id"> 
    <input type="text" name="submit" /> 
    <input type="text" name="elements" /> 
    <input type="text" name="id" /> 
    <input type="text" name="addEventListener" /> 
</form> 

Теперь, если мы попытаемся свойства формы доступа, все мы получаем объекты ввода:

var form = document.getElementById('form-id'); 

form.elements; // will be <input type="text" name="elements" /> instead of a list of elements 

та же проблема с:

form.submit; 
form.id; 
form.addEventListener; 

и все другие четкости ault свойства объекта формы.

Я действительно понимаю, что мы могли бы найти другой способ доступа к этим свойствам ... , но что мы должны делать с теми, что мы не можем?

Мои мысли, что стандарт должен быть другим, что-то вроде этого:

form.elements = { 
    "submit": [object HTMLFormElement], // <input type="text" name="submit" /> 
    "elements": [object HTMLFormElement], // <input type="text" name="elements" /> 
    ... 
    etc 
} 

не как свойства самой формы.

Ваши предложения.

+0

В каких свойствах вы не найдете другого доступа? – Alohci

+2

Избегайте использования ключевых слов в качестве имен. Если вам нужно, вы должны пройти через утомительное свойство управлять сломанным состоянием. Удалите имя из элемента, сохраните расположение '.submit' или' .elements', а затем переназначьте имя. –

+0

@Alohci Как мне получить массив form.elements в постоянное время с вводом с именем «элементы»? – Tengiz

ответ

0

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

HTMLFormElement.prototype.getRealAttribute = function(name) { 
    var form = this; 
    var tmpForm = document.createElement('FORM'); 

    /* if it's not overridden */ 
    if (Object.prototype.toString.call(tmpForm[name]) === Object.prototype.toString.call(form[name])) { 
     if (Object.prototype.toString.call(tmpForm[name]) === "[object Function]") { 
      return form[name].bind(form); 
     } 
     return form[name]; 
    } 

    /* if it's overridden function */ 
    if (HTMLFormElement.prototype[name]) { 
     return HTMLFormElement.prototype[name].bind(form); 
    } 

    /* if it's an attribute */ 
    if (form.attributes[name]) { 
     return form.attributes[name].value; 
    } 

    /* if it's an overridden property */ 
    var fieldSet = document.createElement('FIELDSET'); 
    fieldSet.innerHTML = form.innerHTML; 

    return fieldSet[name] || null; 
}; 
Смежные вопросы