我们已经为ASP.Net创建了一个用户控件。在任何时候,用户的个人资料页面可以包含这些控件的一个和无限之间。 Control.ascx文件包含相当多的javascript。当控件由.Net呈现为HTML时,您会注意到它为每个控件打印了javascript。
这是预期的。我想减少服务器输出的HTML数量,以增加页面加载时间。通常,您可以将javascript移动到外部文件,然后您只需要一个额外的HTTP请求,该请求将用于所有控件。
但是在javascript中我们有类似
document.getElementById('<%= txtTextBox.ClientID %>');的实例呢? javascript如何知道哪个用户控件可以使用?有没有人做过这样的事情,或是解决方案盯着我?
答案 0 :(得分:2)
编写带有ID的函数,将它们放在mysite.js中并像这样引用文件:
<script type="text/javascript" src="/mysite.js"></script>
然后当您在控件中进行调用时,请执行以下操作:
<div onClick="DoMyFunctionThatIWant('<%= txtTextBox.ClientID %>')">...</div>
然后你在js中的函数是这样的:
function DoMyFunctionThatIWant(domId)
{
var obj = document.getElementById(domId);
}
答案 1 :(得分:0)
你有能力使用jQuery吗? css选择器功能对于这些类型的场景非常强大。例如:
<div class="action" id="1">Node 1</div>
<div class="action" id="2">Node 2</div>
<div class="action" id="3">Node 3</div>
<div class="action" id="4">Node 4</div>
<div class="action" id="5">Node 5</div>
然后,您将拥有一个JavaScript函数并将其绑定到符合选择条件的每个元素。它可能看起来像:
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript">
$('.action').click(function() {
var $t = $(this); //---here is your contextual node
alert($t.attr('id')); //---this alerts the id value of your node
});
</script>
答案 2 :(得分:0)
以下是解决方案:
我的实际全面解决方案有点不同。每个用户控件都包含一个telerik radgrid。 radgrid的客户端事件处理程序的格式为
radGrid_eventOccurred(sender, args) {,其中sender是网格对象。
因此我没有使用usercontrols ID作为代码中的键,而是使用了网格。
每当我点击网格中的一行时,我都需要更新usercontrol中的文本框。我现在可以这样做:
function radGrid_rowClick(sender, args) { var text = /*Get the text of the clicked row*/; var textBox = textBoxesObject[sender]; textBox.set_value(text); }
答案 3 :(得分:0)
编写一个microsoft ajax客户端组件。
这需要做很多事情:
组件类可以执行您想要的所有操作,因为它知道您的用户控件的所有clientIds。这适用于同一用户控件的多个实例。作为一个陷阱,实施起来有些麻烦。但它很干净。