【问题标题】:Passing function to function on page load在页面加载时将函数传递给函数
【发布时间】:2014-07-11 18:08:09
【问题描述】:

假设我们有一个 javascript 函数,该函数设置为在单击屏幕上的删除按钮时运行...

function deleteThis(obj) {
     /*work to delete object*/

     window.location="newurl.php";
}

$('.delete').click(function(){
    deleteThis($(this));
});
<div class='delete'>Delete</div>   

现在假设您想要不同类型的删除按钮。他们都做同样的前几件事,但最后一步是不同的。我一直在做的是这个……

function deleteThis(obj) {
     /*standard work to delete object*/

     if (obj.attr('type')=='a') {
        //extra work for type a
     } else if (obj.attr('type')=='b') {
        //extra work for type b
     }

     window.location="newurl.php";

}
$('.delete').click(function(){
    deleteThis($(this));
});

<div class='delete' type='a'>Delete</div>

仅适用于几种不同的类型。但它开始有点失控了。我想要的是能够做到这一点......

在我的主 javascript.js 文件中:

function deleteThis(obj) {
     /*standard work to delete object*/

     /*do any extra functions that have been designated for this type*/

     window.location="newurl.php";

}
$('.delete').click(function(){
    deleteThis($(this));
});

代码仅包含在有“type a”按钮的页面上

$(document).ready(function(){
      /*something that tells the deleteThis() function that it should do something extra when running*/
});

这样我就不必将任何额外的变量传递给 deleteThis(),我不必为不同类型的删除按钮创建不同的 onclick 事件。我可以只有一种类型的删除按钮。然后在我希望删除按钮表现不同的页面上,我所要做的就是多放一点 javascript 代码。

这样的事情可能吗?

更新

请注意,deleteThis() 的末尾是一个窗口重定向。这使得任何额外的点击处理程序都不会被触发,因为我们已经离开了页面。

【问题讨论】:

  • 第一个版本(传递一个值来做出决定)称为命令耦合,最好避免。 “经理做决定,工人工作”是确保工人职能不做决定的常用比喻。您可以为额外的工作连接额外的处理程序(如果您的代码适合)。他们将按照注册的顺序开火。
  • jquery 允许函数作为参数传递,example here。您可以使用方法名称作为类型值。

标签: javascript jquery


【解决方案1】:

您可以做的一件事是使用eval() 函数。

代码仅包含在有“type a”按钮的页面上:

a = function() {
    // Do something extra here for the specific type a.
}

在您的主 javascript.js 文件中:

function deleteThis(obj) {
    // Special function for object type triggered by eval.
    try {
        eval(obj.attr('type'))();
    } catch(e) {}

    // Standard work here.
    window.location="newurl.php";

}

【讨论】:

  • 跟着我重复:evalevil :)
  • 哇? :
  • Eval 相对缓慢且完全非结构化。最好传递一个函数/回调,因为在这种情况下只有代码评估才有意义(不是我的反对票)。
  • 我喜欢这个! (我非常喜欢以恶为善)
【解决方案2】:

您可以使用 css 选择器为特定类型的按钮注册第二个单击侦听器。 监听器将按照添加的顺序被调用。

$('.delete').click(function(){
    console.log("I'm called for all delete buttons");
});

$('.delete[type=a]').click(function(){
    console.log("I'm also called for all delete buttons of type a");
});

【讨论】:

  • 啊,应该提到这里的一个问题是 deleteThis() 内部是一个重定向。所以第二次点击处理程序将没有机会触发,因为窗口已经被重定向。 (现在更新问题)
  • 根据在第二个处理程序中所做的事情,您可能可以使用 setTimeout(, 0) 来延迟第一个处理程序中的重定向。
  • 您为什么不只创建两个函数,一个用于要完成的常见事情,即 url 重定向,另一个用于要完成的其他特定事情,并为上述常见的删除处理程序调用通用函数和调用特定处理程序的通用+特定函数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多