jQuery преобразовывает элемент DOM в другой тип

Обычно я не хочу показывать дату 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;
}
11
задан roryf 5 February 2010 в 12:04
поделиться

3 ответа

раствор Санс-Джекьюри:

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
4
ответ дан 3 December 2019 в 11:04
поделиться

Более современное (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 свойства, так как они также правильно перемещены. Также лучше работать над клонированным узлом только, не ими обоими (клон и элемент)

0
ответ дан 3 December 2019 в 11:04
поделиться

хотя это и не полное решение, логика в основном следующая:

Сохраните существующий элемент:

var oldElement = $(your selector here);

создайте новый элемент и вставьте его непосредственно перед или после вашего oldElement

​​скопируйте атрибуты

  oldElement.attr().each(function(){
    copy old
    });

еще лучше, вот пример плагина, который делает именно то, что вы хотите:

http://plugins.jquery.com/project/getAttributes

3
ответ дан 3 December 2019 в 11:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: