2010-08-12 8 views
5

Предположим, я имел следующие функции:Как можно динамически изменить строку функции JavaScript?

function alertMesg() 
{ 
    alert("This ok function alerts message!"); 
} 

Теперь во время выполнения Я хотел бы изменить функцию alertMesg, чтобы сделать что-то еще. Моя мысль заключалась в том, чтобы сделать что-то вроде этого.

var temp = window.alertMesg.toString.replace("ok","great") 
temp = temp.replace('function alertMesg()',""); 
window.alertMesg = new Function(temp); 

В основном проблема заключается в том, что я не могу контролировать источник в функции alertMesg. Я хотел бы изменить функцию, но я не могу ее изменить, потому что она создается на стороне сервера. При этом мне нужно, чтобы он действовал по-разному.

PS: Я забыл упомянуть важную часть: мне нужно сохранить большую часть функции. Я не могу просто заменить функцию правильно. Я должен сохранить 95% функции так, как она есть, и изменить остальные пять процентов.

@Barlow Tucker, quixoto, pekka Спасибо, за интерес.

В принципе, я не думаю, что идея прокси-сервера будет работать, потому что я не просто добавляю функциональность, я меняю функциональность кода. Например, я хочу, чтобы третья строка функции отличалась. В моем реальном примере жизни я должен добавить строку прямо в середине функции.

+0

Возможный дубликат [JavaScript: Переопределение предупреждения()] (http://stackoverflow.com/questions/1729501/javascript-overriding-alert) –

+1

Этот дубликат должен ответить на него (см. Принятый ответ с «прокси-шаблоном», , замените 'window.alert()' вашей функцией). –

+0

Прокси может позволить мне добавить функциональность к этой функции, но это не позволяет мне удалить функциональность. –

ответ

5

Если вы должны заменить содержимое функции, можно:

function alertMesg() 
{ 
    alert ("This ok function alerts my message!"); 
} 

alertMesg(); // alerts "This ok function alerts my message!" 

// do whatever you want to the function here 
var temp = alertMesg.toString(); 
temp = temp.replace('my', 'your'); 

// now replace the original function 
alertMesg=new Function(temp.substring(temp.indexOf('{')+1,temp.lastIndexOf('}'))); 

alertMesg(); // alerts "This ok function alerts your message!" 

Это, вероятно, не самый лучший способ, чтобы сделать то, что вы пытаетесь достичь, но я не могу действительно предлагайте что-нибудь еще, если вы не предоставите более подробную информацию.

+0

Я последовал сначала, но ты потерял меня на экзамене. Просто вызов eval на temp волшебным образом меняет alertMesg? Я попробовал ваш источник в IE и получил ошибку JavaScript. –

+0

Хм ... если ваша функция определена как alertMesg = function(), тогда вам, возможно, придется использовать 'alertMesg = eval ('(' + temp + ')'); вместо этого. –

+0

Теперь я получаю ожидаемую ошибку объекта в последнем вызове alertMesg(). –

4

Замена динамического кода, как вы предлагаете, может работать в некоторых случаях, но это страшная дорога, которая идет вниз - хрупкая, одна неправильная ступенька, и вы разорены, и это быстро становится кошмаром для обслуживания.

Как комментатор сказал, ваш очиститель ставки является просто обернуть родную window.alert, а затем сделать правильную вещь, когда строка, которую вы заботитесь о проступает, в ответ здесь: JavaScript: Overriding alert()

(Вставьте стандартный комментарий здесь о том, как вы должны набирать своих пользователей на той же странице/команде, что и вы, поэтому вам не нужно взламывать вашу собственную страницу.)

ОБНОВЛЕНИЕ: вы не спрашиваете о предупреждении, вы спрашивая об этой проблеме в целом. Да, вы могли бы предложить другие. Но если у вас есть исходный код для функции, почему бы просто не заменить ее полностью? Если функция, которую вы хотите, это глобальная функция называется foo(), вы можете запустить JS, что делает:

window.foo = function() { 
    // The stuff I know is there (A) 
    ... 
    // Some new stuff I want to change (B) 
    ... 
    // More stuff I know is there (C) 
} 

Что будет выбросить оригинал и заменить его с вашей версией. Это будет работать достаточно хорошо, хотя «обезглавливание» материала на странице, безусловно, сопровождается некоторыми головными болями обслуживания.

Обязательно обратите внимание на то, что если вы не можете сделать это по какой-либо причине и, таким образом, настаиваете на выполнении замены текстового кода в середине существующих функций, вы злоупотребляете языком/средой в целях сопровождения ничего, и вы действительно ввернуты несколькими способами.

+0

Предположим, что исходная функция имеет часть a, часть b и часть c. Я хочу, чтобы новая функция имела часть a, часть b, новую часть, а затем часть c. При перезаписи я могу только иметь новую функцию как новую часть, часть a, часть b, часть c, или как часть a, часть b, часть c, а затем новую часть. Если я не понимаю, новая часть, которую я добавляю, не может быть в середине функции с вашей идеей. –

+0

Мне нужно добавить код в середину функции, а не начало или конец. Однако, спасибо, за попытку. –

+0

Функция JavaScript, которую я должен модифицировать, динамически создается JSF на стороне сервера и отличается на каждой странице. Мне действительно нужно решение, которое позволяет мне изменять существующую функцию, потому что я действительно не знаю, что будет в функции раньше времени. Он в основном следует шаблону, и я знаю, что мне нужно менять каждый раз, но я не знаю, все вещи в функции впереди области, которую я хочу изменить. Я действительно думаю, что смогу догадаться обо всем этом, если это поможет. –

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