создание функции webtrend для удаления дублирования с помощью js apply и вызова - PullRequest
0 голосов
/ 05 января 2012

У меня есть куча тегов webtrend для передачи на сервер webtrend с помощью dcsMultitrack, который довольно прост, но есть много дублирования кода, скажем:

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

чем селектор

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

***

Edit:


$("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);
});

Редактировать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);
    });

примечание: аргументы, есть некоторые общие параметры, скажем, 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"];

Пожалуйста, дайте мне знать, если потребуется больше разъяснений.

1 Ответ

1 голос
/ 05 января 2012

Ваша первая проблема (дублирование кода) легко решается путем создания функции:

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