精华内容
下载资源
问答
  • 2021-05-09 13:23:51

    javascript如何判断浏览器是否安装某插件


    如需转载请标明出处:http://blog.csdn.net/itas109
    QQ技术交流群:129518033

    环境:

    chrome: 90

    1. 检测扩展的可访问资源【推荐】

    原理:使用扩展可以访问的资源,确定扩展是否安装或启用

    存在问题:需要知道extension id

    以下 HTML 标签支持 onload :

    <body>, <frame>, <frameset>, <iframe>, <img>, <input type="image">, <link>, <script>, <style>
    
    • 加载图片资源【推荐】

    manifest.json

    {
    ...
    "web_accessible_resources": ["img/logo.png"]
    }
    
    function detectExtension(extensionId, callback) {
        let img;
        img = new Image();
        img.src = "chrome-extension://" + extensionId + "/img/logo.png";
        img.onload = function () {
            callback(true);
        };
        img.onerror = function () {
            callback(false);
        };
    }
    

    • 加载配置json文件【不推荐】

    manifest.json

    通过 web_accessible_resources,列出资源,可经网页访问

    {
    ...
    "web_accessible_resources": ["manifest.json"]
    }
    
    function detectExtension(extensionId, callback) {
        let res = document.createElement('script');
        res.src = 'chrome-extension://' + extensionId + '/manifest.json';
        document.body.appendChild(res);
        res.onload = function () {
            callback(true);
        };
        res.onerror = function () {
            callback(false);
        };
    }
    

    2. 发送消息给插件判断返回信息

    原理:页面 js 向 chrome 插件的 background.js 传送消息判断返回信息

    存在问题:需要解决externally_connectable网址匹配问题

    manifest.json

    externally_connectable 属性声明哪些扩展程序、应用和网页可以通过 runtime.connect 和 runtime.sendMessage 连接到您的扩展程序

    {
    ...
    
    "externally_connectable": {
            "matches": [
                "*://localhost/*"
              ]
        },
    }
    

    background.js(content.js无效)

    chrome.runtime.onMessageExternal.addListener(function(request, sender, sendResponse) {
        if (request && request.message && request.message === "hasExtension") {
            sendResponse({ hasExtension: true });
        }else{
            return true;
        }
    })
    

    页面js

    try {
        // 向指定id插件的 backgrond.js 发送消息
        chrome.runtime.sendMessage(pluginId, {
            message: "hasExtension"
        }, res => {
            if (res && res.hasExtension) {
                console.log('扩展存在');
            }
        })
    } catch (error) {
        console.log(error.message);
        console.log("扩展未启用或不存在");
    }
    

    3. 插件修改页面源代码,写入插件标识,js检测标识

    原理:尽管content script的执行环境与所在的页面是隔离的,但它们还是共享了页面的DOM。如果页面需要与content script通信(或者通过content script与扩展通信), 就必须通过这个共享的DOM。

    存在问题:插件安装或卸载后,需要刷新页面才能生效

    index.html

    <!DOCTYPE html>
    <html>
    
    <body>
        <input id="ExtensionCheck" style="visibility: hidden"></input>
    
        <script>
            function test() {
                let div = document.getElementById("myapp-extension-installed-div");
                if (div) {
                    console.log('扩展存在');
                } else {
                    console.log('扩展未启用或不存在');
                }
            }
        </script>
    </body>
    

    content_script.js

    'use strict';
    
    let div = document.createElement('div');
    div.setAttribute('id', 'my-extension-installed-div');
    document.getElementsByTagName('body')[0].appendChild(div);
    

    4. window.postMessage发送消息

    使用 window.postMessage(或者 window.webkitPostMessage 用于可传输(Transferable)的对象)

    在html中监听,content_script.js中发送消息

    5. 通过共享资源方式

    原理:通过共享资源方式,如cookie

    存在问题:在插件卸载后,没有删除cookie会影响结果判断

    index.html

    if (document.cookie.indexOf('my_extension_installed') != -1){
        console.log('扩展存在');
    }else{
        console.log('扩展未启用或不存在');
    }
    

    content_script.js

    'use strict';
    
    document.cookie = "my_extension_installed=true";
    

    5. NavigatorPlugins.plugins

    返回一个 PluginArray (en-US) 类型的对象, 包含了当前所使用的浏览器安装的所有插件

    注意:该方法只能返回浏览器安装的内置插件

    Plug-in NameFilenameDescription
    Chrome PDF Plugininternal-pdf-viewerPortable Document Format
    Chrome PDF Viewermhjfbmdgcfjbbpaeojofohoefgiehjai
    Native Clientinternal-nacl-plugin

    License

    License under CC BY-NC-ND 4.0: 署名-非商业使用-禁止演绎


    Reference:
    NULL

    更多相关内容
  • vue判断后端返回的数据有没有存data属性 sunyiIrr() { sunyiget1(this.gcid).then((res) => { if (res.code == 200) { if(‘data’ in res){ this.jzsyl.irr = res.data.irr; } } }); },

    vue判断后端返回的数据有没有存data属性

    在这里插入图片描述
    sunyiIrr() {
    sunyiget1(this.gcid).then((res) => {
    if (res.code == 200) {
    if(‘data’ in res){
    this.jzsyl.irr = res.data.irr;
    }
    }
    });
    },

    展开全文
  • 前言有Python基础有数据结构单链表基础,没接触过的可以看下面链接https://blog.csdn.net/sf9898/article/details/104946291原理和实现有一个链表...先去继承一下单链表的蚂蚁花呗(属性和方法),详见链接:https://b...

    前言

    有Python基础

    有数据结构单链表基础,没接触过的可以看下面链接

    https://blog.csdn.net/sf9898/article/details/104946291

    原理和实现

    有一个链表,但是我们不知道这个链表是否内部有形成一个环(形成回路),因此需要有一个函数来检测是否有环(由此可知,这个函数的返回值应是布尔型)。

    先去继承一下单链表的蚂蚁花呗(属性和方法),详见链接:https://blog.csdn.net/sf9898/article/details/104946291 将单链表的定义拷贝下来。

    直接可以做测试,构建一个链表(或许有环,这一部分先写没环的),代码如下:

    ll = Link()

    # 先构建测试用的链表

    for i in range(5):

    ll.addFront(i)

    ll.addFront(100)

    ll.addBack(250)

    for i in range(5):

    ll.addBack(i)

    # 到目前为止是一串没有环的链表

    ll.travel() # 100 4 3 2 1 0 250 0 1 2 3 4

    在代码中加入了几个明显与其他成员格格不入的data,这样子也更容易区分下。

    接下来构建有环的链表,设置一个函数getLastNode使得我们可以取到链表的最后一个节点(这个例子中就是4这个节点),然后将它的next指向250的这个节点(又要有个函数能够取到这个节点,因此有了getNode这个函数),这样就可以形成环了。效果大致如下图。

    # class Link的方法

    def getLastNode(self):

    cur = self.__head

    pre = None

    while cur:

    pre = cur

    cur = cur.next

    return pre

    def getNode(self, item):

    cur = self.__head

    res = None

    while cur:

    if cur.item == item:

    res = cur

    break

    else:

    cur = cur.next

    return res

    ll = Link()

    # 先构建测试用的链表

    for i in range(5):

    ll.addFront(i)

    ll.addFront(100)

    ll.addBack(250)

    for i in range(5):

    ll.addBack(i)

    # 到目前为止是一串没有环的链表

    ll.travel() # 100 4 3 2 1 0 250 0 1 2 3 4

    # 接下来构建有环的链表

    # 设置一个函数getLastNode使得我们可以取到链表的最后一个节点(这个例子中就是4这个节点),

    # 然后将它的next指向250的这个节点(又要有个函数能够取到这个节点,因此有了getNode这个函数),这样就可以形成环了

    # print(ll.getNode(250).item) # 这一行用来验证getNode 函数的正确性,应打印250

    ll.getLastNode().next = ll.getNode(250)

    ll.travel() # 事实上现在遍历一下就可以发现事情不简单了

    既然是要写一个函数来判断,那建议还是将这个函数写成class Link的方法。

    def hasLoop(self):

    if self.__head is None:

    return False

    # 能到这说明头结点不是空的,但是有可能只有一个节点,也有可能 N个(N > 1)

    aNode = self.__head

    bNode = self.__head

    res = False

    # 2个结点,往前跑,一个跑的快,一个跑的慢,如果没有环,慢的结点不会追上快的

    # 如果有环,肯定有一个时刻,快的点绕回来追上了慢的点

    # 如果只有一个或两个结点,则不会进行下面的循环,直接返回False (res)

    while bNode.next and bNode.next.next:

    bNode = bNode.next.next # 这里用B结点代表跑的快的,A是跑的慢的

    aNode = aNode.next

    if bNode == aNode:

    res = True

    break

    return res

    测试一下,完整代码:

    class Node(object):

    def __init__(self, item):

    self.item = item

    self.next = None

    class Link(object):

    def __init__(self):

    self.__head = None

    def isEmpty(self):

    return self.__head is None

    # 头部插入

    def addFront(self, item):

    node = Node(item)

    node.next = self.__head

    self.__head = node

    # 尾部插入

    def addBack(self, item):

    node = Node(item)

    if self.__head is None:

    self.__head = node

    return

    cur = self.__head

    pre = None

    while cur:

    pre = cur

    cur = cur.next

    # 当cur 为最后一个节点时带入,pre更新为最后一个节点,cur更新为最后一个节点的下一个节点即为空,

    # 下一次while cur 时会退出循环,此时的pre表示的就是最后一个节点,将node挂到pre的后面即可

    pre.next = node

    def size(self):

    count = 0

    cur = self.__head

    while cur:

    count += 1

    cur = cur.next

    return count

    def travel(self):

    cur = self.__head

    while cur:

    print(cur.item, end=' ')

    cur = cur.next

    print('')

    # 删除头部节点

    def removeFront(self):

    cur = self.__head

    self.__head = self.__head.next

    cur.next = None

    # 删除尾部节点

    def removeBack(self):

    # 空节点时

    if self.__head is None:

    return

    # 只有一个节点

    if self.__head and self.__head.next is None:

    self.__head = None

    return

    # 链表节点有两个及以上

    cur = self.__head # 当前节点

    pre = None # 前一个节点

    cn = cur.next # 后一个节点

    # 刚开始cur取到的是第一个节点,cn是第二个

    while cn:

    pre = cur

    cur = cur.next

    cn = cur.next

    pre.next = None

    def getLastNode(self):

    cur = self.__head

    pre = None

    while cur:

    pre = cur

    cur = cur.next

    return pre

    def getNode(self, item):

    cur = self.__head

    res = None

    while cur:

    if cur.item == item:

    res = cur

    break

    else:

    cur = cur.next

    return res

    def hasLoop(self):

    if self.__head is None:

    return False

    # 能到这说明头结点不是空的,但是有可能只有一个节点,也有可能 N个(N > 1)

    aNode = self.__head

    bNode = self.__head

    res = False

    # 2个结点,往前跑,一个跑的快,一个跑的慢,如果没有环,慢的结点不会追上快的

    # 如果有环,肯定有一个时刻,快的点绕回来追上了慢的点

    # 如果只有一个或两个结点,则不会进行下面的循环,直接返回False

    while bNode.next and bNode.next.next:

    bNode = bNode.next.next # 这里用B结点代表跑的快的,A是跑的慢的

    aNode = aNode.next

    if bNode == aNode:

    res = True

    break

    return res

    ll = Link()

    # 先构建测试用的链表

    for i in range(5):

    ll.addFront(i)

    ll.addFront(100)

    ll.addBack(250)

    for i in range(5):

    ll.addBack(i)

    # 到目前为止是一串没有环的链表

    ll.travel() # 100 4 3 2 1 0 250 0 1 2 3 4

    # 接下来构建有环的链表

    # 设置一个函数getLastNode使得我们可以取到链表的最后一个节点(这个例子中就是4这个节点),

    # 然后将它的next指向250的这个节点(又要有个函数能够取到这个节点,因此有了getNode这个函数),这样就可以形成环了

    # print(ll.getNode(250).item) # 这一行用来验证getNode 函数的正确性,应打印250

    ll.getLastNode().next = ll.getNode(250)# 注释掉这行,就无法形成环了,这时下面的打印结果应是False

    # ll.travel() # 事实上现在遍历一下就可以发现事情不简单了

    print(ll.hasLoop())

    结果

    后面发现这样其实是不严谨的,当节点数为2的时候,并且第二个node的next指向第一个,这个时候也算是一个环,在上面的代码中吧这种情况当做不是环。为了实现这个要求,需要对上面的代码进行修改。

    def hasLoop(self):

    if self.__head is None:

    return False

    # 能到这说明头结点不是空的,但是有可能只有一个节点,也有可能 N个(N > 1)

    if self.__head and self.__head.next is None:

    # 只有一个头结点,不认为是环

    return False

    # 能到这里就说明,至少有2个节点了

    # 有两个及以上结点,这里第二个节点的next指向None可以说明没有环,否则这里就有可能会出现环

    if self.__head.next.next == self.__head:

    # 如果第二个节点的next指向第一个节点则认为是环,否则可能是指向空或者是下一个节点

    return True

    aNode = self.__head

    bNode = self.__head

    res = False

    # 设置2个结点,往前跑,一个跑的快,一个跑的慢,如果没有环,慢的结点不会追上快的

    # 如果有环,肯定有一个时刻,快的点绕回来追上了慢的点

    # 如果只有两个结点(也就是说第二个节点的next指向None),则不会进行下面的循环,直接返回False

    while bNode.next and bNode.next.next:

    bNode = bNode.next.next # 这里用B结点代表跑的快的,A是跑的慢的

    aNode = aNode.next

    if bNode == aNode:

    res = True

    break

    return res

    完整代码:

    class Node(object):

    def __init__(self, item):

    self.item = item

    self.next = None

    class Link(object):

    def __init__(self):

    self.__head = None

    def isEmpty(self):

    return self.__head is None

    # 头部插入

    def addFront(self, item):

    node = Node(item)

    node.next = self.__head

    self.__head = node

    # 尾部插入

    def addBack(self, item):

    node = Node(item)

    if self.__head is None:

    self.__head = node

    return

    cur = self.__head

    pre = None

    while cur:

    pre = cur

    cur = cur.next

    # 当cur 为最后一个节点时带入,pre更新为最后一个节点,cur更新为最后一个节点的下一个节点即为空,

    # 下一次while cur 时会退出循环,此时的pre表示的就是最后一个节点,将node挂到pre的后面即可

    pre.next = node

    def size(self):

    count = 0

    cur = self.__head

    while cur:

    count += 1

    cur = cur.next

    return count

    def travel(self):

    cur = self.__head

    while cur:

    print(cur.item, end=' ')

    cur = cur.next

    print('')

    # 删除头部节点

    def removeFront(self):

    cur = self.__head

    self.__head = self.__head.next

    cur.next = None

    # 删除尾部节点

    def removeBack(self):

    # 空节点时

    if self.__head is None:

    return

    # 只有一个节点

    if self.__head and self.__head.next is None:

    self.__head = None

    return

    # 链表节点有两个及以上

    cur = self.__head # 当前节点

    pre = None # 前一个节点

    cn = cur.next # 后一个节点

    # 刚开始cur取到的是第一个节点,cn是第二个

    while cn:

    pre = cur

    cur = cur.next

    cn = cur.next

    pre.next = None

    def getLastNode(self):

    cur = self.__head

    pre = None

    while cur:

    pre = cur

    cur = cur.next

    return pre

    def getNode(self, item):

    cur = self.__head

    res = None

    while cur:

    if cur.item == item:

    res = cur

    break

    else:

    cur = cur.next

    return res

    def hasLoop(self):

    if self.__head is None:

    return False

    # 能到这说明头结点不是空的,但是有可能只有一个节点,也有可能 N个(N > 1)

    if self.__head and self.__head.next is None:

    # 只有一个头结点,不认为是环

    return False

    # 能到这里就说明,至少有2个节点了

    # 有两个及以上结点,这里第二个节点的next指向None可以说明没有环,否则这里就有可能会出现环

    if self.__head.next.next == self.__head:

    # 如果第二个节点的next指向第一个节点则认为是环,否则可能是指向空或者是下一个节点

    return True

    aNode = self.__head

    bNode = self.__head

    res = False

    # 设置2个结点,往前跑,一个跑的快,一个跑的慢,如果没有环,慢的结点不会追上快的

    # 如果有环,肯定有一个时刻,快的点绕回来追上了慢的点

    # 如果只有两个结点(也就是说第二个节点的next指向None),则不会进行下面的循环,直接返回False

    while bNode.next and bNode.next.next:

    bNode = bNode.next.next # 这里用B结点代表跑的快的,A是跑的慢的

    aNode = aNode.next

    if bNode == aNode:

    res = True

    break

    return res

    ll = Link()

    # # 先构建测试用的链表

    # for i in range(5):

    # ll.addFront(i)

    # ll.addFront(100)

    # ll.addBack(250)

    # for i in range(5):

    # ll.addBack(i)

    # # 到目前为止是一串没有环的链表

    # ll.travel() # 100 4 3 2 1 0 250 0 1 2 3 4

    # # 接下来构建有环的链表

    # # 设置一个函数getLastNode使得我们可以取到链表的最后一个节点(这个例子中就是4这个节点),

    # # 然后将它的next指向250的这个节点(又要有个函数能够取到这个节点,因此有了getNode这个函数),这样就可以形成环了

    #

    # # print(ll.getNode(250).item) # 这一行用来验证getNode 函数的正确性,应打印250

    #

    # # ll.getLastNode().next = ll.getNode(250)

    # # ll.travel() # 事实上现在遍历一下就可以发现事情不简单了

    # print(ll.hasLoop())

    # 一种特殊的情况,只有两个结点,但是形成环

    ll.addBack(1)

    ll.addBack(2)

    ll.getLastNode().next = ll.getNode(1)

    print(ll.hasLoop())# 现在结果应该是True

    结果

    展开全文
  • Echarts所有属性设置

    千次阅读 多人点赞 2020-10-24 18:22:25
    option下直接可以用的属性 backgroundColor:"#003366" (全局默认背景颜色); color: [’#ff7f50’, ‘#87cefa’, ‘#da70d6’, ‘#32cd32’, ‘#6495ed’, ‘#ff69b4’, ‘#ba55d3’, ‘#cd5c5c’, ‘#ffa500’, ...

    努力到无能为力,拼搏到感动自己

    option下可以用的属性

    1. backgroundColor:“#003366” (全局默认背景颜色);
    2. color: [‘#ff7f50’, ‘#87cefa’, ‘#da70d6’, ‘#32cd32’, ‘#6495ed’,
      ‘#ff69b4’, ‘#ba55d3’, ‘#cd5c5c’, ‘#ffa500’, ‘#40e0d0’,
      ‘#1e90ff’, ‘#ff6347’, ‘#7b68ee’, ‘#00fa9a’, ‘#ffd700’,
      ‘#6699FF’, ‘#ff6666’, ‘#3cb371’, ‘#b8860b’, ‘#30e0e0’]

    1. Echarts - title 属性

    title:{
    	x:"left",    // 'left' | 'right' | 'center' | '100px'
    	y:"4%",     // 'top' | 'bottom' | 'center' | '100px'
        // 标题
        show: true, //是否显示
        text: "标题内容",
        textStyle: {
          color: "#fff", // 主标题文字的颜色。
          fontStyle: "normal", // 主标题文字字体的风格。 'normal'  'italic'  'oblique'
          fontWeight: "normal", // 主标题文字字体的粗细。 'normal' 'bold'  'bolder'  'lighter' 500|600
          fontFamily: "sans-serif", // 主标题文字的字体系列。
          fontSize: 18, // 字体大小
          lineHeight: "30", // 行高
          // width ... , // 文字块的宽度
          // height ... , // 文字块的高度
          textBorderColor: "transparent", // 文字本身的描边颜色。
          textBorderWidth: 0, // 文字本身的描边宽度。
          textShadowColor: "transparent", // 文字本身的阴影颜色。
          textShadowBlur: 0, // 文字本身的阴影长度。
          textShadowOffsetX: 0, // 文字本身的阴影 X 偏移。
          textShadowOffsetY: 0, //  文字本身的阴影 Y 偏移。
        },
        subtext: "bb", // 副标题文本
        subtextStyle: {
          color: "red",
          fontSize: "16",
        },   //副标题样式
        textAlign: "auto", //水平对齐'auto''left''right''center'
        textVerticalAlign: "auto", // 垂直对齐  'auto''top''bottom''middle'
        triggerEvent: false, // 是否触发事件
        padding: 5, // 标题内边距  5/[5,2,4,7]
        itemGap: 10, //主副标题之间的间距
        left: 10, // 距离 left top right bottom
        x: "center",  // 水平安放位置,默认为左对齐,可选为:'center' ¦ 'left' ¦ 'right' ¦ {number}(x坐标,单位px)
        y: "4%",      // 垂直安放位置,默认为全图顶端,可选为:// 'top' ¦ 'bottom' ¦ 'center'¦ {number}(y坐标,单位px)
        backgroundColor: "pink", // 标题背景色
        borderColor: "#ccc", // 标题的边框颜色
        borderWidth: 5, // 标题的边框线宽。
        borderRadius: 2, // 圆角半径
        shadowBlur: 10, //图形阴影的模糊大小
        shadowColor: "rgba(0, 0, 0, 0.5)", // 阴影颜色
        shadowOffsetX: 5, // 阴影水平方向上的偏移距离。
        shadowOffsetY: 5, //阴影垂直方向上的偏移距离。
    }
    

    2. Echarts - tooltip

    tooltip ={                                  //提示框组件
        trigger: 'item',                        //触发类型,'item'数据项图形触发,主要在散点图,饼图等无类目轴的图表中使用。 'axis'坐标轴触发,主要在柱状图,折线图等会使用类目轴的图表中使用。
        triggerOn:"mousemove",                  //提示框触发的条件,'mousemove'鼠标移动时触发。'click'鼠标点击时触发。'mousemove|click'同时鼠标移动和点击时触发。'none'不在 'mousemove''click' 时触发
        showContent:true,                       //是否显示提示框浮层
        alwaysShowContent:true,                 //是否永远显示提示框内容
        showDelay:0,                            //浮层显示的延迟,单位为 ms
        hideDelay:100,                          //浮层隐藏的延迟,单位为 ms
        enterable:false,                        //鼠标是否可进入提示框浮层中
        confine:false,                          //是否将 tooltip 框限制在图表的区域内
        transitionDuration:0.4,                 //提示框浮层的移动动画过渡时间,单位是 s,设置为 0 的时候会紧跟着鼠标移动
        position:['50%', '50%'],                //提示框浮层的位置,默认不设置时位置会跟随鼠标的位置,[10, 10],回掉函数,inside鼠标所在图形的内部中心位置,top、left、bottom、right鼠标所在图形上侧,左侧,下侧,右侧,
        formatter:"{b0}: {c0}<br />{b1}: {c1}", //提示框浮层内容格式器,支持字符串模板和回调函数两种形式,模板变量有 {a}, {b}{c}{d}{e},分别表示系列名,数据名,数据值等
        backgroundColor:"transparent",          //标题背景色
        borderColor:"#ccc",                     //边框颜色
        borderWidth:0,                          //边框线宽
        padding:5,                              //图例内边距,单位px  5  [5, 10]  [5,10,5,10]
        textStyle:mytextStyle,                  //文本样式
        axisPointer: {                          // 鼠标放在
          type: 'cross', //默认为line,line直线,cross十字准星,shadow阴影
          crossStyle: {
                  color: '#fff'
          },
          lineStyle: {    //鼠标放上去的样式
            color: {
              type: "linear",
              x: 0,
              y: 0,
              x2: 0,
              y2: 1,
              colorStops: [
                {
                  offset: 0,
                  color: "rgba(255,255,255,0)", // 0% 处的颜色
                },
                {
                  offset: 0.5,
                  color: "rgba(255,255,255,1)", // 100% 处的颜色
                },
                {
                  offset: 1,
                  color: "rgba(255,255,255,0)", // 100% 处的颜色
                },
              ],
              global: false, // 缺省为 false
            },
          },
        },
        formatter: function (value) {
          for (var i = 0; i < value.length; i++) {
            return (
              value[i].seriesName +
              "<br/>" +
              value[i].name +
              unit +
              ":" +
              value[i].value +
              "%"
            );
          }
        },
    };
    

    3. Echarts - legend

            legend: {
              show: true, //是否显示
              type: "plain", // 图例的类型 'plain':普通图例  'scroll':可滚动翻页的图例
              zlevel: 1, // 所有图形的 zlevel 值。
              icon: "circle",类型包括 circle,rect,line,roundRect,triangle,diamond,pin,arrow,none
              top: "5%", // bottom:"20%" // 组件离容器的距离
              right: "5%", //left:"10%"  // // 组件离容器的距离
              width: "auto", // 图例组件的宽度
              height: "auto", // 图例组件的高度 height: 150,
              orient: "horizontal", // 图例列表的布局朝向。 'horizontal'  'vertical'
              align: "auto", // 图例标记和文本的对齐
              padding: 5, // 图例内边距
              itemWidth: 6, // 图例标记的图形宽度。
              itemGap: 20, // 图例每项之间的间隔。
              itemHeight: 14, //  图例标记的图形高度。
              symbolKeepAspect: true, // 如果图标(可能来自系列的 symbol 或用户自定义的 legend.data.icon)是 path:// 的形式,是否在缩放时保持该图形的长宽比。
              formatter: function (name) {
                return '{a|text}{a|   }{b|' +  name + '}'
              },
              selectedMode: true, // 图例选择的模式,
              inactiveColor: "#ccc", // 图例关闭时的颜色。
              textStyle: {
                color: "#556677", // 文字的颜色。
                fontStyle: "normal", // 文字字体的风格。
                fontWeight: "normal", // 文字字体的粗细。 'normal' 'bold'  'bolder' 'lighter'  100 | 200 | 300 | 400...
                fontFamily: "sans-serif", // 文字的字体系列。
                fontSize: 12, // 文字的字体大小。
                lineHeight: 20, // 行高。
                backgroundColor: "transparent", // 文字块背景色。
                borderColor: "transparent", // 文字块边框颜色。
                borderWidth: 0, // 文字块边框宽度。
                borderRadius: 0, // 文字块的圆角。
                padding: 0, // 文字块的内边距
                shadowColor: "transparent", // 文字块的背景阴影颜色
                shadowBlur: 0, // 文字块的背景阴影长度。
                shadowOffsetX: 0, // 文字块的背景阴影 X 偏移。
                shadowOffsetY: 0, // 文字块的背景阴影 Y 偏移。
                // width: 50, // 文字块的宽度。 默认
                // height: 40, // 文字块的高度 默认
                textBorderColor: "transparent", // 文字本身的描边颜色。
                textBorderWidth: 0, // 文字本身的描边宽度。
                textShadowColor: "transparent", // 文字本身的阴影颜色。
                textShadowBlur: 0, // 文字本身的阴影长度。
                textShadowOffsetX: 0, // 文字本身的阴影 X 偏移。
                textShadowOffsetY: 0, // 文字本身的阴影 Y 偏移。
                rich: {
                a: {
                  color: "red",
                  lineHeight: 10,
                },
                 b: {
                  color: "#fff",
                  lineHeight: 10,
                },
              }, // 自定富文本样式
              },
            },
    
    

    4. Echarts - grid

    grid 为直角坐标系内绘图网格,可以设置 x y x2 y2 等值。

    grid:{
    	x: 80,   //top:"15%" | right:"3%" | left:"2%" | bottom:"12%"
        y: 60,
        x2: 80,
        y2: 60,
        // width: {totalWidth} - x - x2,
        // height: {totalHeight} - y - y2,
        backgroundColor: ‘rgba(0,0,0,0)‘,
        borderWidth: 1,
        borderColor: '#ccc',
        containLabel: true, //防止坐标轴标签溢出
    }
    
    
    dataZoom: [
         {
          	type: 'slider',
           show: true,
           height: 20,//组件高度
           xAxisIndex: [0],
           bottom: 0,//右边的距离
           start: 0,
           end: 1,
           zoomLock: false,
           zoomOnMouseWheel: true, //如何触发缩放。可选值为:true:表示不按任何功能键,鼠标滚轮能触发缩放。false:表示鼠标滚轮不能触发缩放。'shift':表示按住 shift 和鼠标滚轮能触发缩放。'ctrl':表示按住 ctrl 和鼠标滚轮能触发缩放。'alt':表示按住 alt 和鼠标滚轮能触发缩放。
           moveOnMouseMove: true,
           handleIcon:
             "path://M306.1,413c0,2.2-1.8,4-4,4h-59.8c-2.2,0-4-1.8-4-4V200.8c0-2.2,1.8-4,4-4h59.8c2.2,0,4,1.8,4,4V413z",
           handleSize: "110%", /滑动条的左右两个滑动条的大小
           handleColor: '#ddd',//h滑动图标的颜色
           handleStyle: {
             color: "#01AD83",
             borderColor: "#cacaca",
             borderWidth: "1",
             shadowBlur: 2,
             background: "#ddd",
             shadowColor: "#ddd",
           },
           textStyle: {
             color: "rgba(1,173,131,0.5)",
           },
           // fillerColor: "rgba(1,173,131,0.4)",
           fillerColor: new echarts.graphic.LinearGradient(1, 0, 0, 0, [{
              //给颜色设置渐变色 前面4个参数,给第一个设置1,第四个设置0 ,就是水平渐变
              //给第一个设置0,第四个设置1,就是垂直渐变
              offset: 0,
              color: '#1eb5e5'
           }, {
              offset: 1,
              color: '#5ccbb1'
           }]),
          backgroundColor: '#ddd',//两边未选中的滑动条区域的颜色
          showDataShadow: false,//是否显示数据阴影 默认auto
          showDetail: false,//即拖拽时候是否显示详细数值信息 默认true
          borderColor: "rgba(1,173,131,0.5)",
         },
         //下面这个属性是里面拖到
         {
           type: "inside",
           show: true,
           height: 15,
           start: 0,
           end: 1,
         },
       ],
    

    5. Echarts - xAxis

    xAxis: {
      boundaryGap: false,// 刻度离纵轴有无间隙,默认true有间距
      type: 'category', //'value' 数值轴,适用于连续数据。 'category' 类目轴,适用于离散的类目数据,为该类型时必须通过 data 设置类目数据。 'time' 时间轴,适用于连续的时序数据,与数值轴相比时间轴带有时间的格式化,在刻度计算上也有所不同,例如会根据跨度的范围来决定使用月,星期,日还是小时范围的刻度。 'log' 对数轴。适用于对数数据。
      position:'bottom',  // 'bottom' | 'top'
      name: '(ETD)',// 横轴名称
      nameTextStyle:{
        fontSize:12,
        fontWeight:'bold',
        color:'#ff0033',
        //align:'left',
      },
      nameLocation:'middle',//坐标轴的位置 'start' | 'center' | 'end'
      nameGap:50,//坐标轴名称与轴线之间的距离
      nameRotate:90,//坐标轴名字旋转角度值,
      axisLabel : {//坐标轴刻度标签的相关设置。
          // clickable:true,//并给图表添加单击事件  根据返回值判断点击的是哪里
          interval: 0,
          **//注:interval 坐标轴刻度标签的显示间隔(在类目轴中有效哦),默认会采用标签不重叠的方式显示标签(也就是默认会将部分文字显示不全)
    可以设置为0强制显示所有标签,如果设置为1,表示隔一个标签显示一个标签,如果为3,表示隔3个标签显示一个标签,以此类推**
          inside:false, //  标签朝内还是朝外
          rotate: 40,// 文字倾斜度
          //-----------文字竖直显示--------------------
          formatter:function(value){
             return value.split("").join("\n");
          }
         //-----------------------------------两个字垂直显示----------------------------
         formatter:function(value)
         {
             debugger
             var ret = "";//拼接加\n返回的类目项
             var maxLength = 2;//每项显示文字个数
             var valLength = value.length;//X轴类目项的文字个数
             var rowN = Math.ceil(valLength / maxLength); //类目项需要换行的行数
             if (rowN > 1)//如果类目项的文字大于3,
             {
                 for (var i = 0; i < rowN; i++) {
                     var temp = "";//每次截取的字符串
                     var start = i * maxLength;//开始截取的位置
                     var end = start + maxLength;//结束截取的位置
                     //这里也可以加一个是否是最后一行的判断,但是不加也没有影响,那就不加吧
                     temp = value.substring(start, end) + "\n";
                     ret += temp; //凭借最终的字符串
                 }
                 return ret;
             }
             else {
                 return value;
             }
         }
    //------------------------------------------------------------------------------------
          textStyle:{
          	color:'#fff,
          	fontSize:'20px',
          	align:'center'
          }
      },
      axisLine:{
        lineStyle:{
          color:'red'   //x轴颜色
        },
        symbol:['none','arrow'], //轴线两边的箭头
        symbolSize:[8, 12]  //箭头大小
      },
      data: ['2020-07-08 周三','2020-07-09 周四',].map((str) => {
          return str.replace(' ','\n')
      }),// 横轴坐标值
      // data: [{value:'1',textStyle:{
                color:'#ff0033',
            }}, '2/7', '3', '4', '5', '6', '7']//每一项也可以是具体的配置项,此时取配置项中的 `value` 为类目名
      splitLine: {
      	show: false,
      	lineStyle:{  //属性lineStyle(详见lineStyle)控制线条样式
    		color:['#ccc'],
    		width:1,
    		type:'solid'
    	}
      },  // 取消X轴的网格
      splitArea:{   //分隔区域
        show:true,
        areaStyle:{
    		color:['rgba(250,250,250,0.3)','rgba(200,200,200,0.3)'],
    	}
      },
      axisTick: {  // 显示隐藏刻度线
       inside:true, //刻度朝内还是朝外
       alignWithLabel: true   // 刻度线是否显示
      }
    }
    

    6. Echarts - yAxis

    yAxis: {
       type: 'value',
       name: "         金额( 单位: 万元 )",
       nameTextStyle: {
         color: '#ffffff',
         padding: [0, 0, 0, -10] ,//调整位置
       },
       scale: true,//自动适配y轴,不需要必须从0开始
       axisLine: {
         show: false,
         lineStyle: {
           type: 'dashed',
           color: 'rgba(135,140,147,0.8)'
         },
         axisLabel: {
           show: true,
           textStyle: {
             color: "#fff",
             fontSize: "16",
           },
           formatter:function(value){     //设置Y轴显示的名字,超出做..隐藏
             var res = value;
             if(res.length >7){
               res = res.substring(0,6) + ".."
             }
             return res;
           }
         },
       },
       splitLine: {
         show: true,
         lineStyle: {
           type: 'dashed',   //背景线为虚线
           color: 'rgba(135,140,147,.8)' //左侧显示线
         }
       },
       axisLabel: {
         formatter: '{value}',
         color: '#fff',
         fontSize: 14
       }
     },
    

    7. Echarts - bar

    bar:{
    	barMinHeight: 0, // 最小高度改为0
        // barWidth: null,        // 默认自适应
        colorBy: "series", //按照系列分配调色盘中的颜色,同一系列中的所有数据都是用相同的颜色;【从调色盘 option.color 中取色的策略】
        barGap: '30%', // 柱间距离,默认为柱形宽度的30%,可设固定值
        barCategoryGap: '20%', // 类目间柱形距离,默认为类目间距的20%,可设固定值,需要注意的是,如果设置了barWidth 该属性将不起作用
        label: {
                    show: true, // 柱子顶部的数值
                    position: "top",
                    fontSize: 12,
                    color: "#fff",
                    offset: [0, -10],
                    formatter: function (params) {
                      let num = params.value;
                      if (num > 1024) {
                        return (num / 1024).toFixed(2) + "GB";
                      } else if (num < 1024 && num > 0) {
                        return num.toFixed(2) + "MB";
                      } else {
                        return "";
                      }
                    },
                  },
        itemStyle: {
            normal: {
                // color: '各异',
                color: function (params) {
                    return colors[params.dataIndex];
                 }, //可以设置每个柱子的颜色
                barBorderColor: '#fff', // 柱条边线
                barBorderRadius: 0, // 柱条边线圆角,单位px,默认为0
                barBorderWidth: 1, // 柱条边线线宽,单位px,默认为1
                label: {  //z柱状图上显示数字
                    show: false
                    position: 'top',// 默认自适应,水平布局为'top',垂直布局为'right',可选为'inside'|'left'|'right'|'top'|'bottom|insideTop'
                    textStyle: {
                        color: "#01E6FF",
                      },      // 默认使用全局文本样式,详见TEXTSTYLE
                    // formatter: function (p) {
                    //   return p.value > 0 ? p.value : "";
                    //},
                    formatter: function (params) {
                      let num = params.value;
                      if (num > 1024) {
                        return (num / 1024).toFixed(2) + "GB";
                      } else if (num < 1024 && num > 0) {
                        return num.toFixed(2) + "MB";
                      } else {
                        return "";
                      }
                    },
                }
            },
            emphasis: {   // 鼠标移入的样式
                // color: '各异',
                barBorderColor: 'rgba(0,0,0,0)', // 柱条边线
                barBorderRadius: 0, // 柱条边线圆角,单位px,默认为0
                barBorderWidth: 1, // 柱条边线线宽,单位px,默认为1
                label: {
                    show: false
                    // position: 默认自适应,水平布局为'top',垂直布局为'right',可选为
                    //           'inside'|'left'|'right'|'top'|'bottom'
                    // textStyle: null      // 默认使用全局文本样式,详见TEXTSTYLE
                }
            }
        }
    }
    

    8. Echarts - line

    line: {
    	  itemStyle: {
    	       normal: {
    	           // color: 各异,
    	           label: {
    	               show: false
    	               // position: 默认自适应,水平布局为'top',垂直布局为'right',可选为
    	               //           'inside'|'left'|'right'|'top'|'bottom'
    	               // textStyle: null      // 默认使用全局文本样式,详见TEXTSTYLE
    	           },
    	           lineStyle: {
    	               width: 2,
    	               type: 'solid',
    	               	normal: {
    	               	//线的渐变颜色
    		                color: new echarts.graphic.LinearGradient(0, 0, 0, 0.7, [        
    		                  {
    		                    offset: 0,
    		                    color: "#24D5CC",
    		                  },
    		                  {
    		                    offset: 1,
    		                    color: "#7A50F1",
    		                  },
    		                ]),
    		                opacity: 0.75,
    		              },
    	               shadowColor: 'rgba(0,0,0,0)', //默认透明  阴影
    	               shadowBlur: 5,
    	               shadowOffsetX: 3,
    	               shadowOffsetY: 3
    	           }itemStyle: {
    	              normal: {
    	                lineStyle: {
    	                  width: 3, //设置线条粗细
    	                },
    	              },
    	            },
    	          areaStyle: {   //折线图覆盖面积
                      color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
                        {
                          offset: 0,
                          color: "rgba(255,80,124,0)",
                        },
                        {
                          offset: 1,
                          color: "rgba(255,80,124,0.35)",
                        },
                      ]),    //渐变色
                    },
    	       },
    	       emphasis: {   // 鼠标移入
    	           // color: 各异,
    	           label: {
    	               show: false
    	               // position: 默认自适应,水平布局为'top',垂直布局为'right',可选为
    	               //           'inside'|'left'|'right'|'top'|'bottom'
    	               // textStyle: null      // 默认使用全局文本样式,详见TEXTSTYLE
    	           }
    	       }
    	   },
    	   //smooth : false,  //是否平滑
    	   //symbol: null,         // 拐点图形类型,可以自己设置图片
    	   symbolSize: 2, // 拐点图形大小
    	   itemStyle: {   //拐点样式
                normal: {
                  color: this.params.color[index],
                  borderColor: "#fff",
                  type:'dotted'  //'dotted'虚线 'solid'实线
                },
              },
    	   symbolOffset: ["0", "-8"],//拐点位置
    	   //symbolRotate : null,  // 拐点图形旋转控制
    	   showAllSymbol: false // 标志图形默认只有主轴显示(随主轴标签间隔隐藏策略)
    },
    

    9. Echarts - pie

    // 横向柱状图
    series: [
              {
                type: "pie",
                radius: ["45%", "60%"],
                center: this.center,
                data: echartData,
                hoverAnimation: false,
                itemStyle: {
                  normal: {
                    borderColor: bgColor,
                    borderWidth: 2
                  }
                },
                labelLine: {
                  normal: {
                    length: 20,
                    // length2: 100,  //外边的引导线的长度
                    lineStyle: {
                      color: "#999"
                    }
                  }
                },
                label: {
                  normal: {
                  //https://echarts.apache.org/zh/option.html#grid.tooltip.formatter
                  //{a},{b},{c},{d}各代表不同的值
                  // formatter: "{font|{b}}\n{hr|}\n{font|{d}%}",
                    formatter: params => {
                      return (
                        "{icon|●}{name|" +
                        params.name +
                        "}{value|" +
                        formatNumber(params.value) +
                        "}"
                      );
                    },
                    padding: [0, 0, 0, 0],
                    rich: {
                      icon: {
                        fontSize: 16
                      },
                      name: {
                        fontSize: 14,
                        padding: [0, 10, 0, 4],
                        color: "#666"
                      },
                      value: {
                        fontSize: 16,
                        fontWeight: "bold",
                        color: "#666"
                      },
                      hr: {
                        height: 0,
                        borderWidth: 1,
                        width: "100%",
                        borderColor: "#999"
                      }
                    }
                  }
                }
              }
            ]
       
    
    

    10. Echarts - series

    // 横向柱状图
     series: [{
            name: '标准化',
            type: 'bar',
            barWidth: 12, // 柱子宽度
            label: {
                show: true,
                position: 'right', // 位置
                color: '#A7D6F4',
                fontSize: 14,
                distance: 15, // 距离
    			formatter: '{c} 万公里' // 这里是数据展示的时候显示的数据
            }, // 柱子上方的数值
            itemStyle: {
                barBorderRadius: [0, 20, 20, 0], // 圆角(左上、右上、右下、左下)
                
                    color: new echarts.graphic.LinearGradient(1, 0, 0, 0, [{
                        offset: 0,
                        color: '#51C5FD'
                    }, {
                        offset: 1,
                        color: '#005BB1' 
                    }], false), // 渐变
            },
            data: [400,380,360,340,320,300,280,260,240,220]
        }, ]
       
    
    
    echarts 点击事件
     that.chart.off("click"); //防止重复调接口
     that.chart.on("click", function(params) {
       that.$emit("handleScoreDialog", params);
     });
    
    展开全文
  • }) } else { obj[prop] = value } return true } }) } } script> 逻辑很简单,通过proxy拦截属性值切换,上面的代码在切换选项会有弹窗,只有选择确认值才会切换,proxy的相关用法可以参考:MDN Proxy用法
  • 目录概述目标属性的语义分析TransformTargetList函数ResTarget结构体TransformTargetEntry函数makeTargetEntry函数TargetEntry结构体TransformExpr函数Var结构体Where子句的语义分析TransformWhereClause函数语义...
  • Echarts中Option属性设置

    2021-09-11 14:07:12
    一、title--标题组件 标题组件,包含主标题和副标题。 复制title:{ x:"left", // 'left' | 'right' | 'center' | '100px' y:"4%", // 'top' | 'bottom' | 'center' | '100px' // 标题 show: true, //是否显示...
  • // clickable:true,//并给图表添加单击事件 根据返回值判断点击的是哪里 interval: 0, inside:false, // 标签朝内还是朝外 rotate: 40,// 文字倾斜度 textStyle:{ color:’#fff, fontSize:‘20px’, align:‘center...
  • Android 软键盘显示隐藏判断

    千次阅读 2019-06-20 08:34:23
    Android 软键盘显示隐藏判断前言参考 前言 如何判断软键盘是否在显示? // 这个逻辑不正确(无效) if(getWindow().getAttributes().softInputMode == WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE){ ...
  • SQL 实例: SELECT arraySlice([10, 20, 30, 40, 50], 1, 2) AS res1, arraySlice([10, 20, 30, 40, 50], 1) AS res2 FORMAT Vertical 输出: res1: [10,20] res2: [10,20,30,40,50] 数组元素展开 函数:arrayJoin...
  • value表示当前对象的默认值 writable表示对象属性是否可以修改 enumerable表示当前这个属性是否可以出现在对象的枚举属性中 configurable表示当前对象的属性能否用delete删除 那这些对象的属性我们怎么设置和修改...
  • this.$confirm(message, title, options) .then(res =>{}) .catch(err =>{}) 这样业务代码可以写在then的回调函数中,组件的核心实现代码如下所示: //confirm.vue //... //index.js import Vue from 'vue'; ...
  • 并且在字符串中可以结合三目表达式判定,如果返回值的某个属性为空则显示空字符串。 注: 博客:BADAO_LIUMANG_QIZHI的博客_霸道流氓气质_CSDN博客-C#,架构之路,SpringBoot领域博主 关注公众号 霸道的程序猿 获取...
  • meta 标识符 也是路由配置里面可以写的 // 他可以用来 判断一些操作 meta:{ // 名字:值 isAlive:false // 我想 isAlive false代表不缓存 // 需要缓存的就在这写成 isAlive:true } }, { path: '/about', name: '...
  • 1:使用android: 只需在textview中加入这个属性在里面写的文字中包含网址、电话、email的会自动加入连接地址。 如: http://schemas.android.com/apk/res/android" android:id="@+id/text1" android:...
  • 判断null,es6新增数据类型判断nulles6新增数据类型 判断null Q:如何判断一个变量的值为null? A:利用“===”或“! && typeof()” 仅用!会出现!undefined也为true的情况,所以要添加typeof约束 let a = ...
  • 13 万字 C 语言从入门到精通保姆级教程2021 年版

    万次阅读 多人点赞 2021-06-07 12:25:01
    13 万字C语言保姆级教程,从入门到精通。
  • 创建一个Library项目制作我们的皮肤包(res下的资源名称需要与app使用的一致,换肤就是通过使用的资源名称去皮肤包里加载相同名字的资源) 创建皮肤包对应的Resources对象(用于加载皮肤包内的资源) 点击换肤将我们...
  • 同一个Promise可以被多次调用then方法 // 当我们的resolve方法被回调时, 所有的then方法传入的回调函数都会被调用 promise.then(res => { console.log("res1:", res) //res1: hahaha return 9 }).then(res => { ...
  • Asset目录与res目录的区别 System.gc && Runtime.gc Application 在多进程下会多次调用 onCreate() 么? Theme && Style SQLiteOpenHelper.onCreate() 调用时机? Removecallback 失效? Toast 如果会短时间内频繁...
  • JVM垃圾回收-如何判断对象是否是垃圾对象? JVM垃圾回收算法有哪些? JVM垃圾收集器有哪些? JVM内存是如何分配的? 从一道面试题分析类的加载过程? JVM双亲委派机制? JVM可以作为GC Root的对象有哪些? 请写出几...
  • 007:Scrapy核心架构和高级运用

    千次阅读 2019-01-24 22:44:37
    cb_res = self.process_results(response, cb_res) for requests_or_item in iterate_spider_output(cb_res): yield requests_or_item ## 其次判断有无follow,用_requests_to_follow解析响应是否有符合要求的link...
  • 史上最全App瘦身实践

    2019-01-08 09:32:59
    res dex META-INF androidManifest 这几个部分构成的。下面我会利用as的分析工具,以微信、微博、淘宝为例进行讲述。 开始分析后几秒钟就能输出结果,你还可以看到具体类目占的百分比,清晰明了。旁边的“对比”按钮...
  • return x if x>y else y def max4(a,b,c,d): """判断4个数的大小""" res1 = max2(a,b) res2 = max2(res1,c) res3 = max2(res2,d) return res3 print(max4(12,34,11,35)) 名称空间和作用域 名称空间定义 #倒入模块 ...
  • //判断有无header,如果有的话,那么header无需刷新 只需要刷新空布局即可 if (mHeadAndEmptyEnable && getHeaderLayoutCount() != 0 ) { position++; } notifyItemInserted(position); } } } /** * ...
  • #################################################...# PUBLIC METHODS THAT ALTER ATTRIBUTES AND RETURN A NEW QUERYSET # 公共方法:通过操作属性,来返回一个新的queryset查询集 ###########################...
  • express 框架之session

    2017-12-29 14:22:43
    支持cookie的浏览器都会对此作出反应,即创建cookie文件并保存(也可能是内存cookie),用户以后在每次发出请求时,浏览器都要判断当前所有的cookie中有没有没失效(根据expires属性判断)并且匹配了path属性的...
  • android:enabled:是否可以被系统实例化,默认为 true因为父标签 也有 enable 属性,所以必须两个都为默认值 true 的情况下服务才会被激活,否则不会激活。   ok~,关于Service在清单文件的声明我们先了解这些就...
  • 启动任务栈的Activity,这两个属性是用包名(CompentName)表示的,real和orig是为了区分Activity有无别名的情况,如果AndroidManifest.xml中定义的Activity是一个alias,则此处real表示Activity的别名,orig表示真实...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,026
精华内容 810
关键字:

判断res有无属性