原生js实现jQuery的功能 show()方法实现 (三)

度娘搜索原生js实现jquery的show,你会发现大部分的回答就是

el.style.display="block"

一开始我以为是对的,就发布到产品中了,一测试才发现其实该方法远远比想象中的复杂。
比如界面上是2个a标签,而且是在一行的,如果使用上面的语句来显示a标签,会发现a标签换行了,这就说明显示操作不能简单的使用,而且跟标签是行内标签还是块级标签有关联。
完整代码应该如下

   //显示元素
    showEl: function (elId) {
        var node = GoingUtils.getElObj(elId);
        if (node != null) {
            return GoingUtils.showHide([node], true );
        }
    },
     //隐藏 显示相应的元素
    showHide: function (elements, show) {
        var elemdisplay = { BODY: "block" };var iframe,iframeDoc=null;
        function css_defaultDisplay( nodeName ) {
            if ( elemdisplay[ nodeName ] ) {
                return elemdisplay[ nodeName ];
            }
            var id=GoingUtils.getUUid();
            var elm=GoingUtils.appendToBody("<" + nodeName + " id='"+id+"'>");
            display = GoingUtils._getStyleValue(id,"display");
            GoingUtils.removeEl(id);

            if ( display === "none" || display === "" ) {
                var iframeEl=document.createElement("iframe");
                iframeEl.style.frameBorder=0;
                iframeEl.style.width=0;
                iframeEl.style.height=0;
                GoingUtils.appendToBody(iframeEl);
                if ( !iframeDoc || !iframe.createElement ) {
                    iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
                    iframeDoc.write("<!doctype html><html><body>");
                    iframeDoc.close();
                }
                elem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) );
                display = GoingUtils._getStyleValue( elem, "display" );
                document.body.removeChild( iframe );
            }
            elemdisplay[ nodeName ] = display;
            return display;
        }
        function isHidden( elem, el ) {
            elem = el || elem;
            return GoingUtils._getStyleValue( elem, "display" ) === "none";
        }

        var elem, display,
            values = [],
            index = 0,
            length = elements.length;

        for (; index < length; index++) {
            elem = elements[index];
            if (!elem.style) {
                continue;
            }
            if (show) {
                //如果是style上定义的none 则直接设置成“”
                if (!values[index] && elem.style.display === "none") {
                    elem.style.display = "";
                }

                //但如果是设置在css里面则不能简单的设置成""的方式
                if (elem.style.display === "" && isHidden(elem)) {
                    values[index] = css_defaultDisplay(elem.nodeName);
                }
            }
        }

        for (index = 0; index < length; index++) {
            elem = elements[index];
            if (!elem.style) {
                continue;
            }
            if (!show || elem.style.display === "none" || elem.style.display === "") {
                elem.style.display = show ? values[index] || "" : "none";
            }
        }
        return elements;
    },
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值