vendor/assets/javascripts/webshims/shims/form-shim-extend2.js in webshims-rails-1.13.0 vs vendor/assets/javascripts/webshims/shims/form-shim-extend2.js in webshims-rails-1.14.1

- old
+ new

@@ -194,11 +194,11 @@ webshims.defineNodeNamesBooleanProperty(['fieldset'], 'disabled', { set: function(value){ value = !!value; if(value){ - $(disableElementsSel, this).each(groupControl.disable); + $(this.querySelectorAll(disableElementsSel)).each(groupControl.disable); } else if(!$(this).is('fieldset[disabled] *')){ var elements = $(this.querySelectorAll(disableElementsSel)); if( this.querySelector('fieldset[disabled]') ){ elements = elements.not('fieldset[disabled] *'); @@ -253,10 +253,11 @@ if(!Modernizr.formattribute){ (function(prop, undefined){ var isForm = {form: 1, FORM: 1}; $.prop = function(elem, name, value){ var ret; + //TODO: cache + perftest if(elem && elem.nodeType == 1 && value === undefined && isForm[elem.nodeName] && elem.id){ ret = document.getElementsByName(name); if(!ret || !ret.length){ ret = document.getElementById(name); } @@ -279,37 +280,54 @@ elements.remove(); $.removeData(form, 'webshimsAddedElements'); } }; + var getAssociatedForm = function () { + var form = webshims.contentAttr(this, 'form'); + if(form){ + form = document.getElementById(form); + if(form && !$.nodeName(form, 'form')){ + form = null; + } + } + return form || this.form; + }; webshims.defineNodeNamesProperty(['input', 'textarea', 'select', 'button', 'fieldset'], 'form', { prop: { - get: function(){ - var form = webshims.contentAttr(this, 'form'); - if(form){ - form = document.getElementById(form); - if(form && !$.nodeName(form, 'form')){ - form = null; - } - } - return form || this.form; - }, + get: getAssociatedForm, writeable: false } }); webshims.defineNodeNamesProperty(['form'], 'elements', { prop: { get: function(){ - var sel, addElements, detachElements; + //TODO: cache + perftest + var sel, addElements, detachElements, formElements, i, len; var id = this.id; - var elements = $.makeArray(this.elements); + var elements = []; if(id){ detachElements = $.data(this, 'webshimsAddedElements'); if(detachElements){ detachElements.detach(); } + } + + formElements = this.elements; + + if(this.querySelector('input[form], select[form], textarea[form]')){ + for(i = 0, len = formElements.length; i < len; i++){ + if(getAssociatedForm.call(formElements[i]) == this){ + elements.push(formElements[i]); + } + } + } else { + elements = $.makeArray(formElements); + } + + if(id){ sel = 'input[form="'+ id +'"], select[form="'+ id +'"], textarea[form="'+ id +'"], button[form="'+ id +'"], fieldset[form="'+ id +'"]'; addElements = document.querySelectorAll(sel) || []; if(addElements.length){ elements = $(elements).add(addElements).get(); @@ -1034,11 +1052,24 @@ changePlaceholderVisibility(elem, val, placeholder); } return ret; }, get: function(){ + var placeholder; var elem = this; - return $(elem).hasClass('placeholder-visible') ? '' : desc[propType]._supget.call(elem); + var curValue; + + if($(elem).hasClass('placeholder-visible')){ + if(webshims.cfg.debug && (curValue = desc[propType]._supget.call(elem)) && (placeholder = $.attr(elem, 'placeholder')) && placeholder != curValue){ + webshims.error('value input[placeholder] was changed by input.value instead using $.val or $.prop.'); + changePlaceholderVisibility(elem, curValue, placeholder); + } else { + curValue = ''; + } + } else { + curValue = desc[propType]._supget.call(elem); + } + return curValue; } }; }); desc = webshims.defineNodeNameProperty(name, 'value', placeholderValueDesc); });