【问题标题】:Changing a link text with jQuery / ASP.NET not working immediately使用 jQuery / ASP.NET 更改链接文本无法立即工作
【发布时间】:2014-05-12 09:32:35
【问题描述】:

我在 asp.net 中使用 jQuery 更改链接文本的代码存在问题。奇怪的是:我必须点击四次才能正常工作,然后我的链接会改变。谁能告诉我这种奇怪行为的原因是什么?任何缓存问题?

这是我在 asp.net 中的代码:

<asp:GridView ID="gvSurveys" runat="server" AutoGenerateColumns="false" CssClass="ChildGrid" RowStyle-CssClass="aspBoundField" Width="100%">
    <Columns>
        <asp:TemplateField HeaderStyle-CssClass="aspBoundField_Header" ItemStyle-CssClass="aspBoundField" HeaderText="Lieferant">
            <ItemTemplate>
                <a href="javascript:void(0)" class="linkfield" id="surveyListSupplierLink_<%# Eval("ID") %>" onclick="document.getElementById('surveyList').style.display='none'"><%# Eval("Lieferant.Name") %></a>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderStyle-CssClass="aspBoundField_Header" ItemStyle-CssClass="aspBoundField" HeaderText="Fragebogenkatalog">
            <ItemTemplate>
                <a href="javascript:void(0)" class="linkfield" id="surveyListCatalogueLink_<%# Eval("ID") %>" onclick="document.getElementById('surveyList').style.display='none'"><%# Eval("Fragebogenkatalog.Name") %></a>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderStyle-CssClass="aspBoundField_Header" ItemStyle-CssClass="aspBoundField" HeaderText="Status">
            <ItemTemplate>
            <!-- This is where the changes should happen: -->
                <a href="javascript:void(0)" class="linkfield" id="surveyListStatusLink_<%# Eval("ID") %>" onclick="document.getElementById('surveyList').style.display='none'"><%# Eval("Status_Text") %></a>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

我的 JavaScript / jQuery 来了:

$("#surveyListStatusLink_" + surveyData.Id).html(surveyData.StatusText);

所以基本上我想要发生的是,当某个事件被触发时(在这种情况下是点击我的链接),应该更改链接标题。 一切正常,我像这样绑定点击事件:

<script type="text/javascript">
    $(document).on("click", ".linkfield", function () {
        numberStart = $(this).attr("id").indexOf("_") + 1;
        SelectedId = $(this).attr("id").substring(numberStart, $(this).attr("id").length);

        LoadData(SelectedId);

        $("#fade").fadeIn(300, "swing", function () { $("#surveyForm").fadeIn(200); });

    })
</script>

包含 jQuery 语句的 LoadData 函数:

function LoadData(id) {
    $.ajax({
        type: "POST",
        url: "SurveyList.aspx/GetData",
        data: '{surveyId: "' + id + '" }',
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: OnLoadDataSuccess,
        failure: function (response) {
            alert(response.d);
        }
    });
}
function OnLoadDataSuccess(response) {
    if (response.d.substring(0,5) == "Error")
        alert(response.d);
    else {
        surveyData = jQuery.parseJSON(response.d);

        $("#surveyFormTitle").html(surveyData.Supplier.Name); // Note: this shows up properly!

        $("#surveyListStatusLink_" + surveyData.Id).html(surveyData.StatusText);  // This doesn't...
    }
}

当我调试它时,我可以看到 html 值已正确更改,但问题来了: 它不会显示在浏览器中。它没有显示任何变化,我不太确定我做错了什么。

我已经尝试过的事情:

  • 在标题上使用 .attrib() 函数

  • 在链接上使用 .fadeOut() 函数

  • 在链接元素上使用 .text() 函数

...但仍然:没有可见的变化。

那么谁能告诉我是什么问题以及我如何解决它?

提前致谢!

【问题讨论】:

  • 点击链接时事件是否正确触发?如果是这样,我认为您可以将 $("#surveyListStatusLink_" +surveyData.Id) 替换为 $(this)。我会尝试 $(this).text("blah") 只是看看它是否有效。我知道您已经尝试过 .text,但可能选择了错误的项目。
  • 您好,谢谢您的回复!事件正确触发。奇怪的是,它在单击链接 4 次后起作用。无论如何,我会尝试你的建议。

标签: javascript jquery asp.net text hyperlink


【解决方案1】:

我知道这不是一个很好的答案,但是查看代码我想不出它成为问题的重要原因。我唯一能想到的就是把它弄糊涂了。首先,将每个锚标记的onclick事件处理程序更改为this

onclick="HandleClick(this, '<%#Eval("id")%>');">

然后用这个替换你的javascript 函数 HandleClick (link, selectedId) {

    document.getElementById('surveyList').style.display='none' //Just moved this in to the method
    LoadData(link, selectedId); //Load the data with the id and link you provided

    $("#fade").fadeIn(300, "swing", function () { $("#surveyForm").fadeIn(200); });

})

然后将链接传递给您的 Load 方法和成功方法,以便您可以直接使用它而不是查询它

function LoadData(link, id) {
$.ajax({
    type: "POST",
    url: "SurveyList.aspx/GetData",
    data: '{surveyId: "' + id + '" }',
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(response){ 
          OnLoadDataSuccess(response, link); //Still calling OnLoadDataSuccess, but changed it so we can easily provide input parameters
    },
    failure: function (response) {
        alert(response.d);
    }
  });
}

function OnLoadDataSuccess(response, link) {
    if (response.d.substring(0,5) == "Error")
         alert(response.d);
    else {
        surveyData = jQuery.parseJSON(response.d);

       $("#surveyFormTitle").html(surveyData.Supplier.Name); // Note: this shows up properly!

       link.innerHTML = surveyData.StatusText; //Use simple javascript to change the information.
    } 
}

当您复制和粘贴时它可能无法正常工作,因为我还没有真正测试过它,但我们的想法是您传递链接和 ID,而不必使用 javascript 解析它们。然后将它们传递给每个方法,以便您可以直接引用它们。这应该消除 jquery 的问题,并直接使用 javascript。

请注意,我绝不是声称知道问题出在哪里,但认为如果不那么复杂,至少调试起来会更容易。

祝你好运!

【讨论】:

  • 感谢您的回答!尝试您的解决方案时,我发现当我使用类(.linkfield)作为选择器时,它工作正常。问题是这样我改变了所有的链接......
  • 我刚刚解决了它 - id 中的下划线是问题所在。谢谢你帮我找到问题。我会为可能有同样问题的任何人发布答案。
【解决方案2】:

我刚刚发现阅读这篇文章的问题是什么: How do I get jQuery to select elements with a . (period) in their ID?

长话短说:jQuery 需要一个反斜杠作为任何特殊字符的转义序列。下划线也算作特殊字符。

所以,这就是解决方案:

$("#surveyListStatusLink\\_" + surveyData.Id).text(surveyData.StatusText);

【讨论】:

    猜你喜欢
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 2014-03-23
    • 2012-06-14
    • 2019-04-27
    • 2018-12-20
    • 2022-11-28
    相关资源
    最近更新 更多