zoukankan      html  css  js  c++  java
  • 认真研究下HTML之id、name、form、submit

    #起因

    同事希望在提交之后关闭父窗口,但是,始终没有提交请求发出。他的代码大概如下:

    // <form id='f' action=...
    // <button onclick='fun()'>...
    
    fun(){
        $('#f').submit();
        window.parent.close(); 
    }

    运行结果是,“直接关闭,没有提交”。

    在建议他用Ajax提交的同时,又好奇为什么会这样,于是测试了下,发现规律很简单:

    form的submit动作是在所有动作之后执行的,类似于在Java中的finally中执行submit。

    至于原因,猜测是因为同步submit之后,会直接跳转到返回的页面,不会再执行后续的动作 -- 为了保证后续动作的执行,js应该是有这种机制来保证submit在最后执行!

    #验证

    很简单,代码如下:

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <title>INDEX</title>
    </head>
    
    <body>
       
        <form id='f1' name='f' action="">
            <input id="k" name="username" type="text">
            <button onclick="a()">GOGOGO</button>
        </form>
    
        <script>
            //我擦,只要有form.submit,那必须在所有动作之后完成! 类似finally
            function a(){
                $('#f1').submit();
    
                $('#k').val('kkkkkkkkkk') //修改一下内容,看看是提交暂存,还是最后才提交
                alert('xxx')
            }
        </script>
    </body>
    
    </html>

    form没有设置action,直接提交到本地址;没有设置method,默认GET;

    这样,提交就能在地址栏看到提交的内容!

    打开页面,随便输入点内容,然后点击提交,会①再弹出框,②再修改输入框内容,③最后才是提交!

    此时,在地址栏就能看到提交的内容!

    file:///C:/Users/Larry/Desktop/demo/index.html?name=kkkkkkkkkk

    #延伸

    验证了之后,就开始怀疑是否是jQuery独有的现象,于是使用document.forms[0].submit() 再验证了一番,结果相同,所以应该是js的机制。

    好了,submit问题至此结束。但是,又对document.forms 发生了兴趣,想要知道是否能通过id来获取指定的form。

    查找了一番,说是可以使用form的name来获取,即 document.forms['name'],需要给form指定name属性。测试可行。

    测试的时候顺手又测试了下能否使用id,结果也是可行。

    于是更好奇id和name的区别(惭愧,以前从没考虑过这个问题)。。。

    #id VS name

    简单的说,id就是唯一的身份证,不能重复(其实可以重复,只不过只会使用第一个)。

    而name,则是form及其内部专用的,如果相同name的表单只有一个,那作用和id是一样的。只有在多个表单带有相同name的时候,name才和id不同。

    最明显的例子:

    <input type='checkbox' name='hobby' value='eat'><input type='checkbox' name='hobby' value='play'><input type='checkbox' name='hobby' value='sleep'>

    上面这个时候,name才和id不同。

    document.getElementById

    document.getElementByName

    #补充

    alert(document.forms['f'].hobby)     //name有多个的时候,返回这个name对应的dom对象列表!
    
    alert(document.forms['f'].username)   //name只有一个的时候,返回这个name对应的dom对象!
  • 相关阅读:
    ios 适应屏幕
    用于重新编译的工具和命令
    SSRS 的简单使用(二)
    SSRS 的简单使用(一)
    优化SqlServer--数据压缩
    优化SQLServer——表和分区索引
    关于tempdb的一些注意事项
    关于事务的隔离级别和处理机制的理解
    SQL Server中的锁的简单学习
    sqlserver还原数据库失败,sql2008备份集中的数据库备份与现有的xxx数据库不同
  • 原文地址:https://www.cnblogs.com/larryzeal/p/8349785.html
Copyright © 2011-2022 走看看