2010-10-12 43 views
0

我acessing使用 parentNode.nextElementSibling.value复选框的兄弟时,它会返回值,在IE中Firefox.But正常工作跟它对象为空 ,说问题使用jQuery

Microsoft JScript runtime error: 'parentNode.nextElementSibling.value' is null or not an object

我的功能如下

function chkEnergy() { 
      var inputs = $('.check input'); 
      var count = 0;var ok = 1; 
     for (var i = 0; i < inputs.length; i++) { 
      //alert(inputs[i].attr('checked')); 
      if (inputs[i].checked == true) { 
       var ch = inputs[i]; 
       var qty=ch.parentNode.nextElementSibling.value; 
       if (qty == "0") { 
        ok = 0; 
        showStatus(true, "Please specify the Quantity"); 
        return false; 
       } 
       else { 
        ok = 1; 
        continue; 
       } 
      } 
     } 
      if(ok==1) 
       return true 
      else 
       return false; 

    } 

我使用这种方式有数据列表,其中的复选框,文本框在那里

 <asp:DataList ID="dlstEnergyItems" runat="server" RepeatColumns="4" RepeatDirection="Horizontal" Width="100%"> 
    <ItemTemplate> 
    <asp:CheckBox ID="cbEnergyItems" runat="server" CssClass="check" /> 
    <input type="text" id="txtQty" style="width:25px" class="hide textbox numbers_only" value="0" runat="server" /> 
     <asp:HiddenField ID="HdfEnergy" runat="server" /> 
      <asp:HiddenField ID="HdfEnergyCID" runat="server" /> 
     </ItemTemplate> 
</asp:DataList> 

Renederd HTML

<table cellspacing="0" border="0" style="width: 100%; 
border-collapse: collapse;" 
id="ctl00_ContentPlaceHolder1_dlstEnergyItems"> 
<tbody><tr> 
<td> 
<span class="check"><input type="checkbox" name="ctl00$ContentPlaceHolder1$dlstEnergyItems$ctl00$cbEnergyItems" id="ctl00_ContentPlaceHolder1_dlstEnergyItems_ctl00_cbEnergyItems"><label for="ctl00_ContentPlaceHolder1_dlstEnergyItems_ctl00_cbEnergyItems"> 
Energy-1</label></span> 
    <input type="text" value="0" class="textbox numbers_only" style="width: 25px;" id="ctl00_ContentPlaceHolder1_dlstEnergyItems_ctl00_txtQty" name="ctl00$ContentPlaceHolder1$dlstEnergyItems$ctl00$txtQty"> 
    <input type="hidden" value="1" id="ctl00_ContentPlaceHolder1_dlstEnergyItems_ctl00_HdfEnergy" name="ctl00$ContentPlaceHolder1$dlstEnergyItems$ctl00$HdfEnergy"> 
<input type="hidden" 
id="ctl00_ContentPlaceHolder1_dlstEnergyItems_ctl00_HdfEnergyCID" name="ctl00$ContentPlaceHolder1$dlstEnergyItems$ctl00$HdfEnergyCID"> 
</td></tr></tbody></table> 
+0

你可以发布一个项目的呈现HTML吗? – 2010-10-12 09:34:09

回答

5

@jsalonen有正确的原因(缺少对IE的支持),但是这里有一个解决方案......如果你包含jQuery,请使用它:)这里有一个简短版本的函数,浏览器:

function chkEnergy() { 
    var fails = $('.check:has(input:checked)').next("[value=0]").length; 
    if (fails > 0) showStatus(true, "Please specify the Quantity"); 
    return fails === 0; 
} 

在此我们使用.next()得到那个输入字段,并使用attribute-equals selector在同一时间得到只有具有的0一个value(失败的数量检查)这些领域。如果我们找到的元素的.length超过0,那么我们有一些故障...显示警报并返回false

+0

同意。这是要走的路! – jsalonen 2010-10-12 09:40:44

+0

很好的答案!谢谢 !缺口 – kbvishnu 2010-10-12 11:14:38

2

你的问题实际上不是jQuery的,但IE特定的。

Internet Explorer does not supportnextElementSibling因此它的值将不会在其中定义。

问题的解决方案是使用jQuery来访问元素而不是直接的DOM访问(就像你现在正在做的那样)。

2

IE不支持nextElementSibling,因为它的非标准属性由Firefox/Mozilla发明的IE(不出意外)不支持的标准。

您将需要使用标准nextSibling,如果您的元素之间有可能的文本节点,则需要遍历它以查找下一个元素。

大多数DOM库(如jQuery)都可以提供这样的功能。

我错过了你实际上是使用jQuery,所以使用

var qty = $(ch).parent().next().val(); 

顺便说一句,这是令人困惑的混合jQuery和 “纯粹” 的DOM。这可能导致这样的错误。

+0

只需注意:nextElementSibling不仅仅是专有的。它已在元素遍历规范(http://www.w3.org/TR/ElementTraversal/,第2.4节)中标准化。但是,标准化并不意味着支持。 – jsalonen 2010-10-12 09:39:25

+0

@jsalonen:哎呀,错过了。谢谢。 – RoToRa 2010-10-12 09:43:27

+0

感谢它也在Firefox中工作.. – kbvishnu 2010-10-12 10:37:09