0

情况

我有一个 JSPF 文件(一个 java jsp“片段”——不确定它的处理方式是否与典型的 JSP 有任何不同——我认为这只是命名法,但我发现的文档甚至堆栈答案都不清楚)。

我可以在内联脚本标签中警告这个 JSPF 文件顶部和底部的字符串,这样标签就不会被其他 HTML 恶作剧破坏或破坏。

但是,如果我在顶部脚本标记中声明一个 var,它将在底部不可用并警告“未定义”。

但是,我可以分配给窗口对象的属性,并按预期在底部脚本标记中显示该属性警报。似乎没有任何东西在修改窗口对象。它显示了正确的类型和窗口方法仍然按预期在此 JSP 文件的顶部和底部触发。

这个页面上显然很糟糕的事情:

  • 我们正在使用大约 2007 年的prototype.js 库。我认为这是在原型做了非常丑陋的事情之后,我没有看到它与对象原型或类似的东西混在一起。

  • 负载均衡器以 X-UA 兼容性 = IE7 模式提供所有内容,不允许 HTML 覆盖。但是,这绝对是所有内容的响应标头。图像、js 文件、CSS 文件。我曾经认为文档类型只会影响 CSS/HTML 问题,但似乎当您将其放在链接的 JS 文件上或 HTML 中有 JS 时,我们会回到 IE7 模式或其他方式。那个或其他东西正在破坏应该在 IE8 中工作但不在这些页面上的 querySelectorAll 方法。

  • 响应标头都应用 IE7 模式,但 HTML 文档本身正在切换到怪癖模式,这让我感到困惑,因为我认为您所需要的只是尝试设置 doctype 以建立通用标准模式。在我们的例子中,文档类型上方有空格,它只是前半部分:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 过渡//EN" " http://www.w3.org/TR/html4/loose.dtd ">

所以这就是我们实际拥有的:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 过渡//EN" >

这可能是怪癖模式的原因,但我认为 IE8(不确定 IE7 模式下的 IE8)只是寻找任何旧的 doctype 来建立标准模式,并且它允许在 doctype 前面有空格。更不用说我认为第二部分是针对验证者的。无论如何,我仍然不明白为什么全球空间被核爆了。它也可能是带有不正确 HTML 位置的表格(错误的标签,而不是嵌套失败)。

  • 可能不相关,但 java 模板是一场彻底的灾难。嵌套包括与 ajax 请求混合,提供嵌套 9 层的内容。您必须查看几十个 XML、JSP 和 Java 文件才能弄清楚这个页面是如何构建的。6个XML配置文件只是为了整理一个模态等等......

我已经排除的事情:

  • 没有以不同方式设置元标记的条件 IE 注释。您可以在非 IE 浏览器中看到相同的响应标头。

  • 混合中没有帧或 iframe 导致此问题。如果有的话,我不希望窗口对象属性携带相同的值。

  • 窗口对象似乎没有以任何方式被破坏或覆盖。

  • 不,在这个特定的代码库中没有什么比咖啡脚本更近的了。它主要是原型和通过内联脚本直接插入到 JS 中的 taglib 数据的邪恶联合,以及主要由通才/服务器端开发人员编写的一堆非常糟糕的 JavaScript。

  • 我不认为这是一个内存问题,尽管我还没有尝试过分析它。我已经在页面上花费了足够的时间来知道它相当稳定。鉴于在页面甚至可以加载之前必须在服务器上解决的大量废话,性能很糟糕,但是当页面打开时,我并没有耗尽内存或崩溃/冻结或任何事情。这是一个使用率很高的页面,我们正在为生产中的汽车经销商提供服务,所以我认为不需要一台 ace 机器来处理这个页面,否则我们会听到更多关于它的信息。

我还没有弄清楚在我们的开发版本的代码库中我需要去杀死正在设置文档类型的负载均衡器设置等效项,但它可能是链接文件中的 quirksmode 内联 HTML JavaScript 和 IE7 JavaScript 导致某种破坏全球空间的冲突?但是你如何在不破坏窗口对象的情况下对全局空间进行核攻击呢?或者我不知道的prototype.js的某些方面?

4

1 回答 1

0

好的,所以你在一个脚本标签中声明了一些东西,它应该是全局的,但是当第二个脚本标签运行时它不存在。对于给定的页面,您不能将(javascript)全局空间“分解”成多个部分。如果你有一个 iframed 页面......那就不同了,因为那是两个页面。与 javascript 或一些执行重定向的元标记相同;您正在处理两个单独的页面。我怀疑,这可能就是这里发生的事情——你有一个 javascript 重定向;一些脚本将其设置document.location到另一个页面,或者相同的页面但具有不同的参数,导致不同的脚本标签显示在文档或其他内容中。

对于任何单个页面,您只有本地和全局声明。如果不放松单页的含义(正如我之前所说的),我真的想不出任何其他情况下您会拥有更多。

(编辑:我再说一遍,你不能“打破”全局空间。这样命名这个问题可能就是为什么你的问题被否决了,因为它相当荒谬;“打破全局空间”只有在我可以隐喻地解释这个短语时才有意义并且可以提出一些用例,当您实际看到两个不同的全局空间时,全局空间可能看起来“一分为二”。)

由于您拥有包括 JSP 和一大堆脚本标签在内的 JSP,在我看来,真正确定发生了什么的唯一方法是使用 Fiddler2 之类的 HTTP 跟踪器,捕获有关何时加载的所有流量您认为给定页面已加载,debug在最顶层的脚本块中添加一些语句(可能只是),以允许调试到任何页面以查看何时加载(为事件处理程序添加断点),然后只是观看,跳过,和评估。我知道这是一个痛苦的过程,但是当您将服务器端代码与客户端代码混杂在一起时,这就是您必须做的事情。这不是开发网站的好方法。

于 2013-02-11T04:25:06.057 回答