这是JQuery选择器的BUG吗?

liefdiy 2014-01-26 11:34:24
是这样的,我要读取的页面有两个FORM,我就想找出我要的那个FORM,然后用find方法找到他下面我需要的input元素,但是我发现如果form是在table下,find就找不到input。测试代码如下:



<body>
<form id="testForm" name="appForm" class="map2">
<input type="hidden" name="appForm_RootElem" value="p_Customer"/>
<input type="hidden" name="appForm_KeyName" value="CstGUID"/>
<input type="hidden" name="appForm_AppName" value="Default"/>
</form>
<table width="100%" height="100%" cellspacing="0" cellpadding="0">
<form id="testForm2" name="appForm" class="map2">
<input type="hidden" name="appForm_RootElem" value="p_Customer"/>
<input type="hidden" name="appForm_KeyName" value="CstGUID"/>
<input type="hidden" name="appForm_AppName" value="Default"/>
</form>
</table>
</body>

<script>
var getElement = function(elements) {
if (elements.length > 0) {
return elements[0];
}
return null;
};

var whatsForm = "form[class='map2'] ";
var form = $(whatsForm).eq(0);

var entityName = form.find("input[name$='_RootElem']");
entityName = getElement(entityName);
entityName = entityName != null ? entityName.value : "未配置";
console.log && console.log(entityName); //输出“p_Customer”

form = $(whatsForm).eq(1);
entityName = form.find("input[name$='_RootElem']");
entityName = getElement(entityName);
entityName = entityName != null ? entityName.value : "未配置";
console.log && console.log(entityName); //输出“未配置”
</script>



各位帮忙分析下是什么情况?
...全文
186 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
liefdiy 2014-01-26
  • 打赏
  • 举报
回复
有两个form没什么问题,而且就算有问题我也改不了,前端HTML代码是第三方的,我只能写JS插件。
引用 1 楼 li649905271 的回复:
一个页面有两个form本身就有问题吧?
zhjdg 2014-01-26
  • 打赏
  • 举报
回复
haha ,是不规范啊。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<form id="testForm" name="appForm" class="map2">
		<input type="hidden" name="appForm_RootElem" value="p_Customer" /> <input type="hidden" name="appForm_KeyName" value="CstGUID" /> <input type="hidden" name="appForm_AppName" value="Default" />
	</form>
	<table width="100%" height="100%" cellspacing="0" cellpadding="0">
	<tr>
	<td>
		<form id="testForm2" name="appForm" class="map2">
			<input type="hidden" name="appForm_RootElem" value="p_Customer" /> <input type="hidden" name="appForm_KeyName" value="CstGUID" /> <input type="hidden" name="appForm_AppName" value="Default" />
		</form>
		</td>
	</tr>	
	</table>

<script>
var $a = document.getElementById('testForm2');
var $b = $a.querySelectorAll("[id='testForm2'] input");

</script>

</body>
</html>
liefdiy 2014-01-26
  • 打赏
  • 举报
回复
难怪了,确实,按照规范写法就可以了。
引用 3 楼 Return_false 的回复:
这并不是所谓的bug,而是由于你的标签嵌套不规范所致,也就是所谓的前端规范 比如 拥有子父级关系的标签 如 ul li 理论上 ul 下可以嵌套除了li以外的任何标签,可是直接会影响到 js中 读取节点,由于结果混乱而导致节点混乱,根据节点的概念,认为你ul下只可能是li,否则 则会产生读取节点错误或者读取不到 修改如下
<table width="100%" height="100%" cellspacing="0" cellpadding="0">
  <tr>
    <td><form id="testForm2" name="appForm" class="map2">
        <input type="hidden" name="appForm_RootElem" value="p_Customer"/>
        <input type="hidden" name="appForm_KeyName" value="CstGUID"/>
        <input type="hidden" name="appForm_AppName" value="Default"/>
      </form></td>
  </tr>
</table>
zhjdg 2014-01-26
  • 打赏
  • 举报
回复
的确是啊,我帮你顶n顶。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<form id="testForm" name="appForm" class="map2">
		<input type="hidden" name="appForm_RootElem" value="p_Customer" /> <input type="hidden" name="appForm_KeyName" value="CstGUID" /> <input type="hidden" name="appForm_AppName" value="Default" />
	</form>
	<table width="100%" height="100%" cellspacing="0" cellpadding="0">
	<tr>
	<td>
		<form id="testForm2" name="appForm" class="map2">
			<input type="hidden" name="appForm_RootElem" value="p_Customer" /> <input type="hidden" name="appForm_KeyName" value="CstGUID" /> <input type="hidden" name="appForm_AppName" value="Default" />
		</form>
		</td>
	</tr>	
	</table>

<script>
var $a = document.getElementById('testForm2');
var $b = $a.querySelectorAll("[id='testForm'] input");

</script>

</body>
</html>
  • 打赏
  • 举报
回复
这并不是所谓的bug,而是由于你的标签嵌套不规范所致,也就是所谓的前端规范 比如 拥有子父级关系的标签 如 ul li 理论上 ul 下可以嵌套除了li以外的任何标签,可是直接会影响到 js中 读取节点,由于结果混乱而导致节点混乱,根据节点的概念,认为你ul下只可能是li,否则 则会产生读取节点错误或者读取不到 修改如下
<table width="100%" height="100%" cellspacing="0" cellpadding="0">
  <tr>
    <td><form id="testForm2" name="appForm" class="map2">
        <input type="hidden" name="appForm_RootElem" value="p_Customer"/>
        <input type="hidden" name="appForm_KeyName" value="CstGUID"/>
        <input type="hidden" name="appForm_AppName" value="Default"/>
      </form></td>
  </tr>
</table>
打字员 2014-01-26
  • 打赏
  • 举报
回复
暈,你本身代碼不規範,流覽器會在解析html的時候自動進行一些操作(補全結束標籤啊撒的),你可以在firefox里用firebug查看一下頁面的html代碼你就知道了 以下是你的代碼在firefox里真正的結構

<body>
<form class="map2" name="appForm" id="testForm">
	<input type="hidden" value="p_Customer" name="appForm_RootElem">
	<input type="hidden" value="CstGUID" name="appForm_KeyName">
	<input type="hidden" value="Default" name="appForm_AppName">
</form>
<table width="100%" height="100%" cellspacing="0" cellpadding="0">
	<form class="map2" name="appForm" id="testForm2"></form>
		<input type="hidden" value="p_Customer" name="appForm_RootElem">
		<input type="hidden" value="CstGUID" name="appForm_KeyName">
		<input type="hidden" value="Default" name="appForm_AppName">
	
</table>
</body>
叶黑 2014-01-26
  • 打赏
  • 举报
回复
一个页面有两个form本身就有问题吧?
最新版本的jQuery EasyUI 1.3.6版全中文API汉化文档火热出炉,由于很多人和我要chm格式的,所以本次API我提供了2种版本的API,一个还是以前的EXE格式,另外一个就是人气颇高的chm格式。本次还将EasyUI 1.3.6版直接提供到API包里面,方便没有去官网下载的人直接使用。请大家持续关注我发布的资源,不出意外,我是会一直持续更新本API文档的。本次更新内容大约有30个,Bug修复的只有2个,剩下的全是新增内容,EasyUI的控件已经越来越好用了,顶一个。但是希望能把性能也提升提升,总是感觉在某些情况下EasyUI的性能不是太好。具体更新内容请看下面的说明: jQuery EasyUI 1.3.6版本更新内容: Bug(修复) treegrid:修复“getChecked”方法不能正确的返回被选择的行的问题; tree:修复在“onlyLeafCheck”属性为true时,复选框无法在异步树种正确显示的问题。 Improvement(改进) treegrid:所有的选择和选中的方法都扩展自datagrid组件; linkbutton:添加图标对齐功能的完整支持,可用值有:“top”、“bottom”、“left”、“right”; linkbutton:添加“size”属性,可用值有:“small”、“large”; linkbutton:添加“onClick”事件; menubutton:添加“menuAlign”属性,该属性允许用户设置顶级菜单对齐; combo:添加“panelAlign”属性,可用值有:“left”、“right”; calendar:添加“formatter”、“styler”和“validator”属性,这些属性允许用于自定义日历日期; calendar:添加“onChange”事件; panel:添加“method”、“queryParams”和“loader”选项; panel:添加“onLoadError”事件; datagrid:添加“onBeginEdit”事件,该事件在一个行进入编辑模式时触发; datagrid:添加“onEndEdit”事件,该事件在完成编辑但是编辑器尚未销毁之前触发; datagrid:添加“sort”方法和“onBeforeSortColumn”事件; datagrid:将“combogrid”编辑器集成到datagrid中; datagrid:添加“ctrlSelect”属性,在启用多行选择的时候允许使用Ctrl键+鼠标点击的方式进行多选操作; slider:添加“converter”属性,该属性允许用户决定如何将一个值转换为进度条位置或进度条位置值; searchbox:添加“disabled”属性; searchbox:添加“disable”、“enable”、“clear”、“reset”方法; spinner:添加“readonly”属性、“readonly”方法和“onChange”事件。

87,995

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧