Как получить доступ к динамически генерируемому содержимому страницы через jQuery?

#javascript #jquery #sharepoint

#javascript #jquery #sharepoint

Вопрос:

У меня есть страница веб-части SharePoint со списком, который сгруппирован и по умолчанию имеет значение «свернутый» (очень похоже на базовое переключение). SharePoint генерирует свой собственный JavaScript для обработки начального действия щелчка, который затем расширяет область страницы и динамически записывает новое содержимое в эту область. Проблема в том, что jQuery не может получить доступ к новому содержимому сразу после щелчка (ему необходимо завершить загрузку). Я думаю добавить 2-ю функцию щелчка jQuery в ссылку переключения и каким-то образом дождаться добавления нового содержимого, прежде чем произойдет что-либо еще, но я не уверен, как определить, когда динамический контент завершит загрузку…

         //bind a 2nd additional onclick handler via jquery to these items
        $('td.ms-gb').children('a').click(function() 
            { 
                //give the clicked item a border for visual identification
                $(this).css("border","1px solid cyan");

                //delay this function until the sharepoint onclick handler finishes loading new content
                $('TD.ms-vb-icon').children('a').each(function(index) 
                   {
                        //give each item a border for visual identification 
                        $(this).css("border","1px solid red");
                        //perform more jquery on each item

                   }
                );         

            }
        ); 
  

Ответ №1:

Распространенный метод решения подобных проблем заключается в использовании

setTimeout(функция, timeoutInMs)

и попытайтесь найти новое содержимое в функции, если не удается перезапустить тайм-аут, пока не найдете содержимое

Вот jsFiddle для иллюстрации: http://jsfiddle.net/Dhww2 /

Комментарии:

1. да, я думал об этом, но я не очень хорошо разбираюсь в JavaScript.

2. итак, возможно ли это … setTimeout(функция jQuery, timeoutInMs)?

Ответ №2:

Единственное, что я могу придумать, это установить другой обработчик кликов, который регистрируется с помощью $.ajaxSuccess() http://api.jquery.com/ajaxSuccess / и отвечает после завершения первого AJAX-запроса (после щелчка)

Это халтурно, но если код, который извлекает динамическое содержимое, не имеет обратного вызова, вариантов не так много.

Комментарии:

1. Интересно, работает ли $.ajaxSuccess() для AJAX, не вызываемого функциями jQuery.

2. @gertas: Я не думаю, что это так, но код SharePoint написан на jQuery

3. AFAIK SharePoint не поставляет jQuery, я думаю, вы имели в виду «JScript». источник 2010

4. это MOSS2007, поэтому код переключения SharePoint НЕ использует jQuery.

Ответ №3:

Что вы собираетесь делать с загруженным контентом? Просто стилизовать и поймать еще один клик?

В таком случае используйте таблицы стилей для пользовательского стиля и живую функцию jQuery для отслеживания (щелчка) событий других загруженных элементов.

Обновление для комментариев

 $('TD.ms-vb-icon a').live('click', function(ev) {
    $(this).attr('name','value');
}
  

Может не сработать, если ваш код отслеживания кликов зарегистрирован ранее. Если это так, попробуйте с mouseover помощью event.

Комментарии:

1. с загруженным содержимым мне нужно только добавить атрибут name к тегам привязки.

2. Хорошо, значит, вы в конечном итоге хотите перейти к этим именованным якорям?

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

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

5. Верно, но я пытаюсь понять, какова цель этих атрибутов «name». Если загруженный контент может получить еще один щелчок, вы можете перехватить его live и заполнить недостающие «имена» в обработчике событий. Можно использовать даже ‘mouseenter’ или ‘focus’.