2016-02-05 6 views
0

Я пытаюсь заменить базовое диалоговое окно, которое появляется при использовании оповещения confirm на JS. (no jQuery)
В основном я пытаюсь запустить функцию, которая открывает всплывающее окно, передавая в качестве аргумента команду, которую я хочу запустить. Затем команда будет добавлена ​​как функция onClick к соответствующей кнопке.JS - настраиваемый диалог «подтвердить»

Вот пример Barebone, где команда может быть что-то вроде window.open('location') или function(par1,par2); function2(par1); или просто stuff.innerHTML = 'foo'

function confirm(command) { 
    openPopup(); 
    popup_button_close.onclick = function(){ closePopup(); }; 
    popup_button.onclick = function(){ command; closePopup(); }; 
} 

К сожалению, приведенный выше пример не работает, я думаю, потому что строка не интерпретируется как фактический код , и всплывающее окно закрывается без выполнения команды.

Что вы предложите в качестве наилучшего подхода к этому? Будет ли использоваться eval()?
Я на правильном пути, или я должен пересмотреть все это с помощью обратных вызовов?
Поскольку я понимаю, что с обратными вызовами мне нужно жестко запрограммировать каждый ответ на кнопку подтверждения, а не динамически передавать его, как я пытаюсь сделать здесь, и это не вариант.

+0

Я бы рекомендовал сделать 'command' функцию обратного вызова или добавить еще один параметр для обратного вызова. Если 'eval' является решением, что-то, вероятно, неверно. –

+0

Да, я тоже пришел к такому выводу, и на самом деле 'eval()' - это последнее решение, к которому я прибегу, если любой другой вариант не удастся. Во всяком случае, не превращает 'command' в функцию обратного вызова, делая ее фиксированной функцией, а не гибким решением, которое я пытаюсь достичь? – nxet

+0

Нельзя, вы можете передать анонимную функцию, когда вы ее вызываете, 'confirm (function() {/ * do stuff * /});'. –

ответ

0

В конце концов я понял, что вместо передачи строки мне пришлось передать var, содержащий функцию.
код теперь выглядит следующим образом и отлично работает:

var command = new Function(string); 
function confirm(command) { 
    openPopup(); 
    popup_button_close.onclick = function(){ closePopup(); }; 
    popup_button.onclick = function(){ command(); closePopup(); }; 
} 
0

Вы можете воспользоваться setTimeout() принимая строку как полное заявление:

function confirm(command) { // as a string "func(p1, p2, ...)" 
    openPopup(); 
    popup_button.onclick = function(){ 
     setTimeout(command, 10); 
    }; 
    closePopup(); 
} 

Таким образом, вы дополнительно выгода от снижения кода, так как ни при каких обстоятельствах привязка необходима для закрытия всплывающего окна.

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

  • Нет связанных вопросов^_^