Чтобы понять это функция на странице HTML и генерируется, я не могу изменить сгенерированный код:Как динамически изменять содержимое функции с помощью JavaScript
function Update_qu7260() {
var newVal = ''
for(var idx = 0; idx < 2; idx++)
{
var test
if(idx == 0) test = text7263
else if(idx == 1) test = text7265
if(test.matchObj) newVal += test.leftSel + "-" + test.matchObj.rightSel + ","
}
newVal = newVal.substring(0, newVal.length-1)
VarQuestion_0001.set(newVal)
qu7260.hasBeenProcessed=false;
doImmFeedback('qu7260');
}
var qu7260 = new Object();
...
qu7260.updFunc = Update_qu7260;
var qObj=[qu7260];
Примечание в указанном выше количестве «7260», цифры начинаются с 1, поэтому их много, и каждый Update_###()
будет отличаться, поэтому я не могу переписать их с помощью «жесткого» кода. Мой код находится во внешнем файле JavaScript и выполнен OnLoad:
...
var updFunc = qObj[0].updFunc.toString();
if(updFunc.indexOf('doImmFeedback(')!=-1){
updFunc = updFunc.replace('doImmFeedback','doImmQuestionFeedback'); // do my function
updFunc = updFunc.replace('function ',''); // remove the word function
var funcName = updFunc.substr(0,updFunc.indexOf('(')); // get the function name e.g. Update_qu7260
updFunc = "window['" + funcName + "']=function" + updFunc.replace(funcName,'');
eval(updFunc);
}
...
Когда я изменяю Eval() для предупреждения() я могу видеть, что это правильно, однако, Eval() не ставит каких-либо ошибок и моя функция doImmQuestionFeedback
не вызывается. Когда я потом делаю alert(qObj[0].updFunc.toString())
, я вижу оригинальную функцию.
Казалось бы, что я предоставил информацию, которая является слишком сложным, поэтому следующий код лучший пример:
function hi(){alert('hi');}
function changeHi(){
hi(); // I get an alert box with hi
newHi = "function hi(){alert('hi there');}"
eval(newHi);
hi(); // I get an alert box with hi
window.setTimeout('hi()',500); // I get an alert box with hi
}
window.setTimeout('changeHi()',500);
Ниже приводится оригинальный вопрос:
У меня есть предопределенная функция, которую я не создал, однако, я знаю, что это имя, поэтому я могу получить эту функцию, а затем меняю ее:
var funcText = window.updateFunc.toString();
funcText = funcText.replace('doSomeOtherFunction(','doMyFunction(');
Как обновить фактическую функцию, чтобы она делала все, что она делала раньше, за исключением того, что она теперь вызывает doMyFuntion()?
Ниже приведен пример, который поможет визуализировать то, что я хочу сделать, фактическая функция, которую мне нужно изменить, очень сложна. У меня есть:
function updateFunc(whatToUpdate,true){
... - do lots of stuff.
var retVal = doSomeOtherFunction(whatToUdate);
... - do lots of stuff based on retVal
}
Мне нужно изменить это:
function updateFunc(whatToUpdate,true){
... - do lots of stuff
var retVal = doMyFunction(whatToUdate);
... - do lots of stuff based on retVal, I have had a chance to change retVal
}
Тогда первое, что моя функция будет делать это вызов doSomeOtherFunction() проверить/изменить возвращаемое значение, а затем возвращает значение в updateFunc().
Я пытался манипулировать funcText выше:
funcText = 'window.updateFunc = function(...';
eval(funcText);
без успеха.
Я нашел проблему, все мои вина, извините за это. Обратите внимание на строку 'qu7260.updFunc = Update_qu7260;', как только я сменил функцию, мне нужно снова вернуть ее обратно в объект, я думал, что это всего лишь указатель, но это была сама функция, и это запускается в другом месте через 'this .updFunc() '. – Peter