Вызов функции, которая находится на главной странице из плагина? - PullRequest
1 голос
/ 12 июня 2009

Я хочу вызвать функцию из плагина, но эта функция находится на главной странице, а не в файле плагина .js.

EDIT

У меня есть jQuery для анализа очень большого XML-файла и создания, впоследствии, большого списка (1,1 МБ HTML-файла, когда динамическое содержимое копируется, вставляется, а затем сохраняется), который имеет функцию расширения / свертывания с помощью плагина. Общая производительность в IE очень медленная и собачья, если предположить, что page / DOM очень велика.

В настоящее время я пытаюсь сохранить свернутый контент в файле event.data, когда он свернут, и удалить его из DOM, а затем вернуть его, когда ему говорят о расширении ... у меня возникает проблема, когда Я возвращаю контент, очевидно, события «щелчка» и «зависания» исчезли. Я пытаюсь переназначить их, в настоящее время делаю это внутри плагина после того, как плагин расширяет содержимое. Тогда проблема заключается в том, что функция, которую я объявляю в .click (), не определена. Кроме того, событие hover, похоже, тоже не переназначает ....

if ($(event.data.trigger).attr('class').indexOf('collapsed') != -1 ) {  //  if expanding
        //  console.log(event.data.targetContent);
            $(event.data.trigger).after(event.data.targetContent);
            $(event.data.target).hide();

/*  This Line --->*/    $(event.data.target + 'a.addButton').click(addResourceToList);

            $(event.data.target + 'li.resource')
                .hover(
                    function() {
                        if (!($(this).attr("disabled"))) {
                            $(this).addClass("over");
                            $(this).find("a").css({'display':'block'});
                        }   

                    },
                    function () {
                        if (!($(this).attr("disabled"))) {
                            $(this).removeClass("over");
                            $(this).children("a").css({'display':'none'});
                        }   
                    }
                );
            $(event.data.target).css({
                                         "height": "0px",
                                         "padding-top": "0px",
                                         "padding-bottom": "0px",
                                         "margin-top": "0px",
                                         "margin-bottom": "0px"});
            $(event.data.target).show();
            $(event.data.target).animate({
                                         height: event.data.heightVal + "px",
                                         paddingTop: event.data.topPaddingVal + "px",
                                         paddingBottom: event.data.bottomPaddingVal + "px",
                                         marginTop: event.data.topMarginVal + "px",
                                         marginBottom: event.data.bottomMarginVal + "px"}, "normal");//, function(){$(this).hide();});
            $(event.data.trigger).removeClass("collapsed");  
            $.cookies.set('jcollapserSub_' + event.data.target, 'expanded', {hoursToLive: 24 * 365});
        } else if ($(event.data.trigger).attr('class').indexOf('collapsed') == -1 ) {  //  if collapsing
            $(event.data.target).animate({
                                         height: "0px",
                                         paddingTop: "0px",
                                         paddingBottom: "0px",
                                         marginTop: "0px",
                                         marginBottom: "0px"}, "normal", function(){$(this).hide();$(this).remove();});
            $(event.data.trigger).addClass("collapsed");  
            $.cookies.set('jcollapserSub_' + event.data.target, 'collapsed', {hoursToLive: 24 * 365});
        }

EDIT

Итак, новые глаза действительно имеют значение. Когда я просматривал код в этом посте этим утром после отъезда в выходные, я обнаружил, где у меня была ошибка.

Это:

$(event.data.target + 'a.addButton').click(addResourceToList);

Должно быть так (обратите внимание на пробел перед a.addbutton ):

$(event.data.target + ' a.addButton').click(addResourceToList);

Та же проблема с "li.resource". Так что это никогда не указывало на правильные элементы ... Спасибо, Рене, за вашу помощь !!

Ответы [ 2 ]

0 голосов
/ 13 июня 2009

Мне кажется, что этот плагин должен быть ответственным за добавление событий в первую очередь, а затем он может повторно добавлять их при необходимости.

Но когда эти события щелчка и наведения действительно являются внешними по отношению к плагину, вы можете взглянуть на jQuery live events .

0 голосов
/ 12 июня 2009

Полагаю, вы должны передать свою функцию плагину в качестве аргумента, чтобы он мог ее вызвать.

// inside your plugin:
$.yourPlugin = function(f) {
  f();
}

// on the main page
$.yourPlugin(yourFunction);

Другая возможность состояла бы в том, чтобы вызывать глобальную функцию по имени, но плагин не должен полагаться на вашу собственную глобальную функцию, чтобы существовать.

Или предоставьте больше контекста для вашего вопроса, поскольку ваше текущее описание слишком краткое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...