JQM настроить ширину этикетки
Мы хотим настроить все метки-метки из мобильной формы jquery с меткой with из самой большой метки. Вот один пример кода для одного поля:
... <fieldset data-role="fieldcontain">
<label for="fusrName">Benutzername/E-Mail<b class="kontoman-mandatory">*</b></label>
<input id="fusrName" name="fusrName" type="text" placeholder="Benutzername/E-Mail" value="">
</fieldset>...
Это функция jquery:
$.fn.labelWidth = function () {
var maxWidth = 0;
$('fieldset').each(function() {
$(this).find('label').each(function() {
var width = $(this).width();
if (width > maxWidth) {
maxWidth = width;
}
});
});
$('fieldset').each(function() {
$(this).find('label').each(function() {
$(this).css({width:maxWidth});
});
});
}
... и это вызов функции:
$(document).on('pageshow',function(event,ui) {
$('#kontoman-form').labelWidth();
Если мы отладим: в переменную max с правильной шириной... но форма не изменится? В чем наша ошибка?
1 ответ
Вы были близко, но недостаточно близко. Ваш плагин сделан исходя из предположения, что каждая метка имеет отдельную ширину, и это не правильно. Ширина метки всегда составляет 20%, ширина ввода - 78%, а между ними - 2%.
Рабочий пример: http://jsfiddle.net/Gajotres/mMmcP/
Вы изменили код плагина:
$.fn.labelWidth = function () {
// This will override preset 20% width
$('.ui-input-text').style('width', 'auto', 'important');
var maxWidth = 0;
var contentWidth = $('.ui-content').width();
$('fieldset').each(function() {
$(this).find('label').each(function() {
var width = $(this).width();
if (width > maxWidth) {
maxWidth = width;
}
});
});
var finalLabelWidth = Math.ceil((maxWidth/contentWidth)*100);
var finalInputWidth = 100 - finalLabelWidth - 2;
$('fieldset').each(function() {
$(this).find('label').each(function() {
$(this).style('width', finalLabelWidth+'%', 'important');
$(this).next().style('width', finalInputWidth+'%', 'important');
});
});
}
Еще один плагин важен для работы этого плагина, его можно найти здесь. Я не второй разработчик плагинов.
Вот второй плагин:
// For those who need them (< IE 9), add support for CSS functions
var isStyleFuncSupported = CSSStyleDeclaration.prototype.getPropertyValue != null;
if (!isStyleFuncSupported) {
CSSStyleDeclaration.prototype.getPropertyValue = function(a) {
return this.getAttribute(a);
};
CSSStyleDeclaration.prototype.setProperty = function(styleName, value, priority) {
this.setAttribute(styleName,value);
var priority = typeof priority != 'undefined' ? priority : '';
if (priority != '') {
// Add priority manually
var rule = new RegExp(RegExp.escape(styleName) + '\\s*:\\s*' + RegExp.escape(value) + '(\\s*;)?', 'gmi');
this.cssText = this.cssText.replace(rule, styleName + ': ' + value + ' !' + priority + ';');
}
}
CSSStyleDeclaration.prototype.removeProperty = function(a) {
return this.removeAttribute(a);
}
CSSStyleDeclaration.prototype.getPropertyPriority = function(styleName) {
var rule = new RegExp(RegExp.escape(styleName) + '\\s*:\\s*[^\\s]*\\s*!important(\\s*;)?', 'gmi');
return rule.test(this.cssText) ? 'important' : '';
}
}
// Escape regex chars with \
RegExp.escape = function(text) {
return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
}
// The style function
jQuery.fn.style = function(styleName, value, priority) {
// DOM node
var node = this.get(0);
// Ensure we have a DOM node
if (typeof node == 'undefined') {
return;
}
// CSSStyleDeclaration
var style = this.get(0).style;
// Getter/Setter
if (typeof styleName != 'undefined') {
if (typeof value != 'undefined') {
// Set style property
var priority = typeof priority != 'undefined' ? priority : '';
style.setProperty(styleName, value, priority);
} else {
// Get style property
return style.getPropertyValue(styleName);
}
} else {
// Get CSSStyleDeclaration
return style;
}
}