2011-10-24 18 views
1

目前,如果我在SharePoint項目中使用JavaScript,我將代碼添加到* .ascx文件的<script type="text/javascript"></script>塊中,併爲每個元素創建一個變量爲ClientID如何從外部JavaScript的ServerControl中訪問ClientID

例如:

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

現在我想將一個外部JavaScript添加到我的項目,並插入代碼出現。 但是我怎樣才能訪問ClientID?在外部JavaScript中,我不能使用<%= TextBox1.ClientID %>。我發現這個:referencing server controls in external file但我不明白,這應該如何工作。如果有人能夠解釋我的,如何訪問ID,那將是非常棒的。

順便說一句,爲什麼這個:

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

    function SetButtonStatus() {  
      alert($(ClientIDs.test1).value); 
     } 
</script> 

不起作用,會顯示沒有消息?

格爾茨

編輯1:

好吧,我可以只使用textBox1的在我的外部腳本? 我這樣做了,這是我* .ascx文件:

<script type="text/javascript"> 
    var ClientIDs = { 
     textBox1: '<%= textBox1.ClientID %>', 
     textBox2: '<%= textBox2.ClientID %>' 
    } 
</script> 

在我的外部腳本我有隻是一個函數來測試它:

function test() { 
alert($(ClientIDs.textBox1).val(); 
} 

我也"#" +進行了測試。每次測試()被執行,我獲得以下錯誤:

"document.getElementById(...)" is null or not an object 

編輯2: 我在警報錯過了)。但是現在我收到一條消息,說明這個變量沒有被定義。 如果我使用:$('#' + ClientIDs.SumbitSearch).val()我只是得到文本而不是我的控件的ID。

編輯3: 在我使用的那一刻:

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

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

在我的* .ascx文件,它的工作原理。我不喜歡這種方式......它不適用於外部JS,引用不起作用。如果有人有其他的想法,這將與.net 3.5一起工作,如果他讓我知道,這將是很好的。

+0

我會避免界定JS在你的ASCX文件瓦爾:頁面可以包括多個控件(或相同控件的多個實例)。如果每個控件定義了「var ClientIDs」,它們將會相互衝突(該死的JS全局命名空間!)。如果你只允許你的.ASPX文件定義JS var,至少你知道每頁只有一個。 – mikemanne

+0

其實我手工定義了JS var。我找到了一個小工具,它自動創建'ClientIDs' [鏈接](http://jagregory.com/writings/how-to-use-clientids-in-javascript-without-the-ugliness/)。但我無法從我的外部JS訪問該變量。格爾茨。 – hofmeister

+0

我不確定你的意思是「手工定義JS var」,以及如果同一個控件定義了相同的var,但是多次包含在頁面中,它將如何防止碰撞。 – mikemanne

回答

2

爲了解釋並簡化您要鏈接的問題,他們所做的只是從頁面/服務器控件中設置JavaScript變量,然後從外部JavaScript文件中讀取該變量。

例如,您的* .ascx文件將包含這個JavaScript:

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

然後,你的外部JavaScript文件可以直接引用該變量textBox1

現在,還有其他方法可以做到這一點。如果你使用ASP。NET 4,你可以使用一個新的屬性ClientIDMode來防止ASP.NET改變你的ID。如果您不使用ASP.NET 4,也可以簡單地向要選擇的元素添加CSS類,然後將jQuery選擇器更改爲使用類(稍微比使用ID稍慢)。

最後,你需要評估的一個元素ID jQuery選擇時要使用的#,所以這將工作:

alert($('#' + ClientIDs.test1).val()); 
+0

看到我的**編輯1:**。謝謝你的回答。Greetz。 – hofmeister

+0

更新了jQuery選擇器,我的是完全錯誤的。此外,該方法'val()'not'values '。 – wsanville

+0

Upvote for ClientIDMode - 我忘記了它,它解決了.JS/ClientID問題。當然,它增加了每個控件/頁面負責確保其元素的唯一命名的問題 – mikemanne

0

我從來沒有發現一個解決方案,我喜歡,但我實現了幾個變通不在完全可怕:

  • 對於JS代碼,必須引用特定的頁面元素,在.aspx文件中定義它,所以你必須<%訪問= btnFoo.ClientID%>。這些函數可以在你的.js文件中調用常用的重載函數。
  • 在.aspx文件中定義JavaScript變量以保存ClientID值。 .js文件中的函數可以引用這些變量來獲取客戶端ID。當然,這些函數只能在定義預期變量的頁面上正確工作。

也許其他SO'ers會有更優雅的解決方案來解決這個問題 - 我期待着看到其他的迴應。

+0

這是真的。我也沒有找到解決方案,這非常好。格爾茨。 – hofmeister

+1

如果在頁面上沒有多個用戶控件實例,最優雅的解決方案是在web.config文件的「」節點中設置clientIDMode =「Static」。這是在ASP.NET 4中引入的。 – wsanville

0

使用explicity全局參數。

window.clientId ='<%= TextBox1.ClientID%>';

這意味着你有gloabal變量「cilentId」。然後你可以在任何地方使用它。

+0

我的理解是,在JS中使用「var」關鍵字與將thing var應用於「window」對象(除了在函數範圍內專門定義的變量除外) 。也許我的理解是不正確的? – mikemanne

1

在ASP頁:

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

而在外部JavaScript訪問TextBox2這樣:

documnet.getelementByid(test2); 
相關問題