簡體   English   中英

如何在javascript中向事件處理程序添加參數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM