2008-12-04 90 views
4

這種情況聽起來很複雜,但並不是那麼糟糕。這段代碼末尾的javascript 好像是爲什麼在Postback之後複製innerHTML時插入了逗號?

編輯:這是運行在活動服務器上的頁面。第一個例子並沒有在開放和關閉之間交替,因爲我剔除了大量代碼,以便儘可能縮小范例的範圍。

http://69.64.80.239/tmp/borked2.aspx

有下面的客戶端代碼中列出兩種情況。第一種情況是當單擊圖像按鈕時發回,並且使用imagebutton的clientid作爲參數來添加對大javascript函數的調用。

第二種情況簡單地使用onClientClick,並且執行javascript而沒有回發。

這兩種方法都可以完成顯示和隱藏應該出現的文本框。但是,使用回發方法,每次來回時插入逗號 - 先是1,然後是3,然後是7,然後是15,然後是31.這種奇怪的行爲不會發生在案例#2中,這讓我相信這種情況下的javascript是健全的。

當回發發生時,'value =「,」'屬性出現在我的文本框中,之前沒有。越來越多的逗號適合新添加的屬性。

爲了有效地突出顯示問題,這種情況非常嚴重。最終,這導致detailsview我執行相同的副本上添加逗號,以提交每個表單值的開頭。

我完全難住了,所以我只是要發佈代碼以及我可以!任何想法,將不勝感激!

<h5>CASE 1: Using Serverside postback to insert Javascript into a Literal</h5> 
<table><tr><td> 

    <asp:ImageButton id="CollapseExpand" runat="server" ImageUrl="/images/plus.gif" src="/images/plus.gif" 
     AlternateText="Hide Tasks" Width="12" Height="12" onclick="CollapseExpand_Click" 
     /> 

    <div style="display:none"> 
    <asp:TextBox runat="server" ID="Textbox1"></asp:TextBox> 
    <asp:Button runat="server" ID="btnSubmit1" Text="Submit 1" /> 
    </div> 

    <asp:Literal runat="server" ID="ScriptAnchorTest"></asp:Literal>  

</td></tr></table> 

CASE 1代碼隱藏

protected void CollapseExpand_Click(object sender, ImageClickEventArgs e) 
{ 

    Literal l = (Literal)this.ScriptAnchorTest; 
    l.Text = "<script type=\"text/javascript\">Expand(document.getElementById('" + this.CollapseExpand.ClientID + "'));</script>"; 

} 


CASE 2:執行JavaScript客戶機側直接

<asp:ImageButton id="CollapseExpand2" runat="server" src="/images/plus.gif" 
     AlternateText="Hide Tasks" Width="12" Height="12" onClientClick="Expand(this); return false;" 
     /> 

    <div style="display:none"> 
    <asp:TextBox runat="server" ID="TextBox2"></asp:TextBox> 
    <asp:Button runat="server" ID="btnSubmit2" Text="Submit 2" /> 
    </div> 

</td></tr></table>  

// Javascript函數 函數展開(圖像,索引){ //獲取圖像的源代碼 var src = image.getAttribute(「src」);

// if src is currently "plus.", then toggle it to "minus.png"  
    if (src.indexOf("plus") > 0) { 

     // toggle the image 
     image.src = image.src.replace("plus", "minus"); 

     var tr = image.parentNode.parentNode; 
     // Get a reference to the next row from where the image is 
     var next_tr = tr.nextSibling; 

     // Get a refernece to the <tbody> tag of the grid 
     var tbody = tr.parentNode; 

     // Get a reference to the image's column 
     var td = image.parentNode; 
     var detailnode 

     //loop through the content of the image's column. if hidden div is found, get a reference 
     for (var j = 0; j < td.childNodes.length; j++) { 
      if (td.childNodes[j].nodeType == 1) { 
       if (td.childNodes[j].nodeName.toLowerCase() == 'div') { 
        detailnode = td.childNodes[j].cloneNode(true); 
       } 
      } 
     } 

     // Create a new table row for "Expand" 
     var newtr = document.createElement('tr'); 
     var newtd = document.createElement('td'); 
     var newfirsttd = newtd.cloneNode(true); 

     /* insert an empty cell first */ 
     newtr.appendChild(newfirsttd); 
     newtd.colSpan = 8; 

     // insert the hidden div's content into the new row 
     newtd.innerHTML = detailnode.innerHTML; 


     newtr.appendChild(newtd); 
     tbody.insertBefore(newtr, next_tr); 

     tr.className = "selected"; 
    } 


    else { 
     image.src = src.replace("minus", "plus"); 
     var row = image.parentNode.parentNode; 
     var rowsibling = row.nextSibling; 
     var rowparent = row.parentNode; 
     rowparent.removeChild(rowsibling); 
    } 
+0

是否有可能將網站或網頁放在網頁上,我們可以在網頁上看到它的實際使用情況。很難全面瞭解你想從郵件中完成的任務。 – 2008-12-05 05:15:14

+0

已張貼頁面。請參閱我編輯的鏈接。 – 2008-12-05 06:12:29

回答

5

我沒有時間來閱讀你的整個代碼,但請注意以下事項:您可能會被複制HTML塊,並在代碼中創建它的克隆。這樣,你實際上得到兩個具有相同ID的文本框,儘管你只能看到其中的一個。在回發時,瀏覽器將這些值連接成逗號分隔列表。例如,如果分別在文本框中輸入「Test1」和「Test2」,然後提交,則兩個文本框的值都加倍。現在,如果您只展開其中一個(第一個,我們假設),然後提交,只有展開後的展開次數再次翻倍,而未展開的展開次數在回發時保持不變。

對於一個解決方案,如果您只需要顯示或隱藏div,最好的方法是從javascript,客戶端,通過更改該div的樣式(可見性),而不是克隆它。這樣,你的功能可以減少到一行代碼。

4

的Sergiu是正確的,要創建具有相同ID「Textbox1的」兩個HTML輸入你可以在使用螢火蟲

Stackoverflow Answer

這結束了串聯由分開的兩個值中捕獲的截圖中看到逗號。