【问题标题】:JavaScript code working on old server, but not on newJavaScript 代码在旧服务器上工作,但不在新服务器上
【发布时间】:2014-02-20 21:40:54
【问题描述】:

这让我发疯了。我正在尝试将一些旧版应用程序迁移到新服务器,我遇到了很多问题,document.all 在整个代码中都出现了。

在你说之前,我知道。不要使用document.all。它就在那里,我对此无能为力...这个特殊的问题是程序集中的 JavaScript,我没有源代码,也没有重新开发的权限。

我的主要困惑是,当我在与迁移版本相同的浏览器中进行测试时,当前版本的应用程序正在运行。这是一个直接的复制和粘贴作业,在迁移过程中没有更改任何代码,但是当我在新服务器上运行应用程序时 document.all(element) 总是返回 null。

IIS 或更新的 .NET 框架是否以不同的方式处理客户端脚本?

我来自在 Windows Server 2005 上使用 IIS 6 托管的 .NET 2.0,然后是在使用 IIS 8 的 Windows Server 2012 上托管的 .NET 4.0。

我正在寻找任何想法,为什么在同一浏览器中测试时这些行为会有所不同

更新: document.all 所针对的用户控件正在被编码,这弄乱了控件的 ID,即应该是 'elementId' 的内容被输出为 'elementId'

程序集中的代码使用 Attributes.Add,其中包含单引号。我找到了一些建议新课程的来源,例如:

public class HtmlAttributeEncodingNot : System.Web.Util.HttpEncoder
{
    protected override void HtmlAttributeEncode(string value, System.IO.TextWriter output)
    {
        output.Write(value);
    }
}

正在添加这将允许通过在 web.config 中使用 <httpRuntime encoderType="HtmlAttributeEncodingNot"/> 来关闭编码,但我无法向该项目添加新类

【问题讨论】:

  • 检查您如何在页面顶部声明DOCTYPE
  • 设置为<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
  • 这可能会有所帮助:stackoverflow.com/questions/6488579/…
  • @Digitalfront 我的页面已经包含 <xhtmlConformance mode="Legacy"/> 标记并且没有验证控件存在
  • 底线是浏览器正在使用的 HTML/JS - 使用 diff 工具比较新旧服务器生成的浏览器视图源。 HTML 可能略有不同,或者浏览器运行在不同的模式下。

标签: javascript asp.net iis


【解决方案1】:

我将保留已接受的答案,但添加此答案以防其他人将来对此有问题。

我的情况发生了变化,我能够为项目添加一个类。我的问题中的班级:

public class HtmlAttributeEncodingNot : System.Web.Util.HttpEncoder
{
    protected override void HtmlAttributeEncode(string value, System.IO.TextWriter output)
    {
        output.Write(value);
    }
}

在 web.config 中使用类进行编码: <httpRuntime encoderType="HtmlAttributeEncodingNot"/>

足以处理Attributes.Add 中的单引号被编码为$#39;

此外,使用旧 JavaScript 需要注意的一点是 .net 呈现控件的 ClientID 的方式。结合使用上述代码以及 <xhtmlConformance mode="Legacy"/>clientIDMode="AutoID",我能够呈现与 2.0 相同的 html 并暂时解决了我的问题。

【讨论】:

    【解决方案2】:

    听起来您的项目正在结束它的生命,而您只是想为它注入新的活力。我认为 document.all 是在 IE11 中完成的,不是吗 - 所以时间在流逝。

    我的建议是编写一些 Javascript 来迭代 DOM 并查找任何编码的 ID - 然后将它们更改回 .NET 2 形式。在页面底部运行该 JS(而不是 onload),希望在您“更正”id 之前没有任何东西会尝试访问 document.all。

    【讨论】:

    • 我同意。虽然我已经提出了一些关于 hacky 修复的想法,但这并不是我喜欢做的事情。尽管 document.all 并不是根本问题,但随着我们的用户采用 IE 10 和 11,应用程序再次中断只是时间问题。我将尝试使用脚本来解码实体并向人们提供一些选项谁能真正对此做出决定,谢谢。
    • 很高兴为您提供帮助 - 如果您能接受我的回答,我将能够再养活我的家人一个月 - 谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2021-04-28
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    相关资源
    最近更新 更多