【问题标题】:How to access a Div inside a repeater using javascript如何使用 javascript 访问中继器内的 Div
【发布时间】:2010-11-29 12:26:14
【问题描述】:

简单地说,我在转发器中有一个锚点,它在点击一个 javascript 函数时触发,它将 Div 的 innerHTML 设置为某些内容。

在中继器之外尝试这个确实有效! 但是如果我尝试在中继器的项目模板中实现相同的代码,它就行不通了!

注意:我想我需要先访问中继器,然后再访问其中的 Anchor!但我不知道该怎么做

进一步说明:

JavaScript 函数:

function show(ele, content) {
    var srcElement = document.getElementById(ele);
    if (srcElement != null) {
        srcElement.innerHTML = content;
    }
}

转发器代码:

<asp:Repeater ID="Repeater1" runat="server" >
    <ItemTemplate>
        Name : <%# Eval("name")%>
        <DIV ID= "PersonalInfo1" runat="server"></DIV>
        <A id="A1" href="#" runat="server" onclick="show('PersonalInfo1','Address : ')">More...</A>
    </ItemTemplate>
</asp:Repeater>

PS:发布的代码在中继器中不起作用!

【问题讨论】:

    标签: c# javascript asp.net webforms


    【解决方案1】:

    那是因为 id 是唯一的。使用 getElementsByName 或通过类名选择元素,例如 jQuery。

    【讨论】:

    • 好吧,我想访问一个特定的锚点..所以我指定了它的 ID!这不是更好更直接吗?
    • @lKashef:您不能多次使用一个 ID。它在整个文档中必须是唯一的。锚到底是什么意思?如果有多个,应该跳转到哪一个?
    • @lKashef - 如果您不想深入研究 jQuery ATM,请使用我的代码并在循环中检查 oLink 的 id 时添加简单。
    • 忘掉我的实现吧! =)我有一个中继器,它将显示特定数据库表中所有项目(人)的名称......现在,无需刷新我的页面(使用 ajax、jquery 或我不知道的类似技术)我需要放置一个锚点或文本按钮,无论上面写着“更多..”,当它被点击时,它必须显示一些额外的数据(来自数据库),比如地址......我希望我清楚我的目标!感谢难以捉摸=D
    • @lKashef - 很酷,你最初的想法应该可以正常工作。
    【解决方案2】:

    好的……让我们重新开始。

    有这样的中继代码:

    <asp:Repeater ID="Repeater1" runat="server" >
        <ItemTemplate>
            <div>
                Name : <%# Eval("name")%>
                <div id="Address" runat="server" style="display: none;"><%# Eval("address")%></div>
                <div id="Interests" runat="server" style="display: none;"><%# Eval("interests")%></div>
                <a id="A1" href="#" runat="server" onclick="return show(this, 'Address');">Show address</a>
                <a id="A2" href="#" runat="server" onclick="return show(this, 'Interests');">Show interests</a>
            </div>
        </ItemTemplate>
    </asp:Repeater>
    

    那么这样的JavaScript代码:

    function show(oLink, targetDivID) {
        var arrDIVs = oLink.parentNode.getElementsByTagName("div");
        for (var i = 0; i < arrDIVs.length; i++) {
            var oCurDiv = arrDIVs[i];
            if (oCurDiv.id.indexOf(targetDivID) >= 0) {
                var blnHidden = (oCurDiv.style.display == "none");
                oCurDiv.style.display = (blnHidden) ? "block" : "none";
                //oLink.innerHTML = (blnHidden) ? "Less..." : "More...";
            }
        }
        return false;
    }
    

    这将搜索点击链接的“兄弟”DIV元素,并显示或隐藏它。

    代码使用纯 JavaScript 尽可能简单,您应该能够理解每一行在做什么 - 如果您不知道,请随时询问。 :)

    注意,您必须提前将个人信息放在 PersonalInfo div 中,而不是将其传递给函数 - 函数将获得指向点击链接的指针。

    【讨论】:

    • 您可以在此处查看实时示例(静态 HTML):jsfiddle.net/TEFnh,您也可以在其中处理 JS 代码。 :)
    • 我不能否认这正是我想要实现的!但老实说,我不太明白!首先,您将 Anchor 对象发送给函数,然后使用“parentNode”属性!这到底是什么?我本可以使用 getByTagName 函数简单地搜索任何锚点!对吗?
    • 我刚刚发现的一个BUG!!当我单击更多时,它会显示所有 DIV 中的信息,当我单击更少时,它会隐藏所有 div!但当然我希望我可以只隐藏/显示给定项目的 div!
    • @lKashef - 要修复 BUG,只需用 DIV 元素包装每个项目(在中继器中),我已经相应地编辑了我的代码。单击链接的 parentNode 将返回新的包装 DIV 元素,然后您将遍历其子 DIV 元素,搜索具有正确 ID 的元素。
    • @lKashef - 1) 在控制范围内,真实 ID 将类似于 MyControl1_Address,因此必须将其覆盖,否则我们将永远找不到控制。 2)链接的默认行为是将用户重定向到不同的页面。如果不返回 false,页面将被重新加载,我们希望避免这种情况。 return false; 告诉浏览器:不要继续你的默认行为。 3) 没问题。 :)
    【解决方案3】:

    是的,您需要迭代所有相关链接。涉及代码更改最少的解决方案是向链接添加类,然后检查此类:

    <A id="A1" href="#" runat="server" class="RepeaterLink" ...>
    

    然后在 JavaScript 中:

    var arrLinks = document.getElementsByTagName("a");
    for (var i = 0; i < arrLinks.length; i++) {
        var oLink = arrLinks[i];
        if (oLink.className == "RepeaterLink") {
            //found link inside repeater..
            oLink.click();
        }
    }
    

    这将“自动点击”所有链接,您也可以检查 ID 或其他内容来模拟中继器中特定链接的点击。

    【讨论】:

    • 顺便说一句,使用 jQuery 可以缩短 JavaScript 代码并且更加“浏览器安全”。这是你的电话。 :)
    • 实际上,我正在研究(Javascript,JQuery,Ajax)之间的区别,我知道它们每个的定义,但我不知道它们到底用于什么?当然,如果您认为 JQuery 更好,我会考虑使用它,但任何指南或指针都会有所帮助(Y)!
    • @lKashef - jQuery 是 JavaScript 库 - 您需要做的就是添加对 jQuery 代码文件的引用,然后就可以使用它了。想想蛋糕:你可以自己烤蛋糕(纯 JavaScript),也可以在商店里买别人做的蛋糕。 (jQuery)
    • @Shadow Wizard:你需要提一下,店里的这个蛋糕是由非常熟练的人制作的,所以你可以确定它在各种浏览器中的味道都是一样的。
    • @elusive - 好点……蛋糕的价格约为 80 KB。 :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    相关资源
    最近更新 更多