2013-03-07 47 views
0

我一直在玩弄自己的WebControls,并试图在不使用MS AJAX的情况下添加一些AJAX功能。我不确定将JS对象从WebControl传递到页面脚本的最佳方式。WebControl在<script>标签中创建JS对象,如何在页面的JS中获取对象?

我用Page.ClientScript.RegisterClientScriptResource让我控制的JS浏览器,和我通过像这样的服务器代码实例化JS(RenderEndTag写出一个<script>调用新):

public class SearchBox : WebControl 
{ 
    //... 
    public override void RenderEndTag(System.Web.UI.HtmlTextWriter writer) 
    { 
     //... 
     writer.Write("<script type=\"text/javascript\">new SearchBox($('#" + this.ClientID + "'));</script>"); 
    } 
} 

现在我需要使用该对象在特定页面的JS中(例如添加一个valueChanged处理程序)。我应该怎么做呢?将控件ID作为键的全局数组是否工作?基于

+0

您是否试图从拥有您的SearchBox控件的页面访问SearchBox? – 2013-03-08 02:49:22

+0

是的;我在.aspx中创建控件,这会导致内联脚本块被写出;现在我需要访问js对象来添加处理程序,而不是。 – Turch 2013-03-08 19:04:23

+0

全局数组可以工作。我可能宁愿最终从父页面处理函数中抓取DOM中的对象 – 2013-03-08 19:07:38

回答

1

由于您使用jQuery的,你可以在你的搜索盒的JavaScript构造做的事情之一是这样的:

var SearchBox = function($element) { 
    $element.data("searchBox", this); 
} 

然后,你可以很容易地可以从jQuery的再次在以后检索此:

var sb = $("#myElement").data("searchBox"); 
+1

Doh,我甚至没有考虑将对象附加到元素。比全球阵列清洁得多。 – Turch 2013-03-08 21:00:37

+0

哈哈,很高兴我能帮上忙! – rossisdead 2013-03-08 21:06:45

1

我你的问题的理解,我会做这样的事情:

public class SearchBox : WebControl 
{ 
    public int SearchBoxControlId { get { return this.ClientID;}} 
    //... 
    public override void RenderEndTag(System.Web.UI.HtmlTextWriter writer) 
    { 
     //... 
     writer.Write("<script type=\"text/javascript\">new SearchBox($('#" + this.ClientID + "'));</script>"); 
    } 
} 


//Other Parent Page 
<uc1:SearchBox id="ucSearchBox" runat="server" /> 
<script> 
    $("#SOMEID").change(function (e) { 

     var searchBox = $("#<%= ucSearchBox.SearchBoxControlId %>"); 

     //Do stuff 
    }); 
</script> 
+0

我试图得到JS对象本身(由'new'返回的),而不是html元素,这就是为什么我选择了rossisdead的答案:) – Turch 2013-03-08 21:01:23