如何在外部JavaScript中从ServerControl访问ClientID

如何在外部JavaScript中从ServerControl访问ClientID,javascript,asp.net,controls,external,clientid,Javascript,Asp.net,Controls,External,Clientid,目前,如果我在SharePoint项目中使用JavaScript,我会在块中将代码添加到*.ascx文件中,并为每个元素创建一个ClientID变量 例如: var test = '<%= TextBox1.ClientID %>'; 不工作,不会显示任何消息 格里茨 编辑1: 好的,我可以在外部脚本中使用textBox1吗? 我是这样做的,这在我的*.ascx文件中: <script type="text/javascript"> var ClientIDs

目前,如果我在SharePoint项目中使用JavaScript,我会在
块中将代码添加到*.ascx文件中,并为每个元素创建一个
ClientID
变量

例如:

var test = '<%= TextBox1.ClientID %>';
不工作,不会显示任何消息

格里茨

编辑1:

好的,我可以在外部脚本中使用textBox1吗? 我是这样做的,这在我的*.ascx文件中:

<script type="text/javascript">
    var ClientIDs = {
        textBox1:    '<%= textBox1.ClientID %>',
        textBox2:    '<%= textBox2.ClientID %>'
    }
</script>
我还用
“#”+
对它进行了测试。每次执行test()时,都会出现以下错误:

"document.getElementById(...)" is null or not an object
编辑2: 我在警报中错过了一个
。但是现在我得到一条消息,变量没有定义。 如果我使用:
$('#'+clientId.SumbitSearch).val()
我只获取文本,而不是控件的ID

编辑3: 目前我使用:

<script type="text/javascript">
    var ClientIDs = {
        test1 :    '<%= TextBox1.ClientID %>',
        test2 :    '<%= TextBox2.ClientID %>'
    }

    function test() {
       alert($('#' + ClientIDs.test1).attr("id")));
    }
</script>

变量clientId={
测试1:“”,
测试2:“”
}
功能测试(){
警报($('#'+clientId.test1.attr(“id”));
}

在我的*.ascx文件中,它可以工作。我不喜欢那样。。。它在外部JS中不起作用,引用也不起作用。如果有人有其他想法,可以使用.net 3.5,如果他让我知道,那就太好了。

为了解释和简化您链接到的问题,他们所做的只是从页面/服务器控件设置一个JavaScript变量,然后从外部JavaScript文件读取该变量

例如,*.ascx文件将包含以下JavaScript:

var textBox1 = '<%= TextBox1.ClientID %>';

为了解释和简化您链接到的问题,他们所做的只是从页面/服务器控件设置一个JavaScript变量,并从外部JavaScript文件读取该变量

例如,*.ascx文件将包含以下JavaScript:

var textBox1 = '<%= TextBox1.ClientID %>';

我从来没有找到一个我喜欢的解决方案,但我已经实施了一些并非完全可怕的解决方案:

  • 对于必须引用特定页面元素的JS代码,请在.aspx文件中定义它,以便访问。这些函数可以调用.js文件中的常用重载函数
  • 在.aspx文件中定义javascript变量以保存ClientID值。js文件中的函数可以引用这些变量来获取客户端ID。当然,这些函数只能在定义预期变量的页面上正常工作

也许其他SO'ER会有更优雅的解决方案来解决这个问题-我期待看到其他的回应。

我从未找到一个我喜欢的解决方案,但我已经实施了一些并非完全可怕的解决方案:

  • 对于必须引用特定页面元素的JS代码,请在.aspx文件中定义它,以便访问。这些函数可以调用.js文件中的常用重载函数
  • 在.aspx文件中定义javascript变量以保存ClientID值。js文件中的函数可以引用这些变量来获取客户端ID。当然,这些函数只能在定义预期变量的页面上正常工作

也许其他SO'ER会有更优雅的解决方案来解决这个问题-我期待看到其他的回应。

使用explicity全局参数

window.clientId=''


这意味着您有global变量“cilentId”。然后您可以在任何地方使用它。

使用显式全局参数

window.clientId=''

这意味着您有global变量“cilentId”。然后您可以在任何地方使用它。

在ASP页面中:

<script>
    var test2 = '<%= TextBox2.ClientID %>'
</script> 
在ASP页面中:

<script>
    var test2 = '<%= TextBox2.ClientID %>'
</script> 

没错。我也没有找到解决办法,这很好。Greetz.如果一个页面上没有多个用户控件实例,最优雅的解决方案是在web.config文件的
节点中设置
clientmode=“Static”
。这是在ASP.NET4中引入的。没错。我也没有找到解决办法,这很好。Greetz.如果一个页面上没有多个用户控件实例,最优雅的解决方案是在web.config文件的
节点中设置
clientmode=“Static”
。这是在ASP.NET 4中引入的。请参阅我的编辑1:。谢谢你的回答。更新了jQuery选择器,我的完全错了。另外,方法是
val()
而不是
values
.Upvote for ClientIDMode-我已经忘记了这一点。它解决了.JS/ClientID问题。当然,它还增加了一个问题,即每个控件/页面负责确保其元素的唯一命名。的确,使用
clientmode=“Static”
会迫使您提前进行一些思考/双重检查。但是,对于只有一个控件实例的情况,从CSS/JS的角度来看,它要好得多。但现在我要休息一下。如果一切顺利,我明天会给你反馈。Greetz。请参见我的编辑1:。谢谢你的回答。更新了jQuery选择器,我的完全错了。另外,方法是
val()
而不是
values
.Upvote for ClientIDMode-我已经忘记了这一点。它解决了.JS/ClientID问题。当然,它还增加了一个问题,即每个控件/页面负责确保其元素的唯一命名。的确,使用
clientmode=“Static”
会迫使您提前进行一些思考/双重检查。但是,对于只有一个控件实例的情况,从CSS/JS的角度来看,它要好得多。但现在我要休息一下。如果一切顺利,我明天会给你反馈。我会避免在ASCX文件中定义JS变量:一个页面可能包含多个控件(或同一控件的多个实例)。如果每个控件都定义了“var clientid”,它们就会相互冲突(该死的JS全局命名空间!)。如果你
<script>
    var test2 = '<%= TextBox2.ClientID %>'
</script> 
documnet.getelementByid(test2);