2010-10-12 54 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