jQuery.cycle не является ошибкой функции - продолжение http://stackoverflow.com/questions/1586998/

Итак, я пытаюсь реализовать решение, предложенное мне в моем предыдущем вопросе (SharePoint SOAP GetListItems VS jQuery. Нужен совет о том, как использовать Ajax для переключаться между элементами пользовательского списка, а также обновлять содержимое списка с помощью Ajax). Я хочу использовать библиотеку Cycle, найденную здесь: http://malsup.com/jquery/cycle2/ для циклического просмотра содержимого DIV, который я заполняю строками из пользовательского списка SharePoint. HTML-код, который я создаю, кажется действительным, но когда я пытаюсь запустить приведенный ниже код цикла, я получаю:

Error: $("#tasksUL").cycle is not a function
Source File: http://ourdomain.net/Pages/Default.aspx
Line: 426 

Вот код, который я заблокировал в веб-части редактора контента:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript" src="/SiteCollectionDocuments/jquery.timers-1.0.0.js"></script>
<script type="text/javascript" src="/SiteCollectionDocuments/jquery.cycle.all.2.72.js"></script>
<script type="text/javascript">

$(document).ready(function() {

// Create the SOAP request        
// NOTE: we need to be able to display list attachments to users, hence the addition of the
// <queryOptions> element, which necessitated the addition of the <query> element

var soapEnv =
"<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'><soapenv:Body><GetListItems xmlns='http://schemas.microsoft.com/sharepoint/soap/'><listName>testlist</listName><viewFields><ViewFields><FieldRef Name='Title' /><FieldRef Name='Body' /><FieldRef Name='ID' /><FieldRef Name='Attachments' /></ViewFields> </viewFields><query><Query /></query><queryOptions><QueryOptions><IncludeAttachmentUrls>TRUE</IncludeAttachmentUrls></QueryOptions></queryOptions></GetListItems></soapenv:Body></soapenv:Envelope>";

// call this SOAP request every 20 seconds
$("#tasksUL").everyTime(20000,function(i){
    // our basic SOAP code to hammer the Lists web service
    $.ajax({
    url: "http://ourdomain.net/_vti_bin/lists.asmx",
    type: "POST",
    dataType: "xml",
    data: soapEnv,
    error: printError,
    complete: processResult,
    contentType: "text/xml; charset=\"utf-8\""
    });
  });
});

// basic error display that will pop out SOAP errors, very useful!
function printError(XMLHttpRequest, textStatus, errorThrown)
{
  alert("There was an error: " + errorThrown + " " + textStatus);
  alert(XMLHttpRequest.responseText);
}

// main method that will cycle through the SoAP response nodes
function processResult(xData, status) 
{
    var liHtml = "";
  $(xData.responseXML).find("z\\:row").each(function() 
  {
    // resets display element
    $("#tasksUL").empty();

    // gets attachments array - if there is more than one attachment,
    // they get seperated by semi-colons in the response
    // they look like this natively (just an example):
    // ows_Attachments = ";#http://server/Lists/Announcements/Attachments/2/test.txt;
    // #http://server/Lists/Announcements/Attachments/2/UIP_Setup.log;#"

        var mySplitResult = $(this).attr("ows_Attachments").split(";");
    // set up storage for later display of images
    var notice_images = "";

    // processes attachments - please forgive the kludge!  
    for(i = 0; i < mySplitResult.length; i++)
    {
        // check to see the proper link URL gets chosen
        if (i % 2 != 0 && i != 0)
        {
            // strips out pound sign
            mySplitResult[i] = mySplitResult[i].replace("#", "");

            // (possibly redundant) check to make sure element isn't simply a pound sign  
            if (mySplitResult[i] != "#")
            {
                // adds an img tag to an output container
                notice_images = notice_images + "<img src='" + mySplitResult[i] + "' border='0' align='right' style='float:right;' /><br />"; 
            }
        }
    }

    // create final output for printing
    liHtml = liHtml + "<div><h3>" + $(this).attr("ows_Title") + "</h3><p>" + notice_images + $(this).attr("ows_Body") + "</p></div>";
  });

    // assign output to DIV tags
  $("#tasksUL").html(liHtml);
}
</script>

<script type="text/javascript">
$(document).ready(function() {
    $('#tasksUL').cycle({
        fx: 'fade' // choose your transition type, ex: fade, scrollUp, shuffle, etc...
    });
});
</script>

<div id="tasksUL">&nbsp;</div>

Код запускается, как и ожидалось, но мне интересно, что я делаю неправильно в отношении функции Cycle... Я попытался явно связать все файлы JavaScript в включениях, которые у меня есть выше, и я могу связаться с ними в браузер без проблем. Чтобы правильно использовать эту библиотеку, нужно ли мне определять CSS для #tasksUL? Есть ли в коде что-то очевидное, что мне нужно ударить по лицу? Спасибо!


person Mike Arsenault    schedule 20.10.2009    source источник
comment
Вы уверены, что у вас загружен подключаемый модуль Cycle (malsup.com/jquery/cycle)?   -  person NawaMan    schedule 20.10.2009
comment
Абсолютно! Третья строка JS в приведенном выше коде — это включение, которое на самом деле работает нормально... есть ли другие файлы, которые мне могут понадобиться?   -  person Mike Arsenault    schedule 20.10.2009


Ответы (2)


Откуда вы взяли jquery.cycle...js?

По крайней мере, zip-файл с домашней страницы jQuery Cycle Plugin выглядит странно. дополнительные символы в конце имени файла. когда я распаковываю его, мой файл называется jquery.cycle.all.min.js_ вместо jquery.cycle.all.min.js

person jitter    schedule 20.10.2009
comment
В итоге я взял файл с адреса, используемого в файле example.html, который находится в том же архиве, так как мой клиент WinRAR не мог правильно распаковать некоторые файлы js в архиве, который я скачал по указанному выше адресу. Файл example.html, кажется, работает просто отлично, поэтому я подумал, что если я скачаю JS-файл, который он использовал, у меня все будет хорошо. Теперь мне интересно, возможно ли, что он терпит неудачу, потому что в моем контейнере DIV ничего нет? Он не заполняется, пока не пройдет 20 секунд. Кроме того, если я использую метод .html для заполнения своего DIV, действительно ли это уничтожит DIV? - person Mike Arsenault; 20.10.2009

На самом деле, и никто не мог узнать об этом, причина, по которой это не сработало, заключалась в том, что кто-то установил старый пакет jQuery для семейства сайтов, который не очень хорошо работал с jCycle. Как только я отключил эту функцию в коллекции, перезапустил IIS и обновил страницу, все заработало нормально. В качестве дополнительного шага я загрузил последнюю полную версию jQuery в библиотеку документов и связался с ней вместо версии скрипта, размещенной в Google. Итак, все js, которые я использую, теперь живут внутри коллекции сайтов.

Мне удалось выяснить конфликтующие версии jQuery, но с помощью консоли Firebug и отладчика сценариев. Мне пришлось настроить отладчик на остановку при всех ошибках, но самая первая возникшая ошибка была связана с пакетом jQuery семейства сайтов, а не с включенным кодом Google. Именно поэтому я отвечаю на свой вопрос. Есть и другие несчастные ублюдки, занимающиеся разработкой SharePoint, и им может не прийти в голову использовать FireFox для тестирования своих установок SP, учитывая, насколько он поддерживает IE и все такое.

Спасибо всем, кто прочитал и ответил/комментировал!

person Mike Arsenault    schedule 21.10.2009