代码之家  ›  专栏  ›  技术社区  ›  Marco Demaio

x是否是javascript ff/safari中的保留关键字,而不是IE中的保留关键字?

  •  1
  • Marco Demaio  · 技术社区  · 14 年前

    一个Web应用程序的网页显示了一个奇怪的错误。我重新删除了所有HTML/CSS/JS代码,并到达下面的基本和简单代码。

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html><head>
    <title>test</title>
    
       <script type="text/javascript">
          var TestObj =
          {
             foo: function() {}
          }
    
          alert(x); //ok displays "undefined"
          var x = TestObj.foo;
          var z = TestObj.foo;
        </script>
    
    </head><body>
    
       <p onclick='alert(x);'>Click shows function foo!</p>
       <img onclick='alert(x);' alt='CRAZY click displays a number in FF/Safari not function foo' src='' style='display: block; width: 100px; height: 100px; border: 1px solid #00ff00;'>
       <p onclick='alert(x);'>Click shows function foo!</p>
    
    </body></html>
    

    这太疯狂了:当点击p元素时,字符串“function()”会按预期显示。但是 当单击img元素时,它显示一个数字,就好像x函数以某种方式从内存中删除或卸载了一样。 (它甚至不将x显示为“未定义”,而是显示为数字)。

    为了让你快速测试它,我把工作测试也放在上面 here .

    这两者都可以复制 火狐3.6和Safari 4.0.4 .

    一切 仅适用于IE7+ .

    我真的很笨,我想知道 X 可能是JS firefox/safari中的保留关键字。感谢任何能帮忙的人!

    FY:

    1. 如果用z()重新计算x()。 一切工作都很顺利 浏览器(更疯狂的是 我)
    2. 在SRC中添加真实图像 属性不能解决问题
    3. 在img中删除样式不能修复 问题是(我给了形象风格 只是为了帮助你点击图片 这样您就可以看到imnage边界)
    4 回复  |  直到 14 年前
        1
  •  6
  •   David    14 年前

    您的问题是变量范围,而不是保留“x”。图像对象具有名为“X”的属性。你可以通过Chrome的开发工具看到这一点。当您在图像对象上调用“alert(x);”时,作用域中的“x”是图像上的“x”属性。

        2
  •  2
  •   Community paulsm4    7 年前

    只需完成以下答案 David Daniel ,这种行为完全没有文档记录,但在几乎所有现代浏览器中都可以像下面这样工作:

    内联事件处理程序的内容变为 FunctionBody 当浏览器触发该事件时调用的函数。

    这个函数的作用域链是 增广的 对于元素,元素的 FORM (如果它退出并且是 形式 元素) document 本身。

    代码如下:

    function onclick(event) {
      with(document) {
        with(this.form) {
          with(this) {
            // inline event handler content...
          }
        }
      }
    }
    

    这种行为会导致 名称冲突 由于作用域链的扩大,您不能100%确定所引用的内容,它可能是元素本身的属性、元素形式的属性、元素 文件 对象或任何全局变量。

    推荐文章:

        3
  •  1
  •   Daniel Pryden    14 年前

    我似乎找不到任何支持这一点的文档,但我的猜测是 <img> 标签被专门处理,对象实际上是一个javascript Image 对象,而不是普通的DOM元素。这个 图像 对象具有 x 属性,因此 X 方法 Image.x . 如果你想要全球 X 属性,仅使用 window.x 相反。

        4
  •  0
  •   kennebec    14 年前

    在dom规范之前,一些浏览器仍然支持images、a元素和area元素,它们在页面上的坐标都具有只读的x和y属性。