單一頁面中,JavaScript 透過 document.getElementById("txt") 存取 <textarea id="txt" runat="server"> 運作正常。套用母版頁後,同樣程式碼卻拋出 'document.getElementById(...) 為空或不是物件' 錯誤。
母版頁面與內容頁面皆為 INamingContainer,導致伺服器控制項渲染時 ID 加上命名容器前綴。原本 id="txt" 變為 id="ctl00_ContentPlaceHolder1_txt"(視層級而定),JavaScript 硬編碼 "txt" 自然找不到元素。
ClientIDMode="Static" 保持 ID 不變(需 .NET 4.0 以上)。<%= txt.ClientID %> 動態產生正確 ID。
function insert() {
document.getElementById('<%= txt.ClientID %>').value += '(__)';
}
$('[id$=txt]') 或 CSS Class 定位,不依賴完整 ID。data-* 屬性或 Class 當選取鉤子。<%= Control.ClientID %> 模式。getId(serverId) 統一處理命名容器邏輯。