2010-09-14 61 views
0

首先,我想說,雖然這是我第一次在這裏發佈,但這些板對我有很大的幫助。這就是說,我有一個關於AJAX和腳本的奇怪問題。使用AJAX注入JavaScript和HTML

你看,在我的web應用程序中,我使用了custome JS上下文菜單。現在,每個菜單都根據對象和對象是否存在實現了特定的功能。

E.x:如果我們有一個上層菜單的佔位符,但沒有上層菜單,上下文菜單將有一個選項是「添加菜單」。 但是說我們已經有上層菜單的上下文菜單將有不同的選項,如「編輯菜單」等...

到目前爲止好,但是,說我們有一個上層菜單的佔位符,沒有菜單,然後我們添加了菜單(仍然沒有刷新頁面)我需要生成一個新的上下文菜單並注入它的權利?所以我只是隨着剛建立的新菜單一起做。

所有代碼都進入SAME div,其中舊的上下文菜單腳本和上層菜單佔位符如此基本,它們被覆蓋。 現在菜單本身是HTML格式的,所以它覆蓋了當前的代碼,但是JS的行爲很奇怪,並且現在會顯示2個上下文菜單舊的和新的,即使我覆蓋它的代碼。

我需要一些如何擺脫舊的上下文菜單腳本而不刷新頁面。 任何想法?

P.S 所有,如果說有什麼區別的JS都dynamicaly產生的(我不認爲它。)

回答

1

不管別人怎麼說,不要用EVAL。這是邪惡的,如果在頁面上使用超過幾次,它會給你記憶力問題。

見我soluition這裏:trying to call js code that is passed back from ajax call

基本上,創建 「codeHolder」 瞧的ID一個div。您基本上想要將您的HTML和JS傳回給AJAX接收器(由分隔符分隔),在JS端解析它,顯示HTML並將JS代碼放入您的變量中。

//Somehow, get your HTML Code and JS Code into strings 
var javascriptCode="function test(){.....}"; 
var htmlCode="<html>....</html>"; 

//HTML ///////////////////////////////////////// 
    //Locate our HTML holder Div 
    var wndw=document.getElementById("display"); 

    //Update visible HTML 
    wndw.innerHTML = htmlCode; 

//Javascript /////////////////////////////////// 
    //Create a JSON Object to hold the new JS Code 
    var JSONCode=document.createElement("script"); 
    JSONCode.setAttribute("type","text/javascript"); 

    //Feed the JS Code string to the JSON Object 
    JSONCode.text=javascriptCode; 

    //Locate our code holder Div 
    var cell=document.getElementById("codeHolder"); 

    //Remove all previous JS Code 
    if (cell.hasChildNodes()) 
     while (cell.childNodes.length >= 1) 
      cell.removeChild(cell.firstChild); 

    //Add our new JS Code 
    cell.appendChild(JSONCode); 

//Test Call/////////////////////////////////////// 
test(); 

該代碼將替換您可能在那裏放置的所有以前的JS代碼與新的JS代碼字符串。

0

感謝您的回覆。

Dutchie - 這正是我所做的。現在的事情是HTML被正確覆蓋(我沒有使用append我覆蓋了整個div),是的JavaScript只是繼續緩存...

我試圖禁用瀏覽器緩存,仍然問題仍然存在,我得到每個項目多個上下文菜單我運行的AJAX功能越多...

Jan, 我的AJAX函數構建一個div標籤和腳本標籤,並將它們放入另一個容器div標籤中。

假設發生的事情是,每次AJAX運行時,容器div內的代碼都會被覆蓋,並且會得到更新的版本。 容器div內的div被覆蓋,但腳本標記以某種方式被緩存到內存中,現在每次jQuery函數調用上下文菜單,我都會獲得多個菜單...

我不認爲需要代碼,但我會在明天發佈它。

任何想法?

+0

嗯,這裏有個問題......你是不是把原始的JS代碼放在那個div中,每次調用AJAX時都覆蓋它?如果原始。 JS代碼位於JS文件中,而您只是複製該代碼而不是替換它,則會遇到問題。我會確保你的原始JS代碼被拉到正在被稱爲次要呼叫的方式。 IE ..加載頁面沒有菜單或JS,然後加載頁面加載。如果你得到這個工作,清爽應該也很好!我在我的一個網站上做同樣的事情。期待看到一些代碼。 – Dutchie432 2010-09-14 18:09:34

+0

查看http://www.alphacommunications.com/alphaquote/?c=5&s=ae3 - 每當您選擇新系統時,JS代碼都會導入並運行此過程以更改項目圖片和問題可見性。嘗試將問題#1改爲大於零或更改問題1a的值。所有這些JS在系統變更時都被引入。 – Dutchie432 2010-09-14 18:13:02

+0

mmm代碼將不會在回覆中爲我形成格式,這是註釋。 – 2010-09-15 06:21:38

1

好了一些腦袋後,我想通了.. (問題不是解決方案呢)這是ajax函數嗎?

$.ajax({ 
      type: "GET", 
      url: "../../../Tier1/EditZone/Generate.aspx?Item=contentholder&Script=true", 
      dataType: "html", 
      success: function (data) { 
       $('#CPH_Body_1_content_holder').html(data); 
      } 
     }); 

現在他們函數使用一個頁面的事件處理程序,該事件處理程序reutnrs數據爲隨後的Response.Write(答案),它只是打我,當你使用它的Response.Write發送代碼它已經經過編譯並在我們的例子Generate.aspx頁面運行。

所以腳本會運行,但不是在我打算運行的頁面中,因爲我不能覆蓋它......我多麼愚蠢。

我認爲不適當它會返回數據作爲一個實際的字符串,然後只有然後將代碼注入容器div。

生病讓你知道,如果這工作了。 歡呼和感謝這些論壇的建議搖滾。

+0

只是一個快速的評論,問題沒有解決。如果您將帶有ajax的字符串注入到現有的腳本標記中,腳本將不會運行。我的猜測是,在腳本標記被寫入後,它們被編譯在一個排序中,因此當它們在創建後注入代碼時代碼將不會運行.. 我打開提示:( – 2010-09-15 13:22:47