Хорошо, так - с чего начать? :) Вот частичная функция для начала, она вам понадобится (сейчас и в будущем, если вы тратите много времени на взлом JavaScript):
function partial(func /*, 0..n args */) {
var args = Array.prototype.slice.call(arguments, 1);
return function() {
var allArguments = args.concat(Array.prototype.slice.call(arguments));
return func.apply(this, allArguments);
};
}
Я вижу много вещей в вашем коде, которые заставляют меня съеживаться, но, поскольку у меня нет времени, чтобы действительно его критиковать, а вы не просили об этом, я предложу следующее, если вы хотите избавиться от себя. о хаке, которым вы сейчас пользуетесь, и о нескольких других вещах:
Функция setDynamicSelectElements ()
В этой функции вы можете изменить эту строку:
onclick = function() { selectList(ySelectArgs[0], ySelectArgs[1], ySelectArgs[2]) }
К этому:
onclick = function() { selectList.apply(null, ySelectArgs); }
Функция selectList ()
В этой функции вы можете избавиться от этого кода там, где вы используете eval - никогда не используйте eval, если у вас нет веских причин для этого, это очень рискованно (прочитайте об этом):
if (fnFollowing) {
fnFollowing = eval(fnFollowing)
configureSelectList.clickEvent = fnFollowing
}
И используйте это вместо:
if(fnFollowing) {
fnFollowing = window[fnFollowing]; //this will find the function in the global scope
}
Затем измените эту строку:
var oDiv = setDiv(sListName, sQuery, 'dynamicSelect', configureSelectList);
На это:
var oDiv = setDiv(sListName, sQuery, 'dynamicSelect', partial(configureSelectListAlternate, fnFollowing));
Теперь, в этом коде, который я предоставил, у меня есть «configureSelectListAlternate» - это функция, которая аналогична «configureSelectList», но имеет параметры в обратном порядке - если вы можете изменить порядок параметров на «configureSelectList» вместо этого сделайте это, иначе вот моя версия:
function configureSelectListAlternate(fnOnClick, oDiv) {
configureSelectList(oDiv, fnOnClick);
}
Функция configureSelectList ()
В этой функции вы можете исключить эту строку:
if(!fnOnClick) fnOnClick=configureSelectList.clickEvent
Это больше не нужно. Теперь я вижу то, чего не понимаю:
if (!oDiv) oDiv = configureSelectList.Container;
Я не видел, чтобы вы зацепили это свойство контейнера ни в каком другом коде. Если вам не нужна эта линия, вы сможете избавиться от нее.
Функция setDiv () может оставаться прежней.
Не слишком захватывающе, но вы поняли - ваш код действительно может использовать некоторую очистку - вы избегаете использования библиотеки, такой как jQuery или MochiKit по уважительной причине? Это сделало бы вашу жизнь намного проще ...