在FireFox中,同时使用OnClientClick和Click事件来触发一个按钮并未成功触发。问题涉及到IT技术。

5

我在服务器端代码中将Onclientclick事件附加到按钮上,如下所示:

TopPanelButton.OnClientClick = string.Format("if(!ValidData({0},{1},{2},{3})) return false;", txtOD.ClientID, radCmbOD.ClientID, txtgetMe.ClientID, RadAjaxLoadingPanel1.ClientID);

此外,aspx页面中也会为同一个按钮附加onClick事件。
 <asp:Button ID="TopPanelButton" runat="server" Text="Go" 
   CssClass="CBtn1" Width="30px" Height="21px" OnClick="TopPanelButton_Click" />

如果onclientclick返回true,则应触发服务器端点击事件。 "ValidateData()"函数用于验证表单中的条目。
这段代码在IE中运行良好。但是在Firefox中,两个事件都没有触发。如果我注释掉“TopPanelButton.OnClientClick = ...”代码,那么onClick事件就会触发。

在下面的代码中,我应该在哪里应用这个代码Page.ClientScript.GetPostBackEventReference()

TopPanelButton.OnClientClick = string.Format("if(!ValidData({0},{1},{2},{3})) return false;", txtOD.ClientID, radCmbOD.ClientID, txtgetMe.ClientID, RadAjaxLoadingPanel1.ClientID);

火狐浏览器没有调用ValidData函数。我在javascript中放置了警报,但是在Firefox中没有显示警报消息。但是IE显示了警报消息。 我的validData函数:
function ValidData(txtOND, ddlOND, txtgetMe, aPanel) {
        alert("Entered");
        if (!ValidNumber(txtgetMe)) {
            aPanel.hide();
            return false;
        }

        if (ddlOND.value == "Origin" || ddlOND.value == "Destination") {
            if (!ValidOriginOrDestination(txtOND, ddlOND.value)) {
                aPanel.hide();
                return false;
            }
        }
        else if (ddlOND.value == "O&D") {
            if (!ValidOND(txtOND)) {
                aPanel.hide();
                return false;
            }
        }

        if (ddlOND.value == "Region Starting with" || ddlOND.value == "Country Starting with" || ddlOND.value == "Budget Station Starting with") {
            if (txtOND.value.length == 0) {
                radalert("Enter  a value for " + ddlOND.value);
                aPanel.hide();
                return;
            }
        }
        aPanel.show();
        return true;
    }

似乎ValidData()中有一些错误,可能是IE更容易原谅的。你能发布ValidData()的代码吗? - Fishcake
你可以使用 switch (ddlOND.value) { } 代替多个 if-elseif。 - abatishchev
2个回答

1

我找到了问题并进行了修复。以下是我的解决方案。

我正在使用Telerik控件,其中clientID在Firefox中不被视为对象。但是IE将clientID视为对象。因此,我的先前代码在IE中运行良好,但在Firefox中却无法正常工作。现在,我通过将clientID作为字符串传递给OnClientClick,并用单引号括起来来进行更改,如下所示:

TopPanelButton.OnClientClick = string.Format("javascript:if(!ValidData('{0}','{1}','{2}','{3}')) return false;", txtOD.ClientID, radCmbOD.ClientID, txtgetMe.ClientID, RadAjaxLoadingPanel1.ClientID);

在我的 JavaScript 中,我使用 document.getElementById 来获取对象。
function ValidData(txtOND, ddlOND, txtgetMe, aPanel) {
        var l_aPanel = document.getElementById(aPanel);
        var l_txtgetMe = document.getElementById(txtgetMe);

        if (!ValidNumber(l_txtgetMe)) {
            return false;
        }

        var l_txtOND = document.getElementById(txtOND);
        var l_ddlOND = document.getElementById(ddlOND);

        if (l_ddlOND.value == "Origin" || l_ddlOND.value == "Destination") {
            if (!ValidOriginOrDestination(l_txtOND, l_ddlOND.value)) {
                return false;
            }
        }
        else if (l_ddlOND.value == "O&D") {
            if (!ValidOND(document.getElementById(txtOND))) {
                return false;
            }
        }

        if (l_ddlOND.value == "Region Starting with" || l_ddlOND.value == "Country Starting with" || l_ddlOND.value == "Budget Station Starting with") {
            if (l_txtOND.value.length == 0) {
                radalert("Enter  a value for " + l_ddlOND.value);
                return false;
            }
        }
        return true;
    }

这在IE和Firefox中都可以正常工作。


0

FireFox无法同时处理OnClientClick和OnClick事件(尽管Internet Explorer可以很好地处理)。为了解决这个问题,可以使用一个名为Page.ClientScript.GetPostBackEventReference()的方法,它可以生成客户端JavaScript以执行对控件的回发。

因此,以下代码将隐藏页面上的所有内容,除了加载图形,并调用btnSubmit回发方法。它返回false的原因是否则Internet Explorer会两次调用服务器端的OnClick方法。

btnSubmit.OnClientClick = String.Format("ElementStyle(document.getElementById('wrapper'),'display','none'); {0}; return false;", Page.ClientScript.GetPostBackEventReference(btnSubmit, ""));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接