0

我有一堆 webtrend 标签要使用 dcsMultitrack 传递给 webtrend 服务器,这非常简单,但是有很多重复的代码可以说:

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....

作为第一,假设我有一些通用参数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);
});

编辑2:澄清:

 $("#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 有一些常见的参数让我们说 varcommonargs = ["DCSext.common", one, /*etc*/];

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

此外,另一个问题是:

var context = "#main,#main2";

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

这很好用,但我可以传递一个数组而不是字符串作为上下文并提取到一个函数中吗?

就像是

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

如果需要更多说明,请告诉我。

4

1 回答 1

1

您的第一个问题(代码重复)很容易通过创建一个函数来解决:

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到另一组不同,您可以创建一个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);

这是有效的,因为创建了一个闭包,因此返回的匿名函数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'
于 2012-01-05T10:39:26.027 回答