【问题标题】:jquery ui tooltip remains visible for the controls under ajax update paneljquery ui 工具提示对于 ajax 更新面板下的控件仍然可见
【发布时间】:2012-10-25 10:14:59
【问题描述】:

![问题快照][2] 我有一个使用以下代码中的两个更新面板的 Web 表单:

<asp:UpdatePanel ID="UpdatePanel2" runat="server">
                <ContentTemplate>
                    <div id="SpeciesWrapper" class="RowControl" runat="server">
                        <div class="QuestionColumnControl">
                            <asp:Label ID="lblspecies" runat="server">[$BRAND(LABEL,STAGE1.SPECIES)$]</asp:Label>
                        </div>
                        <div class="AnswerColumnControl" title="Please let us know the type of pet you want to insure.">
                            <asp:RadioButtonList ID="radbtnspecies" runat="server" AutoPostBack="True" OnSelectedIndexChanged="speciesChanged"
                                RepeatDirection="Horizontal" >
                                <asp:ListItem Text="Cat" />
                                <asp:ListItem Text="Dog" />
                            </asp:RadioButtonList>
                            <label for="radbtnspecies" class="error">
                                Please select your gender</label>
                            <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ErrorMessage="Select your Species Type"
                                ControlToValidate="radbtnspecies" EnableClientScript="False"></asp:RequiredFieldValidator>


                        </div>
                    </div>
                    <div id="PetBreedWrapper" class="RowControl" runat="server">
                        <div class="QuestionColumnControl">
                            <asp:Label ID="lblPetBreed" runat="server" AssociatedControlID="ddlPetBreed">[$BRAND(LABEL,STAGE1.PETBREED)$]</asp:Label>
                        </div>
                        <div class="AnswerColumnControl">
                            <asp:DropDownList ID="ddlPetBreed" runat="server" ToolTip="If you can’t find the right breed, please call us as we may still be able to insure your pet." />
                            <span class="errormsg">
                                <cc1:BDML_HighlighterValidator ID="valPetBreed" runat="server" ControlToValidate="ddlPetBreed"
                                    DivID="PetBreedWrapper" DivCSS="RowControl" ErrorClass="RowControlErr" ForeColor=""
                                    ValidateEmptyText="True" ErrorMessage="[$BRAND(ERROR,STAGE1.PETBREED.REQ)$]"
                                    Display="Dynamic" OnServerValidate="required_ServerValidate" SetFocusOnError="true"> </cc1:BDML_HighlighterValidator>
                            </span>
                        </div>
                    </div>
                </ContentTemplate>
                <Triggers>
                    <asp:AsyncPostBackTrigger ControlID="radbtnspecies" EventName="SelectedIndexChanged" />
                </Triggers>
            </asp:UpdatePanel>

另一个使用更新面板的表单在这里:

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
                <ContentTemplate>
                    <div id="ChippedWrapper" class="RowControl" runat="server">
                        <div class="QuestionColumnControl">
                            <asp:Label ID="lblChipped" runat="server" AssociatedControlID="radChippedYes">[$BRAND(LABEL,STAGE1.CHIPPED)$]</asp:Label>
                        </div>
                        <div class="AnswerColumnControl" title="Has your pet been identified with a chip or tag?">
                            <asp:RadioButton ID="radChippedYes" Checked="true" runat="server" GroupName="radChipped"
                                AutoPostBack="True" OnCheckedChanged="radChippedYes_CheckedChanged" />
                            <asp:Label ID="lblChippedYes" runat="server" AssociatedControlID="radChippedYes">[$BRAND(LABEL,STAGE1.CHIPPEDYES)$]</asp:Label>
                            <asp:RadioButton ID="radChippedNo" runat="server" GroupName="radChipped" AutoPostBack="True"
                                OnCheckedChanged="radChippedNo_CheckedChanged" />
                            <asp:Label ID="lblChippedNo" runat="server" AssociatedControlID="radChippedNo">[$BRAND(LABEL,STAGE1.CHIPPEDNO)$]</asp:Label>
                            <%--<img alt="Help" class="help" src="[$BRAND(IMAGELINK,HELP)$]" onmouseover="javascript:showhelpdiv('help-chipped')"
                                onmouseout="javascript:hidehelpdiv('help-chipped')" onmousemove="javascript:movehelpdiv(event,'help-chipped')" />--%>
                        </div>
                    </div>
                    <div id="ChipNoWrapper" class="RowControl" runat="server">
                        <div class="QuestionColumnControl">
                            <asp:Label ID="lblChipNo" runat="server" AssociatedControlID="txtChipNo">[$BRAND(LABEL,STAGE1.CHIPNO)$]</asp:Label>
                        </div>
                        <div class="AnswerColumnControl">
                            <asp:TextBox ID="txtChipNo" runat="server" MaxLength="15" />
                            <%--<img alt="Help" class="help" src="[$BRAND(IMAGELINK,HELP)$]" onmouseover="javascript:showhelpdiv('help-chipno')"
                                onmouseout="javascript:hidehelpdiv('help-chipno')" onmousemove="javascript:movehelpdiv(event,'help-chipno')" />--%>
                            <span class="errormsg">

                            </span>
                        </div>
                    </div>
                </ContentTemplate>
                <Triggers>
                    <asp:AsyncPostBackTrigger ControlID="radChippedYes" EventName="CheckedChanged" />
                </Triggers>
            </asp:UpdatePanel>

我正在使用外部脚本文件并在页面上引用它。表单在页面加载时使用 jquery ui 工具提示小部件,代码如下:

if ($('body').prop('id') == "youandyourpet") {

$(function () {


    //code to initialize tooltip
    $(document).tooltip();
 });

function pageLoad(sender, args) {

        //code to initialize tooltip
        $(document).tooltip();      
}}

这里我使用 jquery 就绪函数以及 pageLoad 函数,这样当更新面板的部分呈现发生时,它再次将控件与工具提示联系起来。但是我已经检查了 IE7,8 和最新的 chrome 版本,如果在控制面板中选择了上述任何单选按钮,工具提示仍然可见。

![显示表格问题的图片][3]

【问题讨论】:

    标签: jquery asp.net updatepanel ajaxcontroltoolkit


    【解决方案1】:

    我在许多论坛上进行了很多搜索。另外,我做得正确,但最后我有一个非常肮脏的方法来解决我的问题。

    var prm = Sys.WebForms.PageRequestManager.getInstance(); prm.add_endRequest(function () { $(".ui-tooltip-content").parents('div').remove(); });

    如果有人知道,请提供任何其他解决方案。干杯。

    【讨论】:

      【解决方案2】:

      我认为最优雅的解决方案是运行以​​下代码: $(".ui-tooltip-content").parents('div').remove(); 在您的母版页中 OnLoad();

      【讨论】:

        【解决方案3】:

        如果您同时使用 asp.net ajax 和 jquery,最好将您的代码更新如下:

        /*globals jQuery, window, Sys */
        (function ($, Sys) {
        function setupTooltip()
        {
         $(document).tooltip();
        }
        
        $(document).ready(function () {
        setupTooltip();
                Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function () {
                    setupTooltip();
                });
        });
        }(jQuery, window.Sys));
        

        这将解决您遇到的问题。

        【讨论】:

        • 我已经尝试过您的代码,但无论焦点在哪里,工具提示仍然卡住。我还上传了问题的快照。
        • 你能看到图片吗?页面上没有错误。唯一的问题是即使焦点在任何其他控件上,工具提示也不会消失。
        • 在您的浏览器中,按 F12 并单击控制台。刷新您的页面,看看您是否收到任何错误
        • 有 2 个错误,但其图像相关的 404 未找到且与 javascript 无关。
        • 对这个问题还有更多帮助吗?
        【解决方案4】:

        我的解决办法是:

        $(document).ready(function () {
                    $('.MyTooltip').tooltip(
                    {
                        tooltipClass: 'LDFGridCellTooltip',
                        open: function (event, ui) {
                                    setTimeout(function () {
                                        $(ui.tooltip).hide();
                                    }, 3000);
                                },
                        items: '[data-title]',
                        content: function (a) {
                            return $('<span>' + $(this).attr('data-title') + '</span>').html();
                        }
                    });
                });
        

        【讨论】:

          【解决方案5】:

          考虑到您正在使用 updatePanels,我建议您在 pageLoad() 函数中输入 jquery-ui 分配并在 document.ready() 上调用此函数。在此函数中,您可以调用@RealityDysfunction 提到的函数。所以结构可能是这样的:

          $(document).ready(function () {
              //some stuff that you may have
              pageLoad();        
          });
          
          
          function pageLoad() {
              $(document).tooltip({
                  show: {
                      effect: "fadeIn",
                      duration: 300
                  },
                  hide: {
                      effect: "fadeOut",
                      duration: 100
                  },
                  tooltipClass: "toolTipClass"
              });
              $(".ui-tooltip-content").parents('div').remove();
           };
          

          这样,在每次触发回发时,您不会丢失 jquery-ui 小部件分配,并且您将始终删除工具提示。或者,您可以将其插入到 .js 文件中并在文档末尾加载。

          【讨论】:

            猜你喜欢
            • 2017-04-17
            • 2011-12-10
            • 1970-01-01
            • 1970-01-01
            • 2012-10-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多