V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yozman
V2EX  ›  程序员

类 web components 思想原生解决方案

  •  
  •   yozman · 2015-08-15 12:50:56 +08:00 · 2457 次点击
    这是一个创建于 3387 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码参考
    https://github.com/yozman/flyinn/issues/12#issuecomment-131292931

    (function (window) {
    
        /***
         * 执行入口
         */
        window.onload = function () {
            打补丁();
            初始化();
        };
    
        /***
         *  修复并扩展使用 iframe 带来的一些兼容问题
         *  1. iframe 宽高问题
         *  2. 超链接点击问题
         *  3. 一个结构多个样式问题
         */
        function 打补丁() {
            设置宽高();
            设置链接();
            设置样式();
        }
    
        /***
         *  给框架设置固定宽高
         *  需要设计师配合提供准确的数值
         *  优先级为: iframe(外部) > body(内部) > 100%(默认值)
         */
        function 设置宽高() {
            var aFrame = document.getElementsByTagName('iframe');
            for (var i = 0; i < frames.length; i++) {
                var iFrame = frames[i].document.body;
                "width height".replace(/\w+/g, function (s) {
                    aFrame[i].style[s] = aFrame[i][s] || iFrame.getAttribute(s) || '100%';
                });
                aFrame[i].style.display = 'block';
            }
        }
    
        /***
         *  修复超链接在框架内跳转的问题
         */
        function 设置链接() {
            var aA = document.getElementsByTagName('a');
            for (var i = 0; i < aA.length; i++) {
                aA[i].onclick = function () {
                    if (this.href) {
                        top.location = this.href;
                        return false;
                    }
                };
            }
        }
    
        /***
         *  解决一个结构多个样式问题
         *  利用地址 hash 给 body 添加相应的 class
         */
        function 设置样式() {
            location.hash.length > 1 && (
                document.body.className += ' ' + location.hash.substring(1)
            );
        }
    
        /***
         *  初始化
         */
        function 初始化() {
            var aFrame = document.getElementsByTagName('iframe');
            for (var i = 0; i < frames.length; i++) {
                aFrame[i].innerHTML && (
                    frames[i].arguments = eval('(' + aFrame[i].innerHTML + ')')
                );
                frames[i].main && frames[i].main(frames[i].arguments);
            }
            self == top && self.main && self.main();
        }
    
    })(window);
    

    基于 iframe 实现的

    1 条回复    2015-08-15 18:14:35 +08:00
    laosb
        1
    laosb  
       2015-08-15 18:14:35 +08:00
    好一个中文编程
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5456 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 06:04 · PVG 14:04 · LAX 22:04 · JFK 01:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.