如何在嵌套的 ASP.NET 列表视图中使用 jQuery 检测当前元素

Posted

技术标签:

【中文标题】如何在嵌套的 ASP.NET 列表视图中使用 jQuery 检测当前元素【英文标题】:How to detect current element using jQuery within nested ASP.NET listview 【发布时间】:2013-01-28 04:07:16 【问题描述】:

我有一个嵌套列表视图,其中包含多行,每行包含一个 ddl 和一个文本框,例如:

<ItemTemplate>
    <tr>
        <td>
            <asp:DropDownList id="myDDL" runat="server" CssClass="aDDL"
                onfocus="javascript:$(function()  
                $(<selector>).siblings.RemoveClass('wrappedElement');
                $(<selector>).addClass('wrappedElement');
             )" /></td>
        <td><asp:TextBox id="myTextBox" runat="server" CssClass="aTextBox"
                onfocus="javaScript:$(function()  
                $(<selector>).siblings.RemoveClass('wrappedElement');
                $(<selector>).addClass('wrappedElement');
             )" /></td>
    </tr>
</ItemTemplate>

我想要做的是包装被点击的元素。发生的事情是我包装了所有“aDDL”或“aTextBox”元素。我需要为刚刚关注的元素找到 选择器

我尝试了this article,但“this”或 $(this) 最终指向整个文档。

【问题讨论】:

不是对您问题的回答,只是小评论:您不需要在事件处理程序上使用 javascript: 前缀。只有在&lt;a&gt; 标记的href 中使用javascript 时才需要。 【参考方案1】:

我会尝试在模板之外的一个地方定义您的 javascript。像这样的东西(来自记忆):

$(".aDDL").focus(function() 
     $(".wrappedElement").RemoveClass('wrappedElement');
     $(this).addClass('wrappedElement');
 );

// etc.

根据我的经验,通过选择器从元素外部分配函数比将它们设置为 html 标记的一部分效果更好。

【讨论】:

$(this) 选择整个窗口,而不是当前元素 出于好奇:如果按照 Sen Jacob 和我的建议,通过 jQuery 将处理程序附加到元素上,您是否还有 $(this) 问题?我想知道您附加函数的方式是否导致 $(this) 具有不同的含义。【参考方案2】:

在 JavaScript 中

$(function()  
    $(".aDDL,.aTextBox").focus(function() 
        $(".aDDL,.aTextBox").RemoveClass('wrappedElement');
        $(this).addClass('wrappedElement');
    );
);

并将其用作您的项目模板

<ItemTemplate>
    <tr>
        <td>
            <asp:DropDownList id="myDDL" runat="server" CssClass="aDDL" /></td>
        <td>
            <asp:TextBox id="myTextBox" runat="server" CssClass="aTextBox" /></td>
    </tr>
</ItemTemplate>

如果您仍想内联,请尝试以下操作。

onfocus="$(function()  
            var $this = $(document.activeElement);
            $this.siblings.RemoveClass('wrappedElement');
            $this.addClass('wrappedElement');
         )"

【讨论】:

$(this) 选择整个窗口,而不是当前元素。这就是我要解决的问题。 $(this) 指的是您用来触发事件的选择器元素。在您的情况下,您正在 document.ready 函数本身中添加/删除类,这就是您的 $(this) 引用当前文档的原因。 我在上面编辑了我的答案。请检查它是否对您有帮助。【参考方案3】:

几个项目:

您不需要在代码前加上 javascript: 前缀,这仅适用于调用 href 属性 &lt;a href="javascript:..."&gt; 上的函数的链接元素。 (在这种情况下可能更好地绑定到click 事件。)

你也不需要用 jQuery 对象来包装你的内联函数。不要编码:onfocus="javaScript:$(function() )",试试onfocus="function()"

最后,您可以将event 对象作为处理程序调用的一部分传递,以获得对选择器的访问权限。不确定它是否可以内联:

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script src="Scripts/jquery-1.9.1.min.js"></script>
    <script>
        function select(e) 
            var selector = e.target; // "select#options"
            var $selector = $(e.target) // jQuery object wrapping <select>
        
    </script>
</head>
<body>
    <select id="options" onfocus="select(event)">
        <option value="1">Dog</option>
        <option value="2">Cat</option>
        <option value="3">Horse</option>
    </select>
</body>
</html>

【讨论】:

安迪成功了。关键是要使用事件对象,因为它总是有一个明确的 event.target.id 值。 Bob,发现了这个,它可能会影响您的使用。 target 在使用 srcElement 的 IE 中不可用。用它来找到你的目标:var target = event.target || event.srcElement;***.com/a/5301667/64262

以上是关于如何在嵌套的 ASP.NET 列表视图中使用 jQuery 检测当前元素的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 如何从嵌套对象的视图模型集合中动态创建表结构

带有 jQ​​uery 验证的 ASP.Net MVC Ajax 表单

如何在 ASP.Net MVC 中将列表对象显示到视图中?

如何从列表视图中获取数据作为字符串 C# asp.net

如何在 ASP.NET MVC 视图中显示 2 个列表

asp.net MVC 中嵌套表视图中级别 3 子子项的问题