Как лучше всего создать функцию с динамическим кодом? [закрыто]Javascript

Форум по Javascript
Ответить
Anonymous
 Как лучше всего создать функцию с динамическим кодом? [закрыто]

Сообщение Anonymous »

Как создать и запустить функцию на основе имени функции из строки?
Мне нужно кое-что переделать, потому что мы меняем наш CSP, чтобы блокировать unsafe-inline и unsafe-eval. Сейчас я пытаюсь привязать функцию, имя которой я не узнаю до момента выполнения, к событию «щелчок».
Я обновляю модули TOF/EOF, которые другие разработчики вызывают для создания своих экранов. Исходному коду более 20 лет. Однако дни, когда можно было просто использовать eval(string), определенно подходят к середине.
Мне нужно сделать несколько таких привязок, и большинство из них подходят, но одна меня расстраивает. Приведенные ниже фрагменты кода должны легко выполняться. Конечно, вам нужно будет передать им строку, которая будет анализироваться доступной функцией.
Это работает.
Строка, с которой я начинаю, — «next_page(1)»

Код: Выделить всё

/*
*   Bind prior action click listener
*/
document.getElementById("priorAction").addEventListener('click',function() {
var cleanString  = /(.*)(\()(.*)(\))/;
var cleanMatcher = commandString.match(cleanString);
fn = cleanMatcher[1] ? cleanMatcher[1] : "console.log";
dn = cleanMatcher[3] ? cleanMatcher[3] : "String for prior action not understood: " + commandString;
window[fn](dn);
});
Это не работает
Я начинаю с строки _CF_checkbr([object NodeList])

Код: Выделить всё

document.getElementById("submit_link").addEventListener('click' ,function() {
var cleanString  = /(.*)(\()(.*)(\))/;
var cleanMatcher = commandString.match(cleanString);
fn = cleanMatcher[1] ? cleanMatcher[1] : "console.log";
dn = cleanMatcher[3] ? cleanMatcher[3] : "String for prior action not understood: " + commandString;
if (window[fn](dn) ) {
sendPage(thisForm);
}
});
Я получаю:

Код: Выделить всё

webskinFunctions.js:151 Uncaught TypeError: window[fn] is not a function at HTMLImageElement. (webskinFunctions.js:151:18)
Прямой вызов sendPage(thisForm) работает, а window['sendPage'](thisForm); нет, это также выдает мне Uncaught TypeError: window.sendPage не является функцией в HTMLImageElement. (webskinFunctions.js:150:35)
Я не понимаю почему в одном случае это работает, а в другом нет.

Код: Выделить всё

new Function(){}
не является вариантом из-за блокировки eval-unsafe.
Мои вопросы:
  • Что мне нужно здесь искать?
  • Я пропустил информацию, необходимую для ответа на этот вопрос?
  • Поскольку я пытаюсь обойти политику безопасности, что мне следует учитывать, чтобы не создать уязвимость?
РЕДАКТИРОВАНИЕ: обновление
_____________________

В конце концов, этот код работает. Проблема локальна для одного экрана и связана с тем, что экран генерирует javascript на лету, что в лучшем случае затрудняет правильное время выполнения сценария.
Сейчас я выполняю очистку кода и попросил человека, у которого есть экран, это исправить.
Строка, с которой я начинаю, — это _CF_checkbr([object NodeList])

Код: Выделить всё

document.getElementById("submit_link").addEventListener('click' ,function() {
var cleanS1String  = /(.*)(\()(.*)(\))/;
var cleanS1Matcher = commandString.match(cleanS1String);
fn = cleanS1Matcher[1] ? cleanMatcher[1] : "";
dn = cleanS1Matcher[3] ? cleanMatcher[3] : "";
if (window[fn](dn) ) {
sendPage(thisForm);
}
});
(Вопрос можно оставить закрытым. Не знаю, как удовлетворить запросы на редактирование. Вся запрашиваемая информация есть в посте, но возможно я не излагаю ее в понятном виде.)

Подробнее здесь: https://stackoverflow.com/questions/798 ... is-dynamic
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»