Обычно я не хочу показывать дату UTC, так как клиенты не любят делать конверсию в голове. Чтобы отобразить локальную дату ISO, я использую функцию:
function toLocalIsoString(date, includeSeconds) {
function pad(n) { return n < 10 ? '0' + n : n }
var localIsoString = date.getFullYear() + '-'
+ pad(date.getMonth() + 1) + '-'
+ pad(date.getDate()) + 'T'
+ pad(date.getHours()) + ':'
+ pad(date.getMinutes()) + ':'
+ pad(date.getSeconds());
if(date.getTimezoneOffset() == 0) localIsoString += 'Z';
return localIsoString;
};
. В приведенной выше функции отсутствует информация о смещении часового пояса (за исключением случаев, когда местное время является UTC), поэтому я использую функцию ниже, чтобы показать локальное смещение в одном месте. Вы также можете добавить свой результат к результатам вышеуказанной функции, если вы хотите показать смещение в каждом конкретном случае:
function getOffsetFromUTC() {
var offset = new Date().getTimezoneOffset();
return ((offset < 0 ? '+' : '-')
+ pad(Math.abs(offset / 60), 2)
+ ':'
+ pad(Math.abs(offset % 60), 2))
};
toLocalIsoString
использует pad
. При необходимости он работает почти как любая функция пэда, но для полноты это то, что я использую:
// Pad a number to length using padChar
function pad(number, length, padChar) {
if (typeof length === 'undefined') length = 2;
if (typeof padChar === 'undefined') padChar = '0';
var str = "" + number;
while (str.length < length) {
str = padChar + str;
}
return str;
}
раствор Санс-Джекьюри:
function makeNewElementFromElement( tag, elem ) {
var newElem = document.createElement(tag),
i, prop,
attr = elem.attributes,
attrLen = attr.length;
// Copy children
elem = elem.cloneNode(true);
while (elem.firstChild) {
newElem.appendChild(elem.firstChild);
}
// Copy DOM properties
for (i in elem) {
try {
prop = elem[i];
if (prop && i !== 'outerHTML' && (typeof prop === 'string' || typeof prop === 'number')) {
newElem[i] = elem[i];
}
} catch(e) { /* some props throw getter errors */ }
}
// Copy attributes
for (i = 0; i < attrLen; i++) {
newElem.setAttribute(attr[i].nodeName, attr[i].nodeValue);
}
// Copy inline CSS
newElem.style.cssText = elem.style.cssText;
return newElem;
}
например
makeNewElementFromElement('a', someDivElement); // Create anchor from div
Более современное (2020 +) подход:
function changeTag (element, tag) {
// prepare the elements
const newElem = document.createElement(tag)
const clone = element.cloneNode(true)
// move the children from the clone to the new element
while (clone.firstChild) {
newElem.appendChild(clone.firstChild)
}
// copy the attributes
for (const attr of clone.attributes) {
newElem.setAttribute(attr.name, attr.value)
}
return newElem
}
По сравнению с ответом @James, Вы не должны копировать cssText
, потому что он уже заботился браузером. Вам также не нужна строка/число dom свойства, так как они также правильно перемещены. Также лучше работать над клонированным узлом только, не ими обоими (клон и элемент)
хотя это и не полное решение, логика в основном следующая:
Сохраните существующий элемент:
var oldElement = $(your selector here);
создайте новый элемент и вставьте его непосредственно перед или после вашего oldElement
скопируйте атрибуты
oldElement.attr().each(function(){
copy old
});
еще лучше, вот пример плагина, который делает именно то, что вы хотите: