Застрял на странной ошибке JQuery - PullRequest
1 голос
/ 17 февраля 2011

Хорошо, вот мой код, он хранится во внешнем js-файле и правильно включен в основной HTML-файл в разделе head.

$(document).ready(function(){
    var checkForConfirmation = function(){
    for(var i=0; i<myOrders.length; i++){
        $.ajax({
            type: "GET",
            url: "orderStatus.php",
            data: {action: 'get', id: myOrders[i]},
            success: function(data){
                if (data){
                    var reply = jQuery.parseJSON(data);
                    $("#fancyAlertLink").fancybox().trigger('click');
                    myOrders.splice(myOrders[i], 1);
                }
            }
        });
        if (myorders.length == 0){
            clearInterval(waitForRestourantInterval);
        }
    }
}
if (myOrders.length > 0){
    var waitForRestourantInterval = setInterval(function(){checkForConfirmation()}, 5000);
}
});

Как видите, я пытаюсь отобразитьfancybox, когда внутренний скрипт ("orderStatus.php") получает правильные данные.

Все работает нормально, если я не использую jQuery (пример: window.alert вместо fancybox), но когдаЯ пытаюсь использовать jQuery внутри этой функции, получаю странную ошибку.

Firebug говорит, что в строке есть ошибка $("#fancyAlertLink").fancybox().trigger('click');

Нет описания ошибки, просто "$ (")

Что я делаю неправильно ???


Извините. Я знаю, что это не ответ, но я не могу все это прокомментировать. Вот "обновлено"Код: ошибка исчезла, но fancybox по-прежнему не будет запускаться из моего скрипта.

РЕДАКТИРОВАТЬ: Триггер не работает, когда находится внутри функции успеха.это работает. Проблема в том, что я действительно нуждаюсь в успехе. Я пытался переместить триггерный вызов в отдельном файле.unction и вызов функции из успеха, но тот же результат.Не работает!Любые предложения?

подтверждениеDaemon.js

$(document).ready(function(){
var checkForConfirmation = function(){
    for(var i=0; i<myOrders.length; i++){
        $.ajax({
            type: "GET",
            url: "orderStatus.php",
            data: {action: "get", id: myOrders[i]},
            context: i,
            success: function(data){
                if(data!="null"){
                    var reply = jQuery.parseJSON(data);
                    $("#fancyAlertLink").trigger("click");
                    myOrders.splice(this, 1);
                }
            }
        });
        if (myOrders.length == 0){
            clearInterval(waitForRestourantInterval);
        }
    }
}
if (myOrders.length>0){
    var waitForRestourantInterval = setInterval(function(){checkForConfirmation()}, 5000);
}
});

основной html-файл: (smarty + html, smarty {literal} теги игнорируются в этом посте)

<html>
    <head>
        <script src="jquery-1.4.4.min.js" type="text/javascript"></script>
        <script src="fancyBox/jquery.fancybox-1.3.4.pack.js" type="text/javascript"></script>
        <link rel="stylesheet" href="fancybox/jquery.fancybox-1.3.4.css" type="text/css" media="screen" />
        <script type="text/javascript">
            var myOrders = new Array();
            {foreach from=$smarty.session.my_orders item=id}
                myOrders.push({$id}):
            {/foreach}
        </script>
        <script type="text/javascript">
            $(document).ready(function{
                $("#fancyAlertLink").fancybox();
            });
        </script>
        <script src="confirmationDaemon.js" type="text/javascript"></script>
    </head>
    <body>
        --- some content here ---
        <a id="fancyAlertLink" href="#fancyAlert">Show fancy</a>
        <div style="display:none">
            <div id="fancyAlert">Fancybox hell yeah!!!</div>
        </div>
    </body>
</html>

Setинтервалы и AJAX работают как положено.Fancybox отображается, когда я нажимаю на ссылку «Показать Fancy».Но это не срабатывает от внешнего JS.Я отладил это.Должно работать, выполняет эту строку, но ничего не появляется

Ответы [ 3 ]

4 голосов
/ 17 февраля 2011

Вот одна проблема, с которой вы столкнетесь: когда вы устанавливаете эти AJAX-вызовы внутри цикла «for», код в обработчике «success» ссылается на переменную «i», которая используется для итераций цикла.Это будет большой проблемой, потому что все функций будут ссылаться на такую ​​же переменную "i".Таким образом, когда функции фактически вызываются асинхронно, когда HTTP-запросы завершаются, они все увидят одно и то же значение «i» (которое будет последним значением, которое «i» имел при запуске цикла).

Чтобы обойти эту проблему, настройте ваши обработчики «успеха» немного по-другому:

        success: (function(i) {
          return function(data) {
            if (data){
                var reply = jQuery.parseJSON(data);
                $("#fancyAlertLink").fancybox().trigger('click');
                myOrders.splice(myOrders[i], 1);
            }
          };
        })(i)

Если вы сделаете так, то у каждого отдельного обработчика будет своя собственная копия «i»и копия с правильным значением.

4 голосов
/ 17 февраля 2011

РЕДАКТИРОВАТЬ: Вероятно, есть несколько проблем.

  • Вы передаете myOrders[i] на .splice().Я предполагаю, что он не содержит индексный номер, такой как .splice() требует.

  • Значение проблемы i описано ниже.

  • Даже если эти две проблемы решены, у вас все еще есть проблема, потому что .splice() изменяет Массив, так что любой номер индекса больше, чем тот, который использовался в соединении, устарел, потому что.splice() это удаление элементов из массива.


Вы делаете:

myOrders.splice(myOrders[i], 1);

в success: обратном вызове асинхронного вызова AJAX.К тому времени, когда этот код срабатывает, i будет иметь то же значение, что и length, поэтому в этом индексе нет элемента.

Другими словами, последний элемент - length - 1, но i == length, поэтому myOrders[i] == undefined.

Одним простым и эффективным исправлением было бы установить myOrders[i] в качестве параметра context вызова AJAX.

    $.ajax({
        type: "GET",
        url: "orderStatus.php",
        context: myOrders[i],

Затем в обратном вызове success:, this будет ссылаться на этот элемент.

       success: function(data){
            if (data){
                var reply = jQuery.parseJSON(data);
                $("#fancyAlertLink").fancybox().trigger('click');

                 //  -------------v-----references the proper item
                myOrders.splice( this, 1);
            }
        }
1 голос
/ 17 февраля 2011

попытаться вызвать щелчок по элементу, например, $('#fancyAlertLink').trigger('click');

...