Как сделать эту функцию JavaScript глобальной, чтобы другие функции могли получить к ней доступ?

0

У меня есть этот пример кода кода, который повторяется так много раз.

$(function(loadDatabyClickA){
    $('button').live('click', function(){

        selectedAgeType   = $(this).attr('value');

        var x       =   {};

        x.data      =   $('a').attr("data"); //selected item in tree (.liselected)
        x.command   =   $('a').attr("cmd");
        x.option    =   "x";
        x.sessionid =   docCookies.getItem("sessionid");
        x.ageType   =   selectedAgeType;
        x.showData  =   showUnderlyingData;

        var action  =   function(result, status) {

            var x_list  =   "";

            $.each(result, function(i, val){
                x_list  += "<li><h3>"+val.xtitle+"</h3></li>";
            });

        $('#x_view').append(x_list);
        };

        $.post("jsoncommand", JSON.stringify(chart), action)
        .error(function(){
            alert('error');
        });

    })
})

Как я могу извлечь этот блок, чтобы я мог получить к нему доступ из другой функции? Может быть, нравится использовать .extend()? Этот блок используется другой функцией:

$(function(loadDatabyClickB){
    $('button2').live('click', function(){

        selectedAgeType   =   $(this).attr('value');

        var y       =   {};

        y.data      =   $('a').attr("data"); //selected item in tree (.liselected)
        y.command   =   $('a').attr("cmd");
        y.option    =   "y";
        y.sessionid =   docCookies.getItem("sessionid");
        y.ageType   =   selectedAgeType;
        y.showData  =   showUnderlyingData;

        var action  =   function(result, status) {

            var y_list  =   "";

            $.each(result, function(i, val){
                y_list  += "<li><h3>"+val.ytitle+"</h3></li>";
            });

            $('#y_view').append(y_list);
        };

        $.post("jsoncommand", JSON.stringify(y), action)
        .error(function(){
            alert('error');
        });

    })
})

Вы, ребята, можете просто показать мне, как это сделать, потому что у меня нет подсказки. Я упрощу это сам. Заранее спасибо за вашу помощь!

Теги:

3 ответа

1

Создайте функцию для создания обработчика кликов на основе "представления", который вы передаете.

function getButtonClickHandler(view) {
    return function () {
        selectedAgeType   =   $(this).attr('value');
        var y       =   {};
        y.data      =   $('a').attr("data"); //selected item in tree (.liselected)
        y.command   =   $('a').attr("cmd");
        y.option    =   view;
        y.sessionid =   docCookies.getItem("sessionid");
        y.ageType   =   selectedAgeType;
        y.showData  =   showUnderlyingData;
        var action  =   function(result, status) {
            var y_list  =   "";
            $.each(result, function(i, val){
                y_list  += "<li><h3>" + val[view + 'title'] + "</h3></li>";
            });
            $('#' + view + '_view').append(y_list);
        };
        $.post("jsoncommand", JSON.stringify(y), action)
        .error(function(){
            alert('error');
        });
    }
}

$(function () {
    $('button').on('click', getButtonClickHandler('y'));
    $('button2').on('click', getButtonClickHandler('x'));
});
  • 1
    Возможно, было бы лучше использовать .on() ? .live() устарела в более поздних версиях jQuery;)
  • 0
    Вам также необходимо различать различные свойства val . Итак, просто измените val.ytitle на val[view+'title'] в вашем коде
Показать ещё 1 комментарий
0

Попробуй это:

window.bindClick = function(selector, option, view) {
    view = view || '#' + option + '_view';
    $(document).on('click', selector, function(){

        selectedAgeType   = $(this).attr('value');

        var x       =   {};

        x.data      =   $('a').attr("data"); //selected item in tree (.liselected)
        x.command   =   $('a').attr("cmd");
        x.option    =   option;
        x.sessionid =   docCookies.getItem("sessionid");
        x.ageType   =   selectedAgeType;
        x.showData  =   showUnderlyingData;

        var action  =   function(result, status) {

            var list  =   "";

            $.each(result, function(i, val){
                list  += "<li><h3>"+val[option+'title']+"</h3></li>";
            });

            $(view).append(list);
        };

        $.post("jsoncommand", JSON.stringify(chart), action)
        .error(function(){
            alert('error');
        });

    })
})

и из любого места в вашем коде:

bindClick('#button', 'x', '#x_view');
bindClick('#button2', 'y', '#y_view');

или просто

bindClick('#button, #button2', 'x');
  • 0
    это не сработает, так как он использует разные селекторы в обработчике событий $('#y_view') и $('#x_view')
  • 0
    с делегированием событий вы можете просто сделать bindClick('#button,#button2'); таким образом, вы связываете только один обработчик вместо двух
Показать ещё 2 комментария
0

создайте свой собственный класс и вызовите свою функцию из своего класса

var youClass = {
        functionName : function() {
            selectedAgeType   = $(this).attr('value');

        var x       =   {};

        x.data      =   $('a').attr("data"); //selected item in tree (.liselected)
        x.command   =   $('a').attr("cmd");
        x.option    =   "x";
        x.sessionid =   docCookies.getItem("sessionid");
        x.ageType   =   selectedAgeType;
        x.showData  =   showUnderlyingData;

        var action  =   function(result, status) {

            var x_list  =   "";

            $.each(result, function(i, val){
                x_list  += "<li><h3>"+val.xtitle+"</h3></li>";
            });

        $('#x_view').append(x_list);
        };

        $.post("jsoncommand", JSON.stringify(chart), action)
        .error(function(){
            alert('error');
        });
        }
    }



//call your function
    $('button').live('click', function(){

        youClass.functionName(parameter);

    })
  • 0
    это не сработает, так как он использует разные селекторы в обработчике событий $('#y_view') и $('#x_view')
  • 0
    Как мне определить, какой параметр использовать?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню