Ecmascript / Javascript适用于Internet Explorer但不适用于FireFox为什么?

时间:2011-09-20 19:52:33

标签: javascript firefox

我们有一个有趣的示例,说明我们的EcmaScript / JavaScript Obfuscator如何工作。 我们提供链接,显示未经模糊处理和混淆的Ecmascript源 “动态时钟”。当您按下开始按钮时,您将看到时钟图形部分跟随您的鼠标移动,当您停止移动鼠标时,它会形成一个滴答作响的圆形时钟。

看这里...... http://www.semdesigns.com/Products/Obfuscators/ECMAScriptObfuscationExample.html

未混淆和混淆的代码都可以在Internet Explorer中正常工作,但在FireFox中不能正常工作。那么,EcmaScript for FireFox和Internet Explorer之间的区别是什么导致此代码与Internet Explorer一起使用而不与FireFox一起使用?我已经尝试了几个版本的FireFox,包括最新版本,但都失败了。

4 个答案:

答案 0 :(得分:3)

首先要检查的是“错误控制台”或Firebug控制台 - 发现它取决于您的Firefox版本以及是否安装了Firebug。

我在试用你的页面时立即在控制台中找到了这个:

Error: document.getElementById("mzSeconds" + i) is null
Source File: http://www.semdesigns.com/Products/Obfuscators/UnobfuscatedJavaScriptMouseClock.js.txt
Line: 19

<强>更新

找到错误,并且Dexter和jfriend00已经指出了为什么你首先得到错误,我们可以看到IE和“所有其他”浏览器之间的区别在于 not not 他们如何执行EcmaScript,但他们如何在面对HTML错误时构建DOM - 在您的案例中缺少关于属性的结束引号。 (虽然有脚本差异,但这里不相关)

您的document.write()会输出无效的<div id="mzSeconds0 style="position:...">,导致另一个调试工具:验证。

如果CSS规则或Javascript代码在浏览器中表现异常或不一致,最好验证您的HTML(validator.w3.org),因为不同的浏览器会以不同的方式解析无效的HTML。

答案 1 :(得分:2)

您当前的问题是,您生成无效的HTML代码,将其附加到DOM,然后尝试使用document.getElementById再次找到它。

违规部分是UnobfuscatedHTMLPage.html的第100行,其中包含以下行:

document.write('<div id="'+(('mzSeconds'))+i+' style="position:absolute;top:0px;left:0px" width="15" height="15"><font face=Arial size=3 color='+sCol+'><center><b>'+S[i]+'</b></center></font></div>');

你错过了id="'+(('mzSeconds'))+i+'之后的结束,这导致在IE中错误地处理div标签的id(在这种情况下,两个错误是正确的)。

在该部分代码中存在许多类似的错误 - 在代码有效并且在非IE浏览器中工作之前,您需要解决所有这些错误(通过在Firebug或Chrome Developer工具中调试代码)。

答案 2 :(得分:1)

在任何浏览器的调试控制台中看起来非常简单,它会显示错误的位置(我使用的是Chrome)。然后,查看DOM将显示错误发生的原因。使用调试工具查找问题。

我认为根本问题是,当您生成HTML时,您会遗漏一些结束引号。这会产生非法的HTML,不同的浏览器会以不同的方式进行操作。

触发代码中的第一个错误,因为不存在id="mzSeconds0"的对象。这是因为您在此行中缺少结束双引号:

document.write('<div id="'+(('mzSeconds'))+i+' style="position:absolute;top:0px;left:0px" width="15" height="15"><font face=Arial size=3 color='+sCol+'><center><b>'+S[i]+'</b></center></font></div>');

这应该是id="mzSeconds0"末尾的结束双引号:

document.write('<div id="'+(('mzSeconds'))+i+'" style="position:absolute;top:0px;left:0px" width="15" height="15"><font face=Arial size=3 color='+sCol+'><center><b>'+S[i]+'</b></center></font></div>');

我认为大多数这类线路都存在同样的错误,你需要修复它们。

答案 3 :(得分:0)

检查调试器会产生: document.getElementById(“mzSeconds”+ i)为空,还包括行号和堆栈跟踪,这样可以轻松修复错误。

原因是您向浏览器抛出了无效的HTML,需要尝试纠正以某种方式。显然,你最终在IE浏览器中拥有一个不同的DOM。

document.write('<div id="'+(('mzMinutes'))+i+' style="position:absol…

我仍然没有看到使用混淆JavaScript或在你的风格中编写代码。直接编写HTML而不是滥用JavaScript来执行此操作。当您需要从JavaScript创建内容时,请使用DOM函数而不是document.write。这样可以避免这个错误。

当您将代码运行到调试器(Firebug)时,您会发现其他错误弹出。请同时查看JavaScript严格模式,因为通过指出不良做法可能会为您节省大量时间。

相关问题