【问题标题】:Remove, replace or disable dynamically-generated ASP.Net js code删除、替换或禁用动态生成的 ASP.Net js 代码
【发布时间】:2010-07-16 10:57:58
【问题描述】:

我正在使用一些 .Net 4.0 网络表单控件,例如 Menu 控件,虽然我认为现在可以声明控件的呈现方式(即作为表格或 div)很棒,但我不能关闭管理这些控件的悬停事件的自动包含的 javascript,例如:

new Sys.WebForms.Menu({ element: 'NavigationMenu', disappearAfter: 500, orientation: 'horizontal', tabIndex: 0, disabled: false }

这会出现在拥有此类控件的每个页面的底部。

鉴于没有办法真正关闭它,禁用此脚本、覆盖它或以其他方式使其无能为力以便我可以在其位置定义自己的 jQuery 方法的最佳方法是什么?

【问题讨论】:

    标签: javascript asp.net webforms code-injection


    【解决方案1】:

    好吧,您可以尝试在包含 Webforms 脚本之后包含一些 javascript,这些脚本执行以下操作:

    Sys.WebForms.Menu = function() {};
    

    基本上,它会覆盖 webforms Menu javascript 以不执行任何操作。不过要小心,特别是如果您正在处理一个已经使用这些菜单的现有项目,因为它们是 javascript 将不再起作用。

    就我个人而言,我建议使用像Repeater 或ListView 这样更“精简”的控件来创建您自己的菜单标记、css 和javascript。这样可以避免大多数此类问题,并且您可以更好地控制输出。

    【讨论】:

    • 我考虑过这一点,但是因为我绑定到站点地图数据源,我想避免麻烦地通过数据进行递归以生成应该是“超出--盒子”。也就是说,如果我没有得到我需要的结果,我可能会重新考虑。
    【解决方案2】:

    我们的应用中的旧代码刚刚遇到(或刚刚注意到)类似的问题。

    与 Phil.Wheeler 一样,也使用站点地图数据源。不确定将渲染模式更改为 3.5 对我们来说是不是一件好事,并且重写 Sys.WebForms.Menu 的脚本破解不起作用。

    问题:

    此代码会神奇地自动插入到每个 aspx 页面上:

    <script type='text/javascript'>new Sys.WebForms.Menu({ element: 'ctl00_MainNavMenu', disappearAfter: 500, orientation: 'horizontal', tabIndex: 0, disabled: false });</script>
    

    我们的页面都没有 id 为 'ct100_MainNavMenu' 的元素,因此,我们在 MenuStandards.js 解析 tagName === 'DIV' 时看到了一个 javascript 错误。 this.element 为空。

    Sys.WebForms.Menu = function(options) {
        this.items = [];
        this.depth = options.depth || 1;
        this.parentMenuItem = options.parentMenuItem;
        this.element = Sys.WebForms.Menu._domHelper.getElement(options.element);
        if (this.element.tagName === 'DIV') {
            var containerElement = this.element;
            this.element = Sys.WebForms.Menu._domHelper.firstChild(containerElement);
            this.element.tabIndex = options.tabIndex || 0;
            options.element = containerElement;
            options.menu = this;
            this.container = new Sys.WebForms._MenuContainer(options);
            Sys.WebForms.Menu._domHelper.setFloat(this.element, this.container.rightToLeft ? "right" : "left");
        }
        else {
            this.container = options.container;
            this.keyMap = options.keyMap;
        }
    

    将以下内容添加到我们的 ASPX 主文件中,因为标记之前的最后一个 html 似乎可以工作(它解决了问题):

    <div id="ctl00_MainNavMenu" style="display:none">
        <div id="neededToPreventSecondErrorAt_tabIndex"></div>
    </div>
    

    呈现的 HTML 如下所示:

    <div id="ctl00_MainNavMenu" style="display: none; float: left;">
        <div tabindex="0" role="menubar" class="static" style="position: relative; width: auto; float: left;"></div>
    </div>
    

    在我们的任何 ASPX 页面上都没有看到任何不良影响,在 IE、FF 和 Chrome 上进行测试。显然,如果在页面上创建了具有相同 ID 的元素,就会出现问题。除非我们重做应用程序菜单,否则不确定这种可能性有多大。我不认为这比覆盖 webforms Menu javascript 更糟糕/更有风险。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-04
      • 2019-08-16
      • 2010-12-17
      • 2015-04-04
      • 2010-11-13
      • 2011-04-03
      • 1970-01-01
      相关资源
      最近更新 更多