Проблема с привязкой в ​​jQuery для скопированных элементов - PullRequest
2 голосов
/ 04 октября 2009

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

Что я пытаюсь сделать: я использую этот плагин jQuery для загрузки файлов через Flash http://www.uploadify.com/. Однако элемент #fileInput, к которому я должен был привязать эту функцию, является активным элементом, который генерируется после страницы загружен: $ ('# fileInput'). uploadify (). Причина, по которой #fileInput является активным элементом, заключается в том, что я использую FancyBox для вызова DIV, и этот FancyBox в основном просто «клонирует» внутренний HTML-код DIV.

Что случилось: когда я нажал «BROWSE», чтобы загрузить файл, индикатор загрузки для загрузки отсутствовал. Причина в том, что Uploadify не может привязаться к активным элементам.

Вопросы: 1. Я пытался заменить bind () на live () в коде загрузки, но это не сработало, потому что bind () позволяет передавать [данные]. Плагин LiveQuery http://docs.jquery.com/Plugins/livequery также не имеет тот же синтаксис, что и bind (). Есть ли что-то похожее на связывание, но оно работает для живых элементов?

  1. Если я не попытаюсь заменить функцию bind () и сохранить код загрузки таким же. Кто-нибудь знает, как изменить код в FancyBox, чтобы он НЕ создавал клон для создания живых элементов? Я знаю, что это тоже сложный вопрос.

Примечание: сайт FancyBox кажется мертвым -> http://www.visual -blast.com / javascript / fancybox-jquery-image-zooming-plugin /

Большое спасибо!

Ответы [ 4 ]

1 голос
/ 07 октября 2009

Возможно, вы захотите изменить код FancyBox для поддержки вызова функции обратного вызова после клонирования HTML. Затем поместите вызов uploadify () в функцию обратного вызова.

0 голосов
/ 17 октября 2009

Как генерируется элемент? Если он получен с сервера с использованием jQuery, вы можете использовать более хакерский способ его исправить, просто поместите jQuery run eval () на любые теги скриптов, с которыми он сталкивается, чтобы вы могли просто поставить:

<script type='text/javascript'>
$(function(){
    $('#fileInput').uploadify();
});
</script>

В извлеченном html, и он будет связывать его при загрузке, вместо того, чтобы пытаться наблюдать за ним вживую. Бонусные баллы, если вы получите html снова, он не будет привязан.

0 голосов
/ 15 октября 2009

Из моего опыта я нашел единственный способ сделать это - использовать livequery

Он имеет аналогичный синтаксис, и в вашем случае для привязки uploadify к живому элементу вы должны использовать

$('#fileInput').livequery(function(){
  $(this).uploadify();
})

Livequery принимает функции без событий и выполняет их каждый раз, когда происходит изменение в DOM

0 голосов
/ 04 октября 2009

Вы можете перегрузить метод live, сделав его поддержкой data в качестве второго параметра:

jQuery.fn.live = (function(_live){
    return function( type, data, fn ) {

        var _fn;

        if ( jQuery.isFunction(fn) ) {
            _fn = function(e) {
                e.data = data;
                return fn.call( this, e );
            };
        }

        return _live.call( this, type, _fn || fn || data );
    };
})(jQuery.fn.live);

Замена всех экземпляров bind(...) на live(...) должна теперь работать.

Примечание: вам придется поставить перегруженный метод выше всего остального.

...