2011-12-12 25 views
0

我有一個文件,「script.php」,打印數據庫中的數據,但我想動態加載和處理JavaScript中的文件中的數據。 它是最快的創建一個新的腳本(以下簡稱「script.php的」擁有的內容類型:文本/ JavaScript的),在JavaScript數組,像哪個最快? xhr與XML或動態添加腳本文件?

var script = document.createElement('script'); 
script.src = "script.php"; 
appendTheScriptToTheHead(blablabla); 

與數據或收到的XML數據(「script.php」的內容類型爲:text/xml)

var xhr = new XMLHttpRequest(); 
xhr.open("POST","script.php",true); 
xhr.onload = function(){ 
    xhr.responseXML; 
} 
xhr.send(null); 

感謝

+2

爲什麼地獄script.php有內容類型文本/ JavaScript? – Raynos

+0

轉到XHR方式,你有更好的基於事件的系統,並告訴你它是否失敗,但是沒有辦法通過腳本標籤方式檢查上述內容。它也允許你以更好的方式處理輸出,然後腳本標記! – ShrekOverflow

+1

@Raynos很好的問題,這就是我想知道的,也許他只是發送一個JSON對象,如說 內容= {「x」:「等等」}; – ShrekOverflow

回答

0

你可能想通過Ajax和JSON格式不如送你的數據庫的結果,這樣他們就可以通過服務器端的一些JavaScript函數來容易處理。

這個選項讓你在你的代碼中有一個回退部分,以防發生錯誤。

0

由於您需要使用DOM解析器來讀取XML,所以XML在JavaScript中消耗總是很慢,因此在使用JavaScript時JSON總是優先考慮。

Off topic: 當您的數據提供給動態腳本標記時,您應該注意安全風險,因爲您的站點可能會受到某些XSRF攻擊,因爲您在使用XHR時忽略了相同的源策略。

避免添加一段時間(1);在響應的頂部,如果不可能使用來自某個惡意站點的腳本標記來使用您的數據。在使用數據之前,這當然必須刪除。

祝你好運:)

2

- 更新---優化的代碼---

我做了一個小的基準,這裏的結果

1000次迭代,

XML對象花費了4270ms

一個簡單的腳本標籤添加了4169ms;

使用Eval函數的一個強大的XHR給了3206ms; //最快

此處參考的是客戶端和服務器端腳本。

腳本2.PHP

<?php 

echo trim(' 
var dunce = { 
    menu : { 
     id:1, 
     gohan:"goku blah blah blah" 
    } 

}; 

console.log(dunce.menu.id); // yeah its still faster 

iteration++; 
if(iteration<1000){ 
ScriptTAG(); 
}else{ 
      console.log("Total time taken for "+iteration+"iterations is "+ (new 
           Date().getTime()-start)); 
}'); 


?> 

的script.php [XML輸出]

<?php 
    header ("Content-Type:text/xml"); 
    echo"<menu><id>1</id><gohan>Goku blah blah blah</gohan></menu>"; 
?> 

客戶端文件

var iteration = 0; 
     // Use XHR 
     var start ; 
     // Use console for firing these 
     function XHR() { 
      if(iteration == 0) { 
       start = new Date().getTime(); 
      } 
      var io = new XMLHttpRequest(); 
      io.open("POST",'script.php',true); 
      io.onload = function() { 
       iteration++; 
       if(iteration<1000) { 
        XHR(); 
       } else { 
        alert("Total time taken for "+iteration+"iterations is "+ (new Date().getTime()-start)); 
       } 
      } 
      io.send(); 
     } 
      function AlterXHR(){ 
      // EVAL IDEA 

      if(iteration == 0){ 
       start = new Date().getTime(); 
      } 
      var io = new XMLHttpRequest(); 
      io.open("POST",'script2.php',true); 
      io.onload = function(){ 
       eval(io.responseText); 
      } 
      io.send(); 
      } 
     function ScriptTAG() { 
      if(iteration == 0) { 
       start = new Date().getTime(); 
      } 
      var script = document.createElement('script'); 
      script.src = "script2.php"; 
      document.head.appendChild(script); 
     } 

     ScriptTAG(); // Replace this with whatever u want to test! and run!! 

我認爲這裏的差異是因爲本地JavaScript的純粹對象通過XML Parser進行更快的編譯。

正如你可以看到與NATIVE EVAL功能相同的腳本工作方式更快!

+0

Eval非常迅速!! – ShrekOverflow

+0

但eval是邪惡的 – ShrekOverflow