1

我正在 RSA Archer 平台中实现此代码。

它在 Chrome 中完美运行,但在 IE9 中无法正常运行。

function hideDeleteButton(){
  var elId = "master_DefaultContent_rts_s2487_f6881srvgrid_ctl00";
  var el = document.getElementById(elId);
  var className = "GridRemoveImage";
  if (el != null) { 
    var lst = el.getElementsByClassName(className);
    for (var i = 0; i < lst.length; ++i) { 
      lst[i].style.display = 'none';
    }
  }
}

$(window).bind("load", function(){
   hideDeleteButton();
});

document.load = hideDeleteButton();
4

6 回答 6

2

由于您使用 jquery 标记了问题,因此我编写了与您提供的 javascript 代码等效的 jquery 代码。

$(window).load(function() {
    $("#master_DefaultContent_rts_s2487_f6881srvgrid_ctl00").find(".GridRemoveImage").hide();
});

您不必遍历每个元素来更改可见性。此代码也将具有浏览器兼容性。

于 2014-06-11T07:12:26.083 回答
1

这个新功能应该可以完成这项工作:

function hidedeletebutton() { 
    $('#master_DefaultContent_rts_s2487_f6881srvgrid_ctl00 .GridRemoveImage').each(function() {
        $(this).hide();
    });
}

它也一样,只是更短并且使用 jQuery

于 2014-06-11T07:26:12.633 回答
1

您还可以使用更可能跨浏览器工作的简单CSS隐藏元素

在这种情况下:

#master_DefaultContent_rts_s2487_f6881srvgrid_ctl00 .GridRemoveImage {
  display: none;
}
于 2015-10-19T10:53:53.893 回答
1

这个问题有几个我想介绍的基本方面:

糟糕的设计

您必须隐藏“删除”按钮的事实告诉我,您的 Archer 应用程序设计不正确。您需要通过角色和记录权限配置来控制对记录的访问,而不是使用自定义对象代码。如果我使用开发人员工具手动激活删除按钮并删除记录怎么办?作为开发人员,您想为此负责吗?我建议您退后两步,重新设计应用程序中的访问控制。你问的问题首先应该是我问的。

RSA Archer 平台

所有与 jQuery 相关的答案均未考虑以下因素:

  • 这是自定义对象的代码 - RSA Archer 平台中使用的特殊类型的对象。
  • Archer 平台生成富含 JavaScript 的网页。所以我建议你不要重载与文档相关的函数,除非确实需要这样做。
  • 加载表单时执行自定义对象代码,在大多数情况下不需要覆盖“document.load”事件处理程序。

这是可用于 IE8-IE11、FireFox、Chrome 和 Opera 的代码示例:

<script type="text/javascript">
    document.getElementById("master_btnDelete").style.display = "none";
</script>

为什么这行得通?因为存储在 Archer 中自定义对象中的 JavaScript 代码将在作为表单本身的一部分加载后执行。

IE 特定行为

如果给定的弓箭手应用程序有一个用于填充交叉引用值列表的弹出对话框窗口,您实际上可能需要覆盖窗口加载事件。在这种情况下,包括“删除”按钮在内的工具栏按钮可能会在显示每个弹出窗口后恢复。在这种情况下,您必须使用类似的代码:

<script type="text/javascript">
    // function that will hide the Delete button
    function doLoad() {
        alert( "The load event is executing" );
        document.getElementById("master_btnDelete").style.display = "none";
    }

    // code that will add load event for IE and none-IE browsers
    if (window.addEventListener){window.addEventListener("load",doLoad,false);}
    else 
    if (window.attachEvent) { window.attachEvent("onload",doLoad);}
    else 
    if (window.onLoad) { window.onload = doLoad;}
</script>

不幸的是,微软与 IE 的设计不是很一致,这就是为什么你必须检查什么事件处理方法有效并且应该使用。如果您对此代码有更多疑问,可以使用以下两个链接作为参考:StackoverFlow Question and MSDN Help Page

现在,为什么您的 jQuery 基础代码不起作用?我不知道,可能是您编写的 Archer 版本使用的 jQuery 库版本对 IE9 的支持不够好。这让我想到了另一点。

使用 Archer 提供的 jQuery

您在提供的原始代码示例中使用了 jQuery。我建议您在为 Archer 编写自定义对象时不要使用任何库。

  1. 您使用的 jQuery 库是作为平台的一部分提供的。jQuery 库可以“自定义构建”以包含您使用的功能。或者在这种情况下,包括 Archer 开发人员使用的 jQuery 函数。在 Archer 的下一个版本中,此列表可能会更改。如果您使用的函数在最新版本中不再是库的一部分会怎样?
  2. 您无法控制使用的 jQuery 版本。因此,您不能保证对某些浏览器的支持,也不能强制 RSA 使用最新版本。这限制了代码的功能。这正是这里发生的事情。您使用了 jQuery,但它不适用于 IE9。它适用于 IE11 吗?使用最新补丁升级 Archer 后会发生什么?
  3. 请记住,您编写的代码必须与 Archer 已经加载的另外 10k+ 行 JavaScript 代码一起工作。因此,请让您的自定义对象尽可能简单,并尽量不要使用任何外部库。一切都是为了支持(除非你在那里呆了 1 个月并且不打算支持你的代码)。

概括

  1. 不要在 RSA Archer 中隐藏删除按钮,而是重新设计安全性。从长远来看,您会后悔隐藏删除按钮的决定。有一天用户实际上会删除记录,您会感到痛苦。
  2. 使用 KISS 原则 - 使用简单的 JavaScript 代码,避免使用库,保持自定义对象简短。尽可能避免使用自定义对象。否则每次更新平台时都必须对其进行测试。

祝你好运,用户 3728843!

于 2015-09-13T04:47:39.860 回答
0

@StanUteski 提出了一些很好的观点,并提出了非常好的最佳实践。

还要记住,如果用户使用 Safari 之类的奇怪浏览器来获取基本功能,您仍然会得到奇怪的结果。

此外,浏览器可能会意外关闭 JavaScript。

现在,您可能会说这没有意义,“...b/c 我的用户知道 Archer 只能使用 '123' 特定版本的 'ABC' 浏览器” - 但是,这就是重点,即使他们是世界上最好的用户,并且完全意识到,您不一定能控制他们使用的浏览器,或者他们是否使用平板电脑或手机,或者页面加载奇怪并且没有完全加载脚本/正确的库——即使页面没有呈现,在这种情况下您可能仍然会暴露按钮,并创建用户单击和删除记录的可能性。

在所有情况下,您都希望尝试坚持 Web 应用程序的 MVC(模型-视图-控制器)或 MVVM(模型-视图-视图-模型)编程范式,其中 CONTROLLER 在服务器端并控制应用程序“功能流程和特征” - 例如 - 带有策略列表的页面具有以下按钮,这些按钮可通向其相应的页面:

  • 添加
  • 编辑
  • 删除

然后使用用户角色和权限(这实际上是不同控制器的功能 - 基本上是访问和权限管理控制器子系统)进一步限制这些按钮及其引导位置。

这导致:

  • 更容易从高层理解应用程序流程
  • 允许首先从业务和流程的角度考虑、设计、遍历应用程序:
  • 在接触开发系统之前可以并且应该做的事情

    • 代表用户群体的用户角色,您可以将其转换为角色
    • 所有角色/角色的用例,这将允许您确定每个角色:
      • 可以采取行动的数据子集
      • 可以采取的实际功能/行动
      • 流程中每个点的下一步和决策,取决于#1 和#2 施加的限制。
    • 用于确定的线框图:

      • 启用已为流程中的每个步骤和决策门确定的功能、操作和方向流所需的 UI 元素。
      • 启用这些 UI 元素的最佳位置:
        1. 信息的快速清晰可见性
        2. 执行操作的最有效/最简单的方式(当只有少数选项可用时,点击次数最少,单选按钮而不是下拉菜单,例如是/否,真/假)
        3. 赏心悦目的景色
        4. 灵活且响应迅速的显示屏
        5. 响应和信息丰富的用户提示和提示,例如:
          • 错误
          • 必填字段
          • 非活动按钮
        6. 甚至可能是用户可定制的主题
      • 查看可访问性:

        1. 数字
        2. 安排
        3. 能见度
        4. 状态

        UI 的主要工作“屏幕”区域,例如:

        • 面板
        • 页面

        以及它们是如何被纳入视野的,使用类似的机制

        • 滑块
        • 标签

      一个好的视图倾斜是有效的和自我记录的b/c 它被设计成直观的用户:

      1. 用户现在应该看到
      2. 用户可以看到下一个
      3. 如何查看相关信息并给予适当数量的优先级和不动产
      4. 何时以及如何用可见性换取可访问性
      5. 下一步,制作标签,等等。

最后,您实际上可以开始实施:然后驱动...

  1. 数据模型设计,然后导致...
  2. 控制器编码:在 Archer 的情况下,它在于:

    • App 开发器以及您如何设置关系、权限和操作
    • 任何自定义的 CALCULATED 字段(它们是服务器端控制器代码/结构) - 将其视为实际编码 ASP 页面的更受限制的版本。

      • 在其他 Web 应用程序中,您可能会在 PHP、JSP、Ruby/Rails 等中执行此操作。
      • 但是,由于 Archer 确实更接近于 5GL / 特定领域 - 应用程序开发工具/环境和运行时(它不是他们声称的真正的框架),因此您仅限于:
        1. 数据展示 (GUI) 元素
        2. 逻辑块(计算字段)
        3. 和我们在应用程序生成器中找到的数据结构(表格、级别等)(当然除了作为较新元素的自定义对象)
        4. 视图设计和编码:尽管在 Archer 的情况下,预计您将使用内置的、封装的 GUI/视图对象(如网格、选项下拉菜单、菜单等),而不是(在极少数情况下,您可能结束 JavaScript 中的自定义编码 - 客户端/视图元素)。

通过始终像这样将事物分开,您将:

  1. 允许良好的劳动/职责分离
  2. 让您更快/并行地完成更多工作
  3. 降低劳动力成本,因为不同的技能组合可用于:
    • 过程
    • 数据建模
    • 控制器
    • 看法
    • 等等
  4. 制作您的应用程序:
    • 更健壮
    • 更容易理解
    • 更容易排除故障/调试
    • 更易于维护/升级
    • 更快地构建附加特性和功能
    • 更便携
    • 更加模块化和可重用


设计和开发最佳实践

  1. 让 CISO 办公室的业务人员/某人负责收集和设计业务流程:
    • 捕捉纸上和/或遗留系统上不存在的东西:
    • 他们希望它变成什么(最终状态)
  2. 然后让系统分析师将业务流程转换为在 Archer 整体中有意义的功能性应用程序流:
    • 框架
    • 模块
    • 可用的数据输入和输出
    • 特征
  3. 让主要的 Archer 开发人员实现该应用程序功能设计(按此顺序):
    1. 数据模型
    2. 然后是控制器,使用(按照以下顺序 - 最严格的 [最接近数据] 到最不严格的 [远离数据])
      1. 角色和权限
      2. 查找过滤器
      3. 表单动作
      4. 计算字段
      5. 自定义代码(作为最后的手段)
    3. 最后是视图(在 Archer 中实际上是使用相同的工具 - 应用程序生成器完成的。
      1. 您可以决定并放置您首先需要的任何字段、查找过滤器、计算逻辑等,以构建您的控制器/功能 - 输入/输出。
      2. 然后在视图上工作之后,在以下方面:
        • 元素应该放在页面/表单上的位置
        • 他们应该如何看待:
          • 格式化
          • 结盟
          • 工具提示
        • 自定义 GUI / UX 铃声和口哨声
于 2015-10-19T11:15:29.850 回答
0
$(document).ready(function(){  
  $('#master_DefaultContent_rts_s2487_f6881srvgrid_ctl00 .GridRemoveImage').hide();
});

或者

$(document).ready(function(){  
  $('#master_DefaultContent_rts_s2487_f6881srvgrid_ctl00 .GridRemoveImage').css("display", "none");
});
于 2015-10-25T01:25:07.267 回答