将javascript传递给javascript函数

将javascript传递给javascript函数,javascript,jquery,Javascript,Jquery,我想在用户按下其中一个按钮时传递一些javascript要执行的函数,但当前当我按下对话框上的“否”或“是”按钮时,什么都没有发生,它就在那里……firebug中没有显示错误。如果我将“alert('hi')”硬编码到对话框按钮中,它就可以正常工作,因此在传递javascript作为函数参数的一部分时一定有一些东西 我怎样才能让它工作?提前谢谢 下面是我的javascript函数: function confirm_yes_no(xtitle,msg, btn_yes_txt, btn_no_t

我想在用户按下其中一个按钮时传递一些javascript要执行的函数,但当前当我按下对话框上的“否”或“是”按钮时,什么都没有发生,它就在那里……firebug中没有显示错误。如果我将“alert('hi')”硬编码到对话框按钮中,它就可以正常工作,因此在传递javascript作为函数参数的一部分时一定有一些东西

我怎样才能让它工作?提前谢谢

下面是我的javascript函数:

function confirm_yes_no(xtitle,msg, btn_yes_txt, btn_no_txt, btn_yes_js, btn_no_js)
{
    var button_yes = btn_yes_txt;
    var button_no = btn_no_txt;
    var dialog_buttons = {};

    dialog_buttons[button_yes] = function(){ btn_yes_js }
    dialog_buttons[button_no] = function(){ btn_no_js }

    $("#modal_confirm_yes_no").html(msg);
    $("#modal_confirm_yes_no").dialog({
                title: xtitle,
                bgiframe: true,
                autoOpen: false,
                height: 150,
                width: 300,
                modal: true,
                buttons: dialog_buttons
            });

    $("#modal_confirm_yes_no").dialog("open");
}
confirm_yes_no("Print Checks", "Would you like to print checks now?", "Yes", "No", "alert('you clicked yes');", "alert('you clicked no');");
dialog_buttons[button_yes]();
dialog_buttons[button_no]();
btn_yes_js();
btn_no_js();
下面是我如何调用函数的:

function confirm_yes_no(xtitle,msg, btn_yes_txt, btn_no_txt, btn_yes_js, btn_no_js)
{
    var button_yes = btn_yes_txt;
    var button_no = btn_no_txt;
    var dialog_buttons = {};

    dialog_buttons[button_yes] = function(){ btn_yes_js }
    dialog_buttons[button_no] = function(){ btn_no_js }

    $("#modal_confirm_yes_no").html(msg);
    $("#modal_confirm_yes_no").dialog({
                title: xtitle,
                bgiframe: true,
                autoOpen: false,
                height: 150,
                width: 300,
                modal: true,
                buttons: dialog_buttons
            });

    $("#modal_confirm_yes_no").dialog("open");
}
confirm_yes_no("Print Checks", "Would you like to print checks now?", "Yes", "No", "alert('you clicked yes');", "alert('you clicked no');");
dialog_buttons[button_yes]();
dialog_buttons[button_no]();
btn_yes_js();
btn_no_js();

如果
btn\u yes\u js
是对Javascript函数的引用,只需执行以下操作:

dialog_buttons[button_yes] = btn_yes_js;
同样对于
btn\u no\u js

如果你说的是
btn\u yes\u js
是一个包含js函数源的字符串,那么你似乎是-不要这样做

您的呼叫应该如下所示:

confirm_yes_no("Print Checks", "Would you like to print checks now?", "Yes", "No",
    function() {
       alert('you clicked yes');
    },
    function() {
       alert('you clicked no');
    }
);
i、 e.传入对函数的引用(本例中为匿名函数),而不是必须传递给讨厌的、可怕的、永远不会在《死亡之痛》中使用的字符串
eval()
函数

我还要指出,您的代码最终将需要更多的工作,因为当您注册回调处理程序时,它们实际上都不会关闭或破坏对话框

实际上,您需要更多类似于:

dialog_buttons[button_yes] = function() {
    $('#modal_confirm_yes_no').dialog('close').dialog('destroy');
    btn_yes_js.call(ctx);
}

i、 e.一个本地函数,它干净地关闭对话框,然后调用相关的回调函数。您可能希望在回调中添加自己的
ctx
变量,该变量将成为
this
的值。

我认为您最好在被调用函数中添加警报,并将要在警报中输出的消息传递给函数。

您可以为最后两个参数传递实际函数

function handleNo() {
   alert('you clicked no');
}

function handleYes() {
   alert('you clicked yes');
}

confirm_yes_no(
  "Print Checks", 
  "Would you like to print checks now?", 
  "Yes", 
  "No", 
  handleYes, 
  handleNo);
function confirm_yes_no(xtitle,msg, btn_yes_txt, btn_no_txt, yesCallBack, noCallBack)
{
    var button_yes = btn_yes_txt;
    var button_no = btn_no_txt;
    var dialog_buttons = {};

    dialog_buttons[button_yes] = yesCallBack;
    dialog_buttons[button_no] = noCallBack;

    $("#modal_confirm_yes_no").html(msg);
    $("#modal_confirm_yes_no").dialog({
                title: xtitle,
                bgiframe: true,
                autoOpen: false,
                height: 150,
                width: 300,
                modal: true,
                buttons: dialog_buttons
            });

    $("#modal_confirm_yes_no").dialog("open");
}
然后在主函数中更改这两行

dialog_buttons[button_yes] = btn_yes_js;
dialog_buttons[button_no] = btn_no_js;

将它们作为函数传递

function confirm_yes_no(xtitle,msg, btn_yes_txt, btn_no_txt, btn_yes_js, btn_no_js)
{
    var button_yes = btn_yes_txt;
    var button_no = btn_no_txt;
    var dialog_buttons = {};

    dialog_buttons[button_yes] = btn_yes_js
    dialog_buttons[button_no] = btn_no_js

    $("#modal_confirm_yes_no").html(msg);
    $("#modal_confirm_yes_no").dialog({
                title: xtitle,
                bgiframe: true,
                autoOpen: false,
                height: 150,
                width: 300,
                modal: true,
                buttons: dialog_buttons
            });

    $("#modal_confirm_yes_no").dialog("open");
}
请致电:

confirm_yes_no("Print Checks", "Would you like to print checks now?", "Yes", "No", function() { alert('you clicked yes'); }, function() { alert('you clicked no'); } );

只使用内置的ok/cancel提示符会简单得多:

if (window.confirm("Would you like to print checks now?"))  {
    alert("You clicked yes");
} else {
    alert("You clicked no");
}

您不应该接受JS字符串,而应该只接受回调

function confirm_yes_no(xtitle,msg, btn_yes_txt, btn_no_txt, yesCallBack, noCallBack)
{
    var button_yes = btn_yes_txt;
    var button_no = btn_no_txt;
    var dialog_buttons = {};

    dialog_buttons[button_yes] = yesCallBack;
    dialog_buttons[button_no] = noCallBack;

    $("#modal_confirm_yes_no").html(msg);
    $("#modal_confirm_yes_no").dialog({
                title: xtitle,
                bgiframe: true,
                autoOpen: false,
                height: 150,
                width: 300,
                modal: true,
                buttons: dialog_buttons
            });

    $("#modal_confirm_yes_no").dialog("open");
}
那么你可以这样称呼它

confirm_yes_no("Print Checks", 
    "Would you like to print checks now?", "Yes", "No", 
    function() {alert('you clicked yes');}, 
    function() {alert('you clicked no');}
);
改为

dialog_buttons[button_yes] = btn_yes_js;
dialog_buttons[button_no] = btn_no_js;
并直接发送函数

confirm_yes_no("Print Checks", "Would you like to print checks now?", "Yes", "No",
    function() {
        alert('you clicked yes');
    },
    function() {
        alert('you clicked no');
    });
您可以通过调用函数来执行它:

function confirm_yes_no(xtitle,msg, btn_yes_txt, btn_no_txt, btn_yes_js, btn_no_js)
{
    var button_yes = btn_yes_txt;
    var button_no = btn_no_txt;
    var dialog_buttons = {};

    dialog_buttons[button_yes] = function(){ btn_yes_js }
    dialog_buttons[button_no] = function(){ btn_no_js }

    $("#modal_confirm_yes_no").html(msg);
    $("#modal_confirm_yes_no").dialog({
                title: xtitle,
                bgiframe: true,
                autoOpen: false,
                height: 150,
                width: 300,
                modal: true,
                buttons: dialog_buttons
            });

    $("#modal_confirm_yes_no").dialog("open");
}
confirm_yes_no("Print Checks", "Would you like to print checks now?", "Yes", "No", "alert('you clicked yes');", "alert('you clicked no');");
dialog_buttons[button_yes]();
dialog_buttons[button_no]();
btn_yes_js();
btn_no_js();

OP并没有回答真正的问题,而是想知道如何指定发生事件时要运行的代码。您可以根据按下哪个按钮来运行代码。这是一个模式拨号,询问一个问题,有两个按钮,与OP提出的相同,这似乎是要解决的问题的重点。就按钮名称而言,这种方法的灵活性稍差一些,但我提出了它,因为它非常简单,如果您对按钮名称的OK/cancel满意的话,它可以用更少的代码完成相同的工作。有时人们不知道更简单的选项。不解决实际问题的建议最好作为注释而不是答案,显示为按钮的文本的灵活性显然是要求的一部分,因为函数将标签作为参数。@jfriend00
window.confirm()的另一个问题
是因为它完全阻止了事件队列,从而阻止了其他任何事情的处理(例如计时器任务)。请更正它是否阻止。我认为这就是用户流的意图(变量被命名为“modal”)。应考虑更简单且解决相同问题的替代建议。我对OP选择其他东西没意见,只是觉得这是值得的,因为它太简单了。不能将有用的代码示例放在注释中。我认为你的观点已经提出,现在也有其他解决办法。OP可以决定他们喜欢什么。我已经上了这么一个星期了,学习我的方法-试图帮助你。@Alnitak-如果你要求回调在不同的情况下是不同的,那么就对了。查看您的警报示例,我认为这是一条简单的消息。@Ronedog我更新了小提琴,以包含最后两段,显示如何关闭对话框,然后调用回调。