2014-01-23 112 views
2

我正在使用一個asp.net列表視圖控件,並在它內部構建一個表格元素。如何讓jQuery在使用「this?」時返回表格行元素

<asp:ListView ID="ListView1" runat="server"> 
    <LayoutTemplate> 
     <table> 
      <tr class="header"> 
       <td></td> 
      </tr> 
      <tr id="itemPlaceHolder runat="server"> 
     </table> 
    </LayoutTemplate> 
    <ItemTemplate> 
     <tr onclick="RowClick();"> 
    </ItemTemplate> 
</asp:ListView> 

我在行單擊後面調用了一個javascript函數。

function RowClick() { 
    var tds = $(this).children('td'); 
} 

我的問題是,我RowClick內$(this)()函數不返回tr元素,它不是返回整個窗口。我怎樣才能做到這一點?我是否接近錯誤的情況?這是不可能的,我正在追鬼?謝謝!原諒我的標記,還沒有完全掌握它。

+2

http://stackoverflow.com/editing-help#code – SLaks

+0

這不是有效的html。 –

+0

@SLaks我已經能夠在你提供的鏈接中看到所有這些東西,但我從來不知道這個頁面在今天之前就存在了lol – MonkeyZeus

回答

6

你需要傳遞的處理invokation自定義執行上下文,你用Function.call()做到這一點

<tr onclick="RowClick.call(this);"> 
0

使用jQuery?恩,讓我看看。

jQuery("tr").click(RowClick); 

問候。

+0

將選擇器更改爲需要。 –

0

這在處理代碼方面並不是很「jQuery」。一個更「正確」的方法是做這樣的事情:

<tr class="row-click"> 

,並在你的JavaScript:

$(function(){ 
    $(".row-click").each(function(){ 
     $(this).on("click",function(){ 
      var tds = $(this).children('td'); 
      //Code goes here... 
     }); 
    }); 
}); 

另外,如果你想保持「RowClick」功能,你可以這樣做:

$(function(){ 
    $(".row-click").each(function(){ 
     $(this).on("click",function(){ 
      RowClick($(this)); 
     }); 
    } 
}); 
function RowClick(element){ 
    var tds = $(element).children('td'); 
    //Code goes here... 
} 
+0

只是想讓你知道你在'RowClick()'中包裝了一個jQuery對象。這可能會導致不同的問題,尤其是在應用淡入淡出或CSS轉換等效果時。 – MonkeyZeus

+0

雙包裝不會導致任何問題AFAIK,雖然我很想被證明是錯誤的,並且看到它可能導致問題的工作示例,但它確實需要一點性能問題 - http:// jsperf。 com/check-jquery-wrap/2。就個人而言,我更喜歡在這種情況下進行雙重包裝,以便在開發人員在路上看到「元素」並傳入原始dom元素而不是jquery包裹元素時,該功能非常靈活。 – streetlogics

0

我會強烈建議不要用JS調用和jQuery打亂你的HTML處理這個美麗:

$(document).ready(function(){ 

    // create the function 
    function RowClick(target){ 
     var tds = target.children('td'); 

     // another option :) 
     var tds = target.find('td'); 
    } 

    // listen for a <tr> to get clicked within the <table> -> <ItemTemplate> combo and pass the <tr> target to the function 
    $('table ItemTemplate').on('click', 'tr', function(){ 
     RowClick($(this)); 
    }); 

}); 
+0

您正在使用比所需冗餘更詳細的代碼來清理JavaScript。 :P我真的不認爲'ItemTemplate'是呈現的HTML的一部分。不知道......但很確定。 –

+0

@cookiemonster關於'的Idk,因爲我從來沒有做過ASP編程,所以你可能是對的。雖然我不得不強烈反對你,因爲它比弊端好得多。想象一下,如果OP正在創建100''標籤。這是23個字節('onclick =「RowClick();」')x 100''多餘的冗餘代碼,每頁加載量爲2300多餘字節。額外的JS是〜86字節。這些行很可能也是動態的,因此服務器必須爲每個訪問者處理少於2,300個字節。 – MonkeyZeus

+0

總是有所付出。如果有那麼多,那麼我建議事件委託將是內聯或JS中的首選解決方案。如果內聯,他們會被壓縮到幾乎沒有。無論哪種方式,一個優點是處理程序可以立即使用,這在某些情況下非常重要,因爲在這種情況下您不必有這種延遲。不要說內聯處理程序無處不在。只是說他們不應該被廣泛地解僱。 –

相關問題