移动端网页表单元素为何无法嵌套在 div 中
表单关联内容属于流内容类别,理论上可以出现在流内容允许的任何位置,但浏览器对透明内容模型有特殊处理规则。
检查表单元素是否被父级标签限制
表单关联内容属于流内容类别,理论上可以出现在流内容允许的任何位置。但某些父级标签的内容模型并非流内容,或者有严格的子元素限制。例如,列表元素 ul 和 ol 只允许 li 和脚本支持元素作为子元素。如果将 input 或 button 直接放在 ul 中,浏览器会认为其不符合内容模型。检查父级标签是否为 ul、ol、dl、select、optgroup 等有严格子元素要求的标签。
透明内容模型是一种特殊的规则,它要求查看父元素的允许内容类别。如果父元素是透明模型,则继续向上查找直到找到非透明模型。例如,ruby 元素允许短语内容,而 ins 元素是透明的,因此 ins 可以放在 ruby 中。但 rt 元素不是短语内容,因此 rt 不能放在 ins 中。检查父级标签是否为 ruby、ins 等具有透明内容模型的标签,并确认其父级是否允许嵌套。
验证父级标签的内容模型限制
HTML 规范定义了多种内容类别,如流内容、短语内容、嵌入内容等。表单关联内容属于流内容类别,但并非所有流内容都可以作为父级标签。例如,script 元素属于元数据内容和流内容,但其子元素只能是脚本支持元素。如果将 input 放在 script 中,浏览器会报错。检查父级标签是否属于元数据内容类别,或者是否属于脚本支持元素类别。
某些元素的内容模型是透明的,这意味着其允许的内容取决于父元素。例如,ruby 元素允许短语内容,而 ins 元素是透明的,因此 ins 可以放在 ruby 中。但 rt 元素不是短语内容,因此 rt 不能放在 ins 中。检查父级标签是否为 ruby、ins 等具有透明内容模型的标签,并确认其父级是否允许嵌套。
排查浏览器对透明内容模型的解析
透明内容模型是一种特殊的规则,它要求查看父元素的允许内容类别。如果父元素是透明模型,则继续向上查找直到找到非透明模型。例如,ruby 元素允许短语内容,而 ins 元素是透明的,因此 ins 可以放在 ruby 中。但 rt 元素不是短语内容,因此 rt 不能放在 ins 中。检查父级标签是否为 ruby、ins 等具有透明内容模型的标签,并确认其父级是否允许嵌套。
透明内容模型只定义了元素可以包含什么,而不是元素可以放在哪里。例如,ul 元素只允许 li 和脚本支持元素,即使 li 中包含透明元素,ul 也不允许直接包含透明元素。检查父级标签是否为 ul、ol、dl 等有严格子元素要求的标签,并确认其子元素是否符合要求。
使用浏览器开发者工具验证结构
使用浏览器开发者工具检查 HTML 结构是否符合规范。在控制台中输入 document.querySelector('form') 获取表单元素,然后使用 form.elements 获取表单关联元素集合。检查这些元素是否被正确识别为表单关联元素。如果元素不在集合中,可能是因为其父级标签不符合内容模型。
使用浏览器开发者工具检查 HTML 结构是否符合规范。在控制台中输入 document.querySelector('form') 获取表单元素,然后使用 form.elements 获取表单关联元素集合。检查这些元素是否被正确识别为表单关联元素。如果元素不在集合中,可能是因为其父级标签不符合内容模型。
资料与延伸阅读
你可以通过以下原始资料核对文中概念,并继续深入阅读。