2010-03-26 25 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中查找前缀,默认为“'。

其余的是相当混乱。