2017-04-12 63 views
0

如何獲取使用javascript/jquery動態創建控件的客戶端ID。Jquery/Javascript:我如何獲得動態生成的控件的ClientID

我有一個日期選擇器,如果值改變,它應該觸發一個textchanged事件並執行一些功能。下面是我的腳本

function BindControlEvents() { 
    $(".datepicker").datepicker({ 
     format: 'mm/dd/yyyy', 
     autoclose: true, 
     todayBtn: 'linked' 
    }).on('changeDate', function (ev) { 
     __doPostBack('MainContent_dteFr1002', ''); 
    }).on('clearDate', function (ev) { 
     //to do 
    }); 
} 

//Initial bind 
    $(document).ready(function() { 
     BindControlEvents(); 
    }); 

//Re-bind for callbacks 
    var prm = Sys.WebForms.PageRequestManager.getInstance(); 
    prm.add_endRequest(function() { 
     BindControlEvents(); 
    }); 

代碼隱藏動態生成的文本框的DatePicker

protected void Page_Init(object sender, EventArgs e) 
{ 
     LoadControls(reportDefId); 
} 

protected void LoadControls(int reportDefId) 
{ 
    HtmlTableCell cellDate = new HtmlTableCell(); 
    TextBox dte = new TextBox(); 
    dte.ToolTip = "If you need to filter for blank dates, please select date range 1/1/1753-1/1/1753"; 
    dte.Attributes.Add("type", "text"); 
    dte.Attributes.Add("class", "datepicker"); 
    if (rfl.fieldDisplayName.Contains("Start") || rfl.fieldDisplayName.Contains("End")) 
     dte.ID = "dte" + id.ToString(); 
    else 
     dte.ID = "dteFr" + id.ToString(); 
    dte.Style["Width"] = "85px"; 
    dte.Style["Height"] = "24px"; 
    dte.TextChanged += new EventHandler(dte_TextChanged); 
    cellDate.Controls.Add(dte); 
} 

爲了測試,我已經硬編碼的客戶端ID「MainContent_dteFr1002」的,看它是否觸發textchnaged事件。它的確如此。所以我需要動態地傳遞cliendid值,其中cliendID包含dte。

我已經搜索,但我沒有找到合適的答案。

請幫忙! 謝謝

回答

0

on on change函數應該自動引用觸發它的動態控件。

alert(ev.target.id); 

是一種方式,你應該看到id。

$(this).attr("id"); 

this.id 

也應分別包含動態的ID。如果您的CliendID定義意味着除了事件觸發的控件之外的其他內容,那麼您應該指定它是什麼以及它如何唯一地綁定到此事件上。

+0

添加上面的行工作正常。但是,在ChangeDate上給_doPostBack添加另一個日期選擇器時,我每次更改/清除日期而不是關閉。如果我註釋掉_doPostBack,datepicker工作正常。但我應該做回發並調用textchanged方法。調用代碼隱藏方法的好方法是什麼?我如何修改? – crony

+0

我有點困惑,然後需要從你的代碼中看到更多的代碼。每次你調用_doPostBack時,它會創建一個新的日期選擇器?你想要的是那種行爲嗎?該代碼片段是否在位於PageLoad()中的代碼中創建日期選擇器?如果這是帶有Page.IsPostBack的回傳,您可以檢查後面的代碼,如果它是PostBack,則可以有條件地說不要創建另一個日期選擇器。在頁面加載的服務端,你可以用這樣的代碼來獲取回發參數以及字符串參數= Request [「__ EVENTARGUMENT」]; –

+0

是的,它創建了一個新的日期選擇器。我不需要這種行爲。我已經添加了datepicker文本框控件的代碼。請找到並請建議!謝謝 – crony

0

讓我們假設你有一個容器中的按鈕。

<div class='ButtonContainer'> 
<button value="textChanges" id="MainContent_dteFr1002" /> 
</div> 
<input type="text" class='datepicker' value='2017-05-01' /> 

,那麼你的事件可能看起來像這樣

$(".datepicker").datepicker({ 
    format: 'mm/dd/yyyy', 
    autoclose: true, 
    todayBtn: 'linked' 
}).on('changeDate', function (ev) { 
    $(".ButtonContainer").find("button").click(); 
}).on('clearDate', function (ev) { 
    //to do 
}); 

//OR text changed on the same controller 

$(".datepicker").datepicker({ 
format: 'mm/dd/yyyy', 
autoclose: true, 
todayBtn: 'linked' 
}).on('changeDate', function (ev) { 
// (this) is the changes textbox 
var id = $(this).attr("id"); 
__doPostBack(id, ''); 
}).on('clearDate', function (ev) { 
       //to do 
}); 
1

可以存儲ClientID每個控制供以後使用的地方。

List<string> dynamicID = new List<string>(); 
dynamicID.Add(dte.ClientID); 

或者給你的控件自制的ID和設置客戶端ID模式爲靜態,這樣他們就不會被ASPNET被重命名爲MainContent_ID_5

dte.ID = "ID_" + index; 
dte.ClientIDMode = ClientIDMode.Static; 

或者向下導航控制路徑,找到正確的ID,在這個例子中,TextBox被添加到PlaceHolder1作爲第一個控件。

<%= PlaceHolder1.Controls[0].ClientID %> 
相關問題