如何在客户端Web上用JavaScript打破全局空间

How Do You Break the Global Space in JavaScript on the Client-Side Web?

本文关键字:全局 空间 JavaScript 上用 客户端 Web      更新时间:2023-09-26

形势

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

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

但是,如果我在顶部的script标记中声明了一个var,那么它在底部的标记中将不可用,并警告"未定义"。

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

这个页面上的明显可怕的事情:

  • 我们使用的是大约2007年的prototype.js库。我认为这是在原型做了非常丑陋的事情之后,我不认为它会干扰对象原型或类似的东西。

  • 所有的东西都是在X-UA compatibility=IE7模式下从负载均衡器提供的,它不允许HTML覆盖。然而,这绝对是在所有内容的响应标头上。图片,js文件,CSS文件。我曾经认为文档类型只会影响CSS/HTML问题,但当你把它放在链接的JS文件上或HTML中有JS时,我们会回到IE7模式或其他模式。这或其他什么东西正在破坏querySelectorAll方法,该方法本应在IE8中工作,但在这些页面上不起作用。

  • 响应标头都应用IE7模式,但HTML文档本身正在切换到怪癖模式,这让我很困惑,因为我认为您只需要尝试设置doctype来建立通用标准模式。在我们的例子中,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模板化是一场彻底的灾难。Nested包括混合ajax请求,服务于嵌套9层深的内容。您必须查看数十个XML、JSP和Java文件,才能弄清楚这个页面是如何构建的。6个XML配置文件只是为了整理一个模态,等等

我已经排除的事情:

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

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

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

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

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

我还没有弄清楚在我们的代码库开发版本中,我需要去哪里才能杀死设置doctype的负载均衡器设置等价物,但链接文件中的内联HTML JavaScript和IE7 JavaScript可能会引起某种冲突,破坏全局空间吗?但是,你如何在不破坏窗户物体的情况下用核武器摧毁全球空间?或者我不知道prototype.js的某些方面?

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

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

(编辑:我再说一遍,你不能"打破"全球空间。把这个问题这样命名可能就是你的问题被否决的原因,因为它相当荒谬;"打破全球空间"之所以有意义,是因为我可以隐喻性地解释这个短语,并且很少能想出全球空间可能看起来"一分为二"的用例当你看到两个不同的全球空间时。)

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