我有一个需要通过javascript函数点击的asp图像按钮。 按下回车键时,文本框的按键也应触发此图像按钮服务器端事件。 男女同校如下: -
标记
<asp:ImageButton ID="ImageButton3" runat="server" ImageUrl="images/butt_searchoff.png"
class="sb_search" ToolTip="Search the Database" AlternateText="Search" OnClick="ImageButton3_Click" OnClientClick="SetExpandedCount()"/>
<input id="tbSearch" runat="server" class="sb_input" type="text" autocomplete="off" onkeypress="return OverridePostBackOnEnter(event, '" & ImageButton3.ClientID & "');" />
我想将ImageButton3 ClientId作为param传递给名为OverridePostBackOnEnter的Javascript函数
Javascript看起来像这样:
function OverridePostBackOnEnter(event, ctrl) {
if (event.keyCode == 13) {
alert(ctrl);
if ($.browser.mozilla) {
__doPostBack(ctrl, 'OnClick'); //for IE
}
else {
//but for other browsers you should use
__doPostBack(ctrl, 'OnClick');
}
}
};
我的发现是什么a)我无法获得正确的ClientId传递,我只是得到未定义或null。
和b)如果我硬编码并将ctrl更改为'cmain_ctl00_ImageButton3',则__dopostback不会调用ImageButton3的服务器端代码。
对此的任何帮助都会非常令人沮丧。
修改
好的,我想我找到了一个解决方案,并认为我应该更新帖子以防任何人需要它。
首先我将ImageButton3上的'ClientIdMode'设置为'Static'
<asp:ImageButton ID="ImageButton3" ClientIDMode="Static" runat="server" ImageUrl="images/butt_searchoff.png" class="sb_search" ToolTip="Search the Database" AlternateText="Search" OnClick="ImageButton3_Click" OnClientClick="SetExpandedCount()"/>
这允许我将按钮的id传递给函数'OverridePostBackOnEnter'
<input id="tbSearch" runat="server" class="sb_input" type="text" autocomplete="off" onkeypress="return OverridePostBackOnEnter(event, 'ImageButton3');" />
然后我的javascript变为:
function OverridePostBackOnEnter(event, ctrl) {
if (event.keyCode == 13) {
if ($.browser.mozilla) {
var overridctrl = document.getElementById(ctrl);
__doPostBack(overridctrl.name, ''); //for IE
}
else {
//but for other browsers you should use
var overridctrl = document.getElementById(ctrl);
__doPostBack(overridectrl.name, '');
}
}
};
通过查看'yourForm._EVENTTARGET.value'和'yourForm。 EVENTARGUMENT.value',我可以看到这些值未被设置。通过使用'document.getelementId'并传递'control.name'来设置这些值并启用' _dopostpack'来调用服务器端事件。
谢谢大家抽出时间来帮助我,非常感激。
答案 0 :(得分:2)
请改用this
关键字。在输入的onkeypress
事件的上下文中,this
将引用输入对象。因此,this.id
就足够了。示例如下:
<input id="tbSearch" runat="server"
class="sb_input" type="text"
autocomplete="off"
onkeypress="return OverridePostBackOnEnter(event, this.id);" />
修改强>
完全误读了你的帖子。正确答案如下:
<input id="tbSearch" runat="server"
class="sb_input" type="text"
autocomplete="off"
onkeypress="return OverridePostBackOnEnter(event, '<%#ImageButton3.ClientID%>');" />
答案 1 :(得分:1)
只需使用this.id
:
OverridePostBackOnEnter(event, this.id);
您也可以更改方法并传入元素本身:
OverridePostBackOnEnter(event, this);
修改强>
要传入ImageButton的ClientID,请尝试以下方法:
OverridePostBackOnEnter(event, '<%= ImageButton3.ClientID %>');
答案 2 :(得分:0)
这很hacky,但这会奏效......
<asp:ImageButton ID="ImageButton3" runat="server" ImageUrl="images/butt_searchoff.png"
class="sb_search" ToolTip="Search the Database" AlternateText="Search" OnClick="ImageButton3_Click" OnClientClick="SetExpandedCount()"/>
<input id="tbSearch" runat="server" class="sb_input" type="text" autocomplete="off" onkeypress="return OverridePostBackOnEnter(event, '<asp:Literal ID="otherControlsClientIDHolder" runat="server" />');" />
然后在服务器端将文字的text属性设置为图像按钮的客户端ID ....
otherControlsClientIDHolder.Text = ImageButton3.ClientID;
詹姆斯希尔上面的答案比我的好。它在功能上是一样的,但他更清洁。 +1詹姆斯希尔的回答
答案 3 :(得分:0)
另一种方法是在页面加载时添加属性服务器端。
tbSearch.Attributes.Add("onkeypress", "return OverridePostBackOnEnter(event, '" + ImageButton3.ClientID + "');");