[英]How, using JavaScript, do I change an <a> tag's onclick event handler to a function with parameters?
[英]How do I add parameters to an event handler in javascript?
並感謝您的光臨。
目前,我正在從該示例中實現代碼。 在我的aspx文件中,我定義了Label1和Textbox1。 在我的aspx.cs文件中,我正在Page_Load方法中將Label1.Text屬性設置為隨機字符串。
在我包含的.js文件中,我有:
var Label1, TextBox1;
Sys.Application.add_init(AppInit);
function AppInit(sender) {
Label1 = $get('Label1');
TextBox1 = $get('TextBox1');
$addHandler(Label1, "click", Label1_Click);
$addHandler(TextBox1, "blur", TextBox1_Blur);
$addHandler(TextBox1, "keydown", TextBox1_KeyDown);
}
現在,我想添加更多標簽(和相應的文本框),但是我不想為每個其他事件定義單獨的處理程序的開銷,即,我想避免這種情況:
$addHandler(Label1, "click", Label1_Click);
$addHandler(TextBox1, "blur", TextBox1_Blur);
$addHandler(TextBox1, "keydown", TextBox1_KeyDown);
$addHandler(Label2, "click", Label2_Click);
$addHandler(TextBox2, "blur", TextBox2_Blur);
$addHandler(TextBox2, "keydown", TextBox2_KeyDown);
...
如何將參數傳遞給處理程序,該處理程序將准確識別發件人,並使處理程序使用“ this”或其他內容。 還要注意的是,我希望能夠標識Label的索引(1,2,3 ...),因為我還必須編輯相應的文本框。 對於實例,Label1_Click的當前實現如下所示:
function Label1_Click() {
TextBox1.value = Label1.innerHTML;
Label1.style.display = 'none';
TextBox1.style.display = '';
TextBox1.focus();
TextBox1.select();
}
謝謝你們
好吧,$ addHandlers可以幫助加快添加處理程序的過程……此外,在JS中,您可以通過執行以下操作將雜項數據附加到對象:Label1 [“ somenewproperty”] = value; 因此,您可以附加某些屬性並簽入事件處理程序...雖然確實占用了資源,所以請小心執行此操作...
在某種程度上,JS應該如何知道您想聽的對象以及對象的順序,以減少代碼量? 也許存儲文本框和標簽的數組,並通過索引引用這些對象,但是在某種程度上,您無法擺脫某些管道代碼。
HTH。
您可以嘗試創建一個委托。 例如,帶有標簽:
function AppInit(sender) {
$addHandler(Label1, "click", Function.createDelegate(this, LabelClick());
$addHandler(Label2, "click", Function.createDelegate(this, LabelClick());
}
function LabelClick(sender)
{
/..
}
我知道這是一個老問題,但昨天我遇到了同樣的問題,這是我想到的解決方案。
我不太喜歡它,但是還沒有找到一種更簡單的方法:對於要通過此方法與文本框鏈接的每個標簽,我都使用自定義CssClass(與文本框相同)。 然后,我對其進行迭代,並根據是標簽還是按鈕來附加相應的處理程序。
var labels;
var texts;
Sys.Application.add_init(AppInit);
function AppInit(sender) {
labels = document.getElementsByClassName('lblDynamic');
texts = document.getElementsByClassName('txtDynamic');
for (i = 0; i < labels.length; i++)
{
$addHandler(labels[i], "click", Label1_Click);
}
for (i = 0; i < texts.length; i++) {
$addHandler(texts[i], "blur", TextBox1_Blur);
$addHandler(texts[i], "keydown", TextBox1_KeyDown);
}
}
下一步是訪問方法處理程序中的通用控件。 使用this
參考非常容易。 例:
function TextBox1_KeyDown(event) {
if (event.keyCode == 13) {
event.preventDefault();
this.blur();
}
}
但是這里有一個問題:我怎么知道某個標簽與某個文本框配對? 我為兩個控件使用了非常相似的ID。 ASP將在呈現頁面后添加其viewstate奇怪的命名法,因此我需要使用非常骯臟的技巧來擺脫多余的文本。 然后,我迭代文本框控件,如果一個與已處理事件上的標簽匹配,則可以像您發布的示例一樣使用它們:
function Label1_Click()
{
var offset = this.id.indexOf('lbl') + 3;
for (j = 0; j < texts.length; j++)
{
if (texts[j].id.substring(offset) == this.id.substring(offset))
{
texts[j].value = this.innerHTML;
this.style.display = 'none';
texts[j].style.display = '';
texts[j].focus();
}
}
}
在這種情況下,我的標簽和文本框就是這樣聲明的。 注意非常相似的命名法:
<asp:Label runat="server" CssClass="lblDynamic" ID="lblExerciseName">My Text</asp:Label>
<asp:TextBox runat="server" CssClass="txtDynamic" ID="txtExerciseName" Style="display: none;" />
希望能幫助到你 :)
有很多方法,但是這種方法可以在任何瀏覽器中完美運行,並且您不需要庫。
我將onclick處理程序附加到此頁面上的每個輸入,並給它2個參數,這些參數是從二維數組中獲得的。 我使用了閉包來確保處理程序仍然可以訪問給定的參數。 我還使我成為了全局對象(頁面上的p),所以我不會用變量使全局名稱空間混亂。
<!DOCTYPE html>
<html>
<head>
<script>
var p = {
onload: function() {
var btns = document.getElementsByTagName("input");
var parameters = [["btn1 p1", "btn1 p2"], ["btn2 p1", "btn2 p2"]];
for(var i = 0, ceiling = btns.length; i < ceiling; i++) {
btns[i].onclick = function(par1, par2) {
return function() {
p.btnOnclick(par1, par2);
};
}(parameters[i][0], parameters[i][1]);
}
},
btnOnclick: function(par1, par2) {
alert("par1: " + par1 + " | par2: " + par2);
}
};
</script>
</head>
<body onload="p.onload()">
<input type="button" value="button1"/>
<input type="button" value="button2"/>
</body>
</html>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.