隐藏或显示元素

切换元素的显示属性以使其可见或不可见。


显示和隐藏元素可以通过切换其显示样式来实现:


var el = document.querySelect('div');

// hide
el.style.display = 'none';

// show
el.style.display = '';
// or if the div element is hidden by default via CSS stylesheet
el.style.display = 'block';
      

但是,在jQuery中创建一个函数,例如$.show()和$.hide(),需要的还不止于此。 始终通过将元素的显示样式设置为 "none" 来隐藏元素。 显示元素更加困难,因为此功能必须考虑样式表规则以及元素的默认显示样式。 例如。 跨度将内联作为其默认显示值。 将其设置为 "none" 是无效的。

以下函数非常方便,但是为了使事情简单,show()函数需要一个附加参数; 元素((block, inline-block, inline等等)的目标显示值:


function hide(el) {
    el.style.display = 'none';
}

function show(el, value) {
    el.style.display = value;
}

function toggle(el, value) {
    var display = (window.getComputedStyle ? getComputedStyle(el, null) : el.currentStyle).display;
    if (display == 'none') el.style.display = value;
    else el.style.display = 'none';
}
      

toggle()可用于在可见和不可见之间切换。 如果您不想或不能手动传递目标显示值,它将变得更加复杂。 以下函数基本上是jQuery的$.show()$.hide()的原始JavaScript克隆。 为了使这些功能正常工作,需要存储元素的初始/默认显示样式。 为此,使用数据属性"olddisplay":


// get the default display style of an element
function defaultDisplay(tag) {
    var iframe = document.createElement('iframe');
    iframe.setAttribute('frameborder', 0);
    iframe.setAttribute('width', 0);
    iframe.setAttribute('height', 0);
    document.documentElement.appendChild(iframe);

    var doc = (iframe.contentWindow || iframe.contentDocument).document;

    // IE support
    doc.write();
    doc.close();

    var testEl = doc.createElement(tag);
    doc.documentElement.appendChild(testEl);
    var display = (window.getComputedStyle ? getComputedStyle(testEl, null) : testEl.currentStyle).display
    iframe.parentNode.removeChild(iframe);
    return display;
}

// actual show/hide function used by show() and hide() below
function showHide(el, show) {
    var value = el.getAttribute('data-olddisplay'),
    display = el.style.display,
    computedDisplay = (window.getComputedStyle ? getComputedStyle(el, null) : el.currentStyle).display;

    if (show) {
         if (!value && display === 'none') el.style.display = '';
         if (el.style.display === '' && (computedDisplay === 'none')) value = value || defaultDisplay(el.nodeName);
    } else {
        if (display && display !== 'none' || !(computedDisplay == 'none'))
            el.setAttribute('data-olddisplay', (computedDisplay == 'none') ? display : computedDisplay);
    }
    if (!show || el.style.display === 'none' || el.style.display === '')
        el.style.display = show ? value || '' : 'none';
}

// helper functions
function show(el) { showHide(el, true); }
function hide(el) { showHide(el); }
      

这是一个方便且有用的功能,但确实涉及大量代码。 因此,最好像上面所示那样手动设置元素的显示样式。