zoukankan      html  css  js  c++  java
  • 每日思考(2020/03/04)

    题目概览

    • 对HTML5的download属性的理解
    • inline、block、inline-block这三个属性值有什么区别?
    • 写一个方法,使得sum(x)(y)和sum(x,y)返回的结果相同
    • 对浏览器的关键渲染路径的理解

    题目解答

    对HTML5的download属性的理解

    • 属性介绍:常规的<a>标签通过 href 实现链接跳转,如果只想下载文件而不是跳转预览,最好的方式是在<a>标签中添加download属性,就能很简单地实现下载操作。download是 HTML5 中<a>标签新增的一个属性,此属性会强制触发下载操作,指示浏览器下载 URL 而不是导航到它,并提示用户将其保存为本地文件。如果缺少download属性,点击 "download" 会直接变成预览图片,当添加download属性后则会触发图片的下载

      <a href="result.png" download>download</a>
      
    • 动态资源下载:面对一些动态内容下载的业务场景,即图片等资源的地址并不是固定的(例如一些在线绘图工具所生成的图片),只使用 HTML 无法满足需求。为了能够满足不同的 URL 下载,可以通过JS 实现一个动态触发 URL 下载的方法

      function download(href, filename='')  {
        const a = document.createElement('a')
        a.download = filename
        a.href = href
        document.body.appendChild(a)  
        a.click()
        a.remove()
      }
      
    • 文件命名问题:

      • download属性不仅可以触发下载,也能指定下载文件名

        <a href="test.png" download="joker.png">下载</a>
        
      • 如果下载文件的后缀与源文件保持一致,可以设置缺省文件名

        <a href="test.png" download="joker">下载</a>
        
    • Blob:即二进制大对象,一些数据库将Blob用来表示存储二进制文件的字段类型。File 接口也是基于 Blob,继承了 Blob 的功能并将其扩展使其支持用户系统上的文件。Blob 对象通过 Blob 构造函数来创建。如果需要实现一些简单的文本或 JS 字符串之类的文件下载,可以通过将文本信息转成 blob 二进制流,生成一个 Blob URL,配合download属性完成下载

      
      const downloadText = (text, filename = '') {
        const a = document.createElement('a')
        a.download = filename
        const blob = new Blob([text], {type: 'text/plain'})  
        // text指需要下载的文本或字符串内容
        a.href = window.URL.createObjectURL(blob) 
        // 会生成一个类似blob:http://localhost:8080/d3958f5c-0777-0845-9dcf-2cb28783acaf 这样的URL字符串
        document.body.appendChild(a)  
        a.click()
        a.remove()
      }
      
    • 通过 Blob 和 Fetch 可以解决跨域和文件命名的问题:使用fetch获取跨域资源返回一个blob 对象并生成一个 Blob URL,配合<a>标签的download属性触发下载

      
      function download(href, filename = '')  {
        const a = document.createElement('a')
        a.download = filename
        a.href = href
        document.body.appendChild(a)  
        a.click()
        a.remove()
      }
       
      function downloadFile(url, filename='') {
        fetch(url, {
          headers: new Headers({
            Origin: location.origin,
          }),
          mode: 'cors',
        })
          .then(res => res.blob())
          .then(blob => {
            const blobUrl = window.URL.createObjectURL(blob)
            download(blobUrl, filename)
            window.URL.revokeObjectURL(blobUrl)
          })
      }
      

    inline、block、inline-block这三个属性值有什么区别?

    • 总体概念

      • block和inline这两个概念是简略的说法,完整确切的说应该是 block-level elements (块级元素) 和 inline elements (内联元素)。block元素通常被现实为独立的一块,会单独换一行;inline元素则前后不会产生换行,一系列inline元素都在一行内显示,直到该行排满。

      • 大体来说HTML元素各有其自身的布局级别(block元素还是inline元素):常见的块级元素有 DIV, FORM, TABLE, P, PRE, H1~H6, DL, OL, UL 等。常见的内联元素有 SPAN, A, STRONG, EM, LABEL, INPUT, SELECT, TEXTAREA, IMG, BR 等。

      • block元素可以包含block元素和inline元素;但inline元素只能包含inline元素。要注意的是这个是个大概的说法,每个特定的元素能包含的元素也是特定的,所以具体到个别元素上,这条规律是不适用的。比如 P 元素,只能包含inline元素,而不能包含block元素。

      • 一般来说,可以通过display:inline和display:block的设置,改变元素的布局级别。

    • block,inline和inlinke-block细节对比

      • display:block

        • block元素会独占一行,多个block元素会各自新起一行。默认情况下,block元素宽度自动填满其父元素宽度。

        • block元素可以设置width,height属性。块级元素即使设置了宽度,仍然是独占一行。

        • block元素可以设置margin和padding属性。

      • display:inline

        • inline元素不会独占一行,多个相邻的行内元素会排列在同一行里,直到一行排列不下,才会新换一行,其宽度随元素的内容而变化。
        • inline元素设置width,height属性无效。
        • inline元素的margin和padding属性,水平方向的padding-left, padding-right, margin-left, margin-right都产生边距效果;但竖直方向的padding-top, padding-bottom, margin-top, margin-bottom不会产生边距效果。
      • display:inline-block

        • 简单来说就是将对象呈现为inline对象,但是对象的内容作为block对象呈现。之后的内联对象会被排列在同一行内。比如我们可以给一个link(a元素)inline-block属性值,使其既具有block的宽度高度特性又具有inline的同行特性。
    • 补充说明

      • 一般我们会用display:block,display:inline或者display:inline-block来调整元素的布局级别,其实display的参数远远不止这三种,仅仅是比较常用而已。
      • IE(低版本IE)本来是不支持inline-block的,所以在IE中对内联元素使用display:inline-block,理论上IE是不识别的,但使用display:inline-block在IE下会触发layout,从而使内联元素拥有了display:inline-block属性的表象。

    写一个方法,使得sum(x)(y)和sum(x,y)返回的结果相同

    //方法1
    var sum= function(x){
        if(arguments[1]){
            return x + arguments[1];
        }else{
            return function (y){
                return x + y
            }
        }
    }
    console.log(sum(1)(2))//3
    console.log(sum(1,2))//3
    
    //扩展
    function sum(x){
        if(arguments[1]){
            var arr = Array.prototype.slice.apply(arguments);
                x = arr.reduce((a, c)=> a+ c)
            return x;
        }else{
            function add(b) { 
                x = x + b; 
                return add;
            }
            add.toString = function() { 
                return x;
            }
            return add; 
        }
    }
    var res1 = sum(1)(2)(3)(4)(5)(6);
    var res2 = sum(1,2,3,4,5,6);
    console.log(res1)//21
    console.log(res2)//21
    

    对浏览器的关键渲染路径的理解

  • 相关阅读:
    八数码难题 (codevs 1225)题解
    小木棍 (codevs 3498)题解
    sliding windows (poj 2823) 题解
    集合删数 (vijos 1545) 题解
    合并果子 (codevs 1063) 题解
    等价表达式 (codevs 1107)题解
    生理周期 (poj 1006) 题解
    区间 (vijos 1439) 题解
    区间覆盖问题 题解
    种树 (codevs 1653) 题解
  • 原文地址:https://www.cnblogs.com/EricZLin/p/12416851.html
Copyright © 2011-2022 走看看