【问题标题】:Is 'action' a keyword in jQuery?'action' 是 jQuery 中的关键字吗?
【发布时间】:2009-12-23 15:55:05
【问题描述】:

在过去的一天半里,我遇到了 jQuery 无法在我的 HTML 中找到 <form> 元素的问题。我多次通过验证器运行我的 HTML,验证了我的 JS 和 CSS,甚至删除了不必要的 JS 和 CSS 文件,现在简化为:

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

<html>
<head>
    <title>Test</title>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
    <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.8.0r4/build/reset/reset-min.css" />
</head>

<body>
    <form>
        <input type="textbox" name="action" value="view"></input>
        <button>Test</button>
    </form>
</body>
</html>

在将我的 HTML 简化为基本内容后,我检查了 jQuery 是否可以使用 $('form') 简单地抓取 &lt;form&gt; 元素。好吧,jQuery 什么也没返回。它完全崩溃了。它什么也没返回,甚至没有返回一个 jQuery 对象。所以我又一次继续我的疯狂,验证 HTML 等等,但仍然一无所获!

我第二次重写了 HTML,但方式不完全相同,并且成功了!所以我区分了这两个文件并开始调整原始文件以逐渐与我刚刚编写的新文件相同。好吧,事实证明name 属性的值是搞砸一切的罪魁祸首!只需将值更改为 action 以外的任何值,jQuery 就可以最终选择 &lt;form&gt; 元素!真的?! !@#%$!@#!!!

所以我的问题是:action 是 jQuery 中的关键字吗?属性的值是如何搞砸一切的?

如果它是一个关键字并且您不想解释原因,请您指向我的文档,以便我可以在阅读后打自己的脑袋。属性的值会搞砸事情似乎仍然很奇怪,但这可能是因为我对 jQuery 的实现一无所知。 =)

【问题讨论】:

标签: jquery html action keyword


【解决方案1】:

action 是 jQuery 中的关键字吗?属性的值是如何搞砸一切的?

不,不是。你的问题出在其他地方。也许您正试图直接在 HTML 头部中获取表单,而不是等待页面完成加载。

例如你做了

<script>
    alert($('form').length); // May return 0 depending on the browser used.
</script>
...
<form>
    ...
</form>

而不是

<script>
    $(document).ready(function() {
        alert($('form').length); // Always returns 1.
    });
</script>
...
<form>
    ...
</form>

【讨论】:

    【解决方案2】:

    我只是复制/粘贴了您的示例代码并添加了

    <script type="text/javascript">
        jQuery('form').html('It works fine');
    </script>
    

    ... 在表单元素之后。表单的内容被替换为“It works fine”,所以no,jQuery没有这个问题。

    【讨论】:

      【解决方案3】:

      如果我没记错的话,如果您使用 name="action",Internet Explorer (6) 中可能会出现问题。不知何故,动作是一个保留字。不记得后果的想法,但事情没有奏效。因此,如果您使用的是 MSIE,也请尝试使用其他浏览器。

      【讨论】:

        【解决方案4】:

        无法重现您的问题

        查看本站http://jsbin.com/ixixu3

        alert 始终为所有不同的选择器显示 1(在 Opera 10.10、IE6、FF 3.5.6 中测试)

        【讨论】:

          【解决方案5】:

          ACTION 是 FORM 标记的必需属性。

          编辑

          您给定的示例不是有效的 HTML。试试:

          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
          "http://www.w3.org/TR/html4/strict.dtd">
          <html>
          <head>
              <title>Test</title>
              <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
              <script type="text/javascript">
              $(document).ready(function() {
                  $('form').css({"border":"1px solid red"});
              });
              </script>
          </head>
          <body>
              <form action="">
              <fieldset><legend>Test</legend>
                  <input type="text" name="action" value="view"/>
                  <button>Test</button>
                  </fieldset>
              </form>
          </body>
          </html>
          

          【讨论】:

          • 很抱歉。在我将我的 HTML 剥离为裸露的骨骼之后,我知道它并不完全有效。我只是想看看 jQuery 是否可以从如此少的东西中选择表单元素。所以你是对的,它不是有效的 HTML,但是这应该阻止 jQuery 选择表单元素吗?它不应该。我的实际问题在于我的测试方式。我在 FF3.5 中使用 Firebug 控制台,但没有先检查文档是否准备就绪。但是即使将action 属性添加到表单元素中,我的原始测试方法仍然无法正常工作。
          【解决方案6】:

          感谢大家提供的所有信息。我应该提到我正在使用 FF3.5 并使用 Firebug 控制台进行测试。我会加载页面,然后在 Firebug 中执行$('form')。当我将name 属性设置为action 时,它每次都不会返回任何内容。将其更改为其他内容后,在 Firebug 控制台中执行同一行代码即可。

          阅读了大家的帖子后,我编辑了我的 HTML,在 &lt;head&gt; 部分添加了一个 &lt;script&gt; 元素:

          <head>
              <title>Test</title>
              <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
              <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.8.0r4/build/reset/reset-min.css" />
              <script type="text/javascript">
                  $(function(){
                     alert($('form').length); 
                  });
              </script>
          </head>
          

          这完全没问题。所以我想我的错误在于我的测试方法。在 Firebug 控制台中使用 $('form').length 不会产生任何结果。我应该改用这一行:$(function(){$('form');});$(function(){$('form');})` 我认为在尝试选择表单之前我不需要先检查文档是否准备好使用 Firebug 控制台的元素; 我错了。

          故事的寓意:即使在 Firebug 中,您仍然需要在选择元素之前检查文档是否准备就绪。

          但仍然困扰我的是,当 name 属性 not action 时,我的原始测试方法适用于 Firebug 控制台。所以也许真正的问题应该是:对于&lt;input&gt; 元素上的name 属性,Firebug 的价值是什么?

          感谢大家的帮助!您的所有帖子都使我最终意识到,可惜我不能给每个人打勾,但我会给每个人投票!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-02-10
            • 2014-05-23
            • 2014-09-16
            • 2014-04-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多