Ajax не запускает событие изменения в браузере на основе webkit - PullRequest
0 голосов
/ 18 апреля 2010

Я адаптировал плагин Jquery для удовлетворения моих потребностей, чтобы отправлять GET-запросы на серверы как способ «пинговать» их.

Я также добавил некоторый код javascript для добавления некоторых необычных функций, таких как: в зависимости от измененного значения в диапазоне, который изменяется плагином Jquery, он соответствующим образом меняет значок.

Чтобы все это работало по существу, я сделал так, чтобы, когда Ajax получал событие «complete», он принудительно передавал событие «onChange» в span, вызывая функцию проверки JavaScript для изменения значков состояния.

Вот код моего слегка модифицированного плагина jQuery:

/**
 * ping for jQuery
 * 
 * Adapted by Carroarmato0  (to actually work instead of randomly "pinging" nowhere instead of faking
 *
 * @auth Jessica
 * @link http://www.skiyo.cn/demo/jquery.ping/
 *
 */
(function($) {
    $.fn.ping = function(options) {
        var opts = $.extend({}, $.fn.ping.defaults, options);
        return this.each(function() {
            var ping, requestTime, responseTime ;
            var target = $(this);
                        var server = target.html();
                        target.html('<img src="img/loading.gif" alt="loading" />');
            function ping() {
                $.ajax({url: 'http://' + server,
                    type: 'GET',
                    dataType: 'html',
                    timeout: 30000,
                    beforeSend : function() {
                        requestTime = new Date().getTime();
                    },
                    complete : function() {
                        responseTime = new Date().getTime();
                        ping = Math.abs(requestTime - responseTime);

                                                if (ping > 2000) {
                                                    target.text('niet bereikbaar');
                                                } else {
                                                    target.text(ping + opts.unit);
                                                }

                                                target.change();
                    }
                });
            }
            ping();
            opts.interval != 0 && setInterval(ping,opts.interval * 1000);
        });
    };
    $.fn.ping.defaults = {
        interval: 3,
        unit: 'ms'
    };
})(jQuery);

target.change (); код, который запускает событие "onchange" в промежутке:

echo "  <td class=\"center\"><span id=\"ping$pingNb\" onChange=\"checkServerIcon(this)\" >" .$server['IP'] . "</span></td>";

В Firefox это работает, checkServerIcon (this) выполняется и передает объект span в функцию.

function checkServerIcon(object) {
    var delayText = object.innerHTML;
    var delay = delayText.substring(0, delayText.length - 2);

    if ( isInteger(delay) ) {
        object.parentNode.previousSibling.parentNode.getElementsByTagName('img')[0].src = 'img/servers/enable_server.png';

    } else {

        if (delay == "bezig.") {
            object.parentNode.previousSibling.parentNode.getElementsByTagName('img')[0].src = 'img/servers/search_server.png';
        } else {
            object.parentNode.previousSibling.parentNode.getElementsByTagName('img')[0].src = 'img/servers/desable_server.png';
        }
    }

}

Ответы [ 3 ]

0 голосов
/ 18 апреля 2010

Используйте метод изменения JQuery вместо javascript onchange target.change () будет запускать только ограниченные функции jquery

0 голосов
/ 18 апреля 2010

Вот решение:

Я удалил событие onchange из своего диапазона и вместо этого дал ему имя класса:

echo "  <td class=\"center\"><span class=\"ping\" id=\"ping$pingNb\">" .$server['IP'] . "</span></td>";

Затем я заставил jQuery добавить само событие изменения:

<script type="text/javascript">
    $(document).ready(function(){
        $("span.ping").change(checkServerIcon);
    });
</script>

Моя функция JavaScript должна была быть переписана:

function checkServerIcon() {
    var tr = $(this).parent().parent();
    var img = tr.find('td>img').first().attr('src');
    var delayText = tr.find('td>span').text();
    var delay = delayText.substring(0, delayText.length - 2);

    if ( isInteger(delay) ) {
        tr.find('td>img').first().attr('src','img/servers/enable_server.png');

    } else {

        if (delay == "bezig.") {
           tr.find('td>img').first().attr('src','img/servers/search_server.png');
        } else {
            tr.find('td>img').first().attr('src','img/servers/desable_server.png');
        }
    }   
}

И теперь код работает как в браузерах на базе Firefox, так и в Webkit, таких как Google Chrome

0 голосов
/ 18 апреля 2010

Я думаю, вы можете попробовать использовать встроенные методы jQuery для checkServerIcon:

$(object).parent().prev().parent().find('img:first').attr({src: 'image-source-here'});

Между браузерами могут быть некоторые причуды, которые можно исправить с помощью методов jQuery.

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