2010-03-26 47 views
0

這段代碼如何被重構爲使用jQuery?這段代碼如何被重構爲使用jQuery?

function emleProcessOnLoad(aThis) { 
    var result = document.evaluate("//span[@class='emleOnLoad']", 
    aThis.document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); 
    for (var jj=0; jj<result.snapshotLength; jj++){ 
    eval("var emleThis=result.snapshotItem(jj);" + result.snapshotItem(jj).textContent); 
    } 
} 

似乎有四個問題的jQuery解決:

  1. 語境:aThis.document
  2. 選擇://span[@class='emleOnLoad']
  3. 迭代:for (var jj=0; jj<result.snapshotLength; jj++)
  4. 值:.textContent

該代碼是從Emle - Electronic Mathematics Laboratory Equipment JavaScript文件emle_lab.js的片段。

.evaluate()函數抓取所有具有類emleOnLoad<span>標籤。所得到的文本內容包含一個表達式的片段,例如:

emleHandleInput(emleThis.parentNode.parentNode,"EMLE_CET_PROPER_FRACTION"); 

其被附加到:

var emleThis=result.snapshotItem(jj); 

,然後由.evaluate()函數找到的每個項目執行。

+0

Eval是邪惡的!使用eval時要特別小心,特別是如果源不可信。 – 2010-03-28 14:03:57

+0

目前的工作是用jQuery重構Emle,目前已經將LoC降低了30%。我已經將Eval-Is-Evil藍圖添加到Emle項目中:https://blueprints.launchpad.net/emle/+spec/eval-is-evil – 2010-03-29 03:00:16

+0

另一方面,如果source *是* trusted,那麼與eval沒有任何內在的錯誤。 – noah 2010-03-29 18:19:47

回答

1

主迴路可以簡化到這個

$("span.emleOnLoad").each(function() { 
    var content = $(this).text(); 
    // do something with content 
}); 

,但整體思路需要重新思考。在運行時將大塊的javascript存儲在跨度中並對它們進行評估 - 這非常奇怪。

+0

是的。 extremelu很奇怪,但他說了一些關於數學的東西,因此展示評估過的部分可能是一個特徵。危險的:) – naugtur 2010-03-26 10:12:34

+0

在這裏使用eval沒有任何優勢。不管它是否是「數學材料」都沒關係。 – noah 2010-03-29 18:32:43

+0

只需要添加上下文節點'aThis.document'。 – 2010-04-03 17:36:21

0

你不需要jQuery的這一點,但我想這個更換開關:

var lu = (function() { 
    var TYPES = { // call it whatever you want 
    'xhtml':'http://www.w3.org/1999/xhtml', 
    'math': 'http://www.w3.org/1998/Math/MathML', 
    'svg': 'http://www.w3.org/2000/svg' 
    }; 
    return function luf(aPrefix){ 
    return TYPES[aPrefix] || ''; 
    }; 
})(); 

首先,我創建一個匿名函數並調用它,這樣我可以聲明局部變量,否則TYPES會最終(可能)是全球範圍。然後,我創建一個對象(地圖/哈希),它可以像切換器一樣映射值。最後,創建另一個匿名函數,在TYPES中查找前綴,默認爲「'。

其餘的是相當混亂。