2012-01-05 62 views
0

我有一堆webtrend标签通过使用dcsMultitrack这是很简单,但有很多代码让我们重复的webtrend服务器说:创建webtrend功能使用JS来消除重复申请并调用

1. var args = ["DCSext.name","a", "DCSext.title", "random"]; //etc ... 

比选择

2. $("a", "#main").bind("click", function(){ 
    do some extra stuff..... 
    dcsMultitrack.apply(this, args); 
}) 

*** 

编辑:


$("a", "#main").bind("mouseover", function(){ 
      do some extra stuff..... 
      dcsMultitrack.apply(this, args); 
     }) 
     or maybe 
     $("#main").delegate("mouseover", function(){ 
      do some extra stuff..... 
      dcsMultitrack.apply(this, args); 
     }) 
    etc.... 

从1号开始假设我有一些常见参数commonlogs=[];,这些参数将适用于每个选择器和常用选项,但是会有额外的参数,而不是我不想重复那些常用的日志。此外,我传递的参数值基于一些dom元素,假设我从dom中获取一个值,比如说选择器的颜色,玩家的名字等等,所以基本上这必须在相同的上下文中。

case: $("#selector").bind("click", function(){ 
      var playername = $(this).parent().text(), 
       title = $(this).closest('tr').find(".title").text(); etc etc.. 
     args = ["DCSext.name", palyername, "DCSext.title", title, etc ]; 
     dcsMultitrack.apply(this, args); 
}); 

EDIT2:澄清:

$("#selector1").bind("change", function(){ 
     var val1 = someval1, val2= someval2, //etc. 
      args = ["DCSext.something", val1, "DCSext.title", val2]; // 
     dcsMultitrack(this, args); 
    }); 

    $("#selector2").bind("mouseover", function(){ 
     var val3 = someval1, val4= someval2, //etc. 
      args2 = ["DCSext.something", val3, "DCSext.title", val4]; // 
     dcsMultitrack(this, args2); 
    }); 

注:ARGS有一些共同的PARAMS让说VAR commonargs = ["DCSext.common", one, /*etc*/];

1,是所有跨自从值重复2是不同的,但有没有办法删除所有这些代码的重复?我想提取到一个单一的函数,只传递选择器和附加值。

而且另一个问题是:

var context = "#main,#main2"; 

$(context).delegate("a", "click", function(){ 
    something .... 
dcsMultitrack.apply(this, args); 
}); 

这工作完全,但我可以通过一个数组,而不是字符串作为背景,并提取到的功能?

var context = ["#main", "#main2"]; 

请让我知道,如果需要更多的澄清。

function bindClick(target, args) { 
    target.bind("click", function(){ 
     // do some extra stuff..... 
     dcsMultitrack.apply(this, args); 
    }); 
} 

var args = ["DCSext.name","a", "DCSext.title", "random"]; //etc ... 
bindClick($("a", "#main"), args); 

var otherArgs = ["other", "args"]; 
bindClick($("a.other"), otherArgs); 

// etc. 

编辑:如果你绑定到事件的方式从一组args到另一个不同,您可以创建

回答

1

你的第一个问题(代码重复),很容易被创建一个函数求解一个function返回另一个function

function createCallback(args) { 
    return function() { 
     // do some extra stuff... 
     dcsMultitrack.apply(this, args); 
    }; 
} 

并用它来创建回调.bind()

var args = ["DCSext.name","a", "DCSext.title", "random"]; //etc ... 
var callback = createCallback(args); 
target.bind("click", callback); 

这工作,因为a closure is created使由createCallback返回仍然有机会获得args参数,即使createCallback返回,其范围已经关闭了匿名函数。


编辑2:响应您的编辑问题;结合事件时

function myCallback() { 
    var playername = $(this).parent().text(), 
     title = $(this).closest('tr').find(".title").text(), 
     // etc, etc.. 
     args = ["DCSext.name", palyername, "DCSext.title", title, /* etc. */ ]; 

    dcsMultitrack.apply(this, args); 
} 

,并使用此回调:

$("#selector").bind("click", myCallback); 
$("#otherSelector").delegate('mouseover', myCallback); 

这将很好地工作,因为this总是指向触发事件的DOM元素你为什么不只是这样做。如果在你的问题中还有其他东西,但是每种情况都有所不同,只需使用函数返回函数(如我所描述的那样)并传递任何变量作为参数。

希望这会有所帮助。


你的第二个问题就更简单了。只需使用Array.join()

var context = ["#main", "#main2"]; 
var contextString = context.join(','); // '#main,#main2' 
+0

谢谢!非常简单的解决方案...我完全忘记了数组连接...但添加到第一部分我可能有事件处理程序不仅仅是click..than它不会工作...我可能需要更新我的问题... – paul 2012-01-05 11:15:53

+1

@paul:我更新了答案。请看一看。只要//做一些额外的事情......每次都会保持不变,它就会工作。 – PPvG 2012-01-05 11:24:44

+0

感谢您更新的答案..您是否看到我更新的问题...? – paul 2012-01-05 11:48:12