2010-03-26 4 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() захватывает все теги <span>, которые имеют класс emleOnLoad. В результате чего содержание текст содержит фрагмент экспрессии, такие как:

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

, который прилагается к:

var emleThis=result.snapshotItem(jj); 

, а затем выполняется для каждого найденного элемента с помощью функции .evaluate().

+0

Eval is Evil! Будьте очень осторожны при использовании eval, особенно если ваш источник не заслуживает доверия. –

+0

Нынешнее усилие состоит в том, чтобы реорганизовать Emle с помощью jQuery, который в этот момент уменьшил LoC на 30%. Я добавил проект Eval-Is-Evil в проект Emle: https://blueprints.launchpad.net/emle/+spec/eval-is-evil –

+0

С другой стороны, если источник * * доверен, есть ничто изначально не ошибочно с eval. – noah

ответ

1

Основной цикл может быть упрощена до этого

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

, но в целом идея нуждается в переосмыслении. Храните куски javascript в прогонах и оценивайте их во время выполнения - это довольно странно.

+0

Yup. экстремистский странный, но он сказал что-то о том, что это математический материал, поэтому показать оцениваемую часть возможно. Опасный :) – naugtur

+0

Здесь нет преимущества использования eval. Не имеет значения, является ли это «математическим материалом». – noah

+0

Просто нужно добавить контекстный узел 'aThis.document'. –

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 заканчиваются (предположительно) глобальным охватом. Затем я создаю объект (map/hash), который отображает значения точно так же, как ваш коммутатор. Наконец, создайте еще одну анонимную функцию, которая выглядит в префиксе в TYPES и по умолчанию используется значение ''.

Остальное довольно перепуталось.

Смежные вопросы