一个避免用户重复点击按钮造成重复数据的小技巧

本文介绍了一种使用JavaScript实现遮罩层的方法,并演示了如何通过自定义函数来控制遮罩层的显示与隐藏,防止重复点击提交按钮,确保用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    <script>
        //启用遮罩
        function SetEstopForButton(buttionId) {
            if ($("#btnEstop")[0] == null) {
                $("#" + buttionId).after("<div id='btnEstop' style='z-index:999999;position:absolute;background-color:#ccc;filter:Alpha(Opacity-30);background:url(/images/ui-bg_flat_0_aaaaa_40x100.png) #aaaaaa repeat-x 50% 50%;opacity:0.3;'></div>");
                $("#btnEstop").css("width", ($("#" + buttionId).outerWidth() + 4));
                $("#btnEstop").css("height", ($("#" + buttionId).outerHeight() + 4));
                $("#btnEstop").css("left", ($("#" + buttionId).offset().left - 2));
                $("#btnEstop").css("top", ($("#" + buttionId).offset().top - 2));
            }
        }

        //移除遮罩
        function RemoveEstopForButtton() {
            $("#btnEstop").remove();
        }

        //是否已经点击了按钮
        var _isChickButton = false;

        function IR_StopContinuteClick(fun, buttonId) {
          
            if (typeof (fun) != "function") {
                return false;
            }

            //先判断是否已经点击了
            if (_isChickButton) {
                return false;
            }
            _isChickButton = true;

            //设置提交按钮不可编辑
            SetEstopForButton(buttonId);

            if (!fun()) {
                //恢复提交按钮编辑
                RemoveEstopForButtton();
                _isChickButton = false;
            }
            return true;
        }

    </script>

    <script type="text/javascript">

        function CheckData() {

            return IR_StopContinuteClick(DoCheck, "myBtn");

        }

        function DoCheck() {
            var username = document.getElementById("userName").value;
            if(username=="") {
                return false;
            }
            return true;
         }
    </script>

 

<form id="form1" runat="server">
    <div>
        <input id="userName" />
        <input type="button" value="提交"  id="myBtn" onclick="return CheckData()"/>
        <input value="启用遮罩" onclick="SetEstopForButton('myinput')" id="myinput" type="button" />
        <input value="移除遮罩" onclick="RemoveEstopForButtton()" id="Button1" type="button" />
    </div>
    </form>

<think>我们面对的问题:在Spotfire组合图中为超过30个系列配置不重复的颜色方案。 由于Spotfire默认颜色方案通常只有10-30种颜色,当系列数量超过30时,颜色会重复。以下提供几种解决方案: 方法1:使用连续型颜色方案(适用于数值型数据) - 原理:将离散类别映射到连续色谱上,利用连续色谱的无限颜色梯度 - 步骤: 1. 在组合图属性中,将颜色依据设置为一个数值列(如销售额、数量等) 2. 选择连续颜色方案(如彩虹色、热力图等) 3. 调整梯度范围以适应数据分布 - 优点:颜色完全连续不重复 - 缺点:仅适用于数值型分类依据 方法2:创建组合颜色键(适用于类别型数据) - 原理:通过拼接多个类别列创建唯一组合键,并分配颜色 - 步骤: 1. 添加计算列:`[Category1] & "|" & [Category2]`(确保唯一性) 2. 使用该列作为颜色依据 3. 手动扩展颜色方案:在颜色方案设置中点击“添加”按钮增加颜色数量 - 扩展颜色技巧:使用相邻色相渐变公式生成新颜色 $$ \text{Hue}_i = \left( \frac{360^\circ}{n} \times i \right) \mod 360^\circ $$ 其中$n$为所需颜色总数,$i$为类别索引(从0开始) 方法3:分页显示(大数据量最佳实践) - 原理:将系列分组到多个页面显示,每页不超过30个系列 - 步骤: 1. 组合图属性 → 一般 → 启用分页 2. 设置分页依据:选择适当的分组列(如时间维度) 3. 调整每页系列数(建议20-25个) - 优点:避免视觉混乱,同时保证颜色不重复 - 注意:需配合导航按钮使用(属性 → 分页 → 显示分页导航器) 方法4:脚本动态生成颜色(高级) ```python # IronPython脚本:为超过30个系列生成唯一颜色 from Spotfire.Dxp.Application.Visuals import * from System.Drawing import Color import math # 获取组合图 viz = vis.As[CombinationChart]() # 计算所需颜色总数 all_categories = viz.Data.DataTableReference.GetColumn(viz.ColorAxis.Expression).UniqueValues n = len(all_categories) # 生成HSL颜色:色相均匀分布,饱和度和亮度微调避免相近 colors = [] for i in range(n): hue = (i * 360.0 / n) % 360.0 saturation = 70 + (i % 3)*10 # 在70%-90%之间变化 lightness = 50 + (i % 2)*5 # 在50%-55%之间变化 rgb = HslToRgb(hue, saturation, lightness) colors.append(Color.FromArgb(rgb[0], rgb[1], rgb[2])) # 应用自定义颜色方案 viz.ColorScheme.Type = ColorSchemeType.Custom viz.ColorScheme.CustomPalette = colors # HSL转RGB辅助函数(省略具体转换代码,实际使用时需实现) def HslToRgb(h, s, l): # 这里应放置转换代码(因篇幅限制省略) return (r, g, b) # 返回RGB整数值 ``` 方法5:使用外部扩展工具 - TIBCO Exchange提供的“ColorBrewer”扩展提供多达120种不重复颜色 - 安装步骤:工具 → 扩展管理器 → 搜索“ColorBrewer” → 安装 ### 颜色方案优化原则 1. **区分度优先**:相邻系列色相差至少$15^\circ$(CIE94色彩差异公式): $$ \Delta E^*_{94} = \sqrt{ \left( \frac{\Delta L^*}{K_L S_L} \right)^2 + \left( \frac{\Delta C^*}{K_C S_C} \right)^2 + \left( \frac{\Delta H^*}{K_H S_H} \right)^2 } > 30 $$ 2. **避免颜色抖动**:当$n>50$时,建议: - 折线图使用实线+不同标记符号(方形/圆形/三角形) - 柱形图添加纹理图案(属性 → 外观 → 填充图案) 3. **辅助编码**:结合其他视觉通道: - 柱形图:用颜色区分 - 折线图:用线型(实线/虚线/点划线)辅助区分 ### 分页策略数学优化 设总系列数$N$,每页系列数$k$(建议$k \leq 25$),则最优分页数: $$ p = \left\lceil \frac{N}{k} \right\rceil $$ 分页依据列的选择应满足: $$ \max_{1 \leq i \leq p} |C_i| \leq k $$ 其中$C_i$为第$i$页的系列集合 --- §§相关问题§§ 1. 如何在Spotfire中创建动态分页? 2. 如何为组合图添加自定义纹理填充? 3. Spotfire中如何实现基于表达式的动态线型? 4. 超过100个系列时如何优化Spotfire图表性能?</think>### 在Spotfire组合图中为超过30个系列配置不重复颜色方案 当组合图系列数量超过30时,Spotfire默认的离散颜色方案会重复使用颜色(通常只有10-30种基础色)。以下是专业解决方案: --- #### **方法1:创建扩展颜色键(推荐)** 1. **生成唯一颜色标识列** ```sql /* 计算列公式 */ [类别] & "_" & CASE WHEN [图表类型] = "柱形图" THEN "BAR" WHEN [图表类型] = "折线图" THEN "LINE" END ``` - 此操作创建形如`产品A_BAR`、`产品A_LINE`的唯一键 2. **配置扩展颜色方案** - 组合图属性 → 颜色 → 选择新建的唯一键列 - 颜色方案设置 → 点击 **"+"** 手动添加新颜色 - 使用HSL色轮公式均匀分布色相: $$ \text{Hue}_i = \left( \frac{360^\circ}{n} \times i \right) \mod 360^\circ $$ 其中 $n$ 为总系列数,$i$ 为系列索引(0到n-1) --- #### **方法2:分页显示策略** ```python # 分页配置(属性 → 分页) Rows per page: 25 # 每页最大系列数 Page by: [时间维度] # 按年份/季度等分组 ``` 1. **操作步骤**: - 启用分页:属性 → 一般 → 勾选"启用分页" - 设置分页依据列(如年份、地区等) - 调整每页系列数(建议 ≤25) 2. **数学优化模型**: 设总系列数 $N$,每页系列数 $k$,则分页数: $$ p = \left\lceil \frac{N}{k} \right\rceil $$ 最优 $k$ 满足: $$ \max_{1 \leq i \leq p} |C_i| \leq 30 $$ 其中 $C_i$ 为第 $i$ 页的系列集合 --- #### **方法3:脚本动态生成颜色** ```python # IronPython脚本(工具 → IronPython脚本) from Spotfire.Dxp.Application.Visuals import * from System.Drawing import Color import math viz = vis.As[CombinationChart]() total_series = 45 # 总系列数 # 生成HSL均匀分布颜色 colors = [] for i in range(total_series): hue = (i * 360.0 / total_series) % 360.0 saturation = 85 # 固定饱和度 lightness = 45 + (i % 3) * 15 # 亮度微调增强区分度 rgb = HslToRgb(hue, saturation/100, lightness/100) colors.append(Color.FromArgb(rgb[0], rgb[1], rgb[2])) # 应用自定义调色板 viz.ColorScheme.Type = ColorSchemeType.Custom viz.ColorScheme.CustomPalette = colors ``` > **HSL-RGB转换函数**需自行实现(参考CIE LAB色彩空间转换标准)[^1] --- #### **方法4:视觉通道增强** 当 $n > 50$ 时,建议结合其他视觉通道: | 图表类型 | 颜色策略 | 辅助区分手段 | |----------|--------------------------|--------------------------| | 柱形图 | 基础色相循环 | 纹理填充(斜线/网格/点阵) | | 折线图 | 明亮度渐变 | 线型(实线/虚线/点划线) | | 标记点 | 饱和度渐变 | 形状(圆形/方形/三角形) | **配置路径**: - 柱形纹理:外观 → 填充图案 - 折线线型:线条和标记 → 线型 - 标记形状:线条和标记 → 标记类型 --- ### **最佳实践原则** 1. **色相分布公式**: $$ \Delta H = \min\left( \frac{360}{n}, 15^\circ \right) \quad (\Delta H \geq 15^\circ \text{ 保证可区分性}) $$ 2. **避免相邻相似色**: - 柱形图使用高饱和度(70-100%) - 折线图使用中低明度(30-50%) 3. **大数据量优化**: - 启用 **"仅显示可见数据"**(属性 → 性能) - 当 $n > 100$ 时建议采用 **"小多图"** 替代方案[^2] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值