Ajax不会在基于webkit的浏览器上触发更改事件

时间:2010-04-18 00:56:49

标签: javascript ajax webkit jquery-plugins

我已经调整了一个Jquery插件来满足我的需求,将GET请求发送到服务器,作为“ping”它们的方式。

我还添加了一些javascript代码来添加一些奇特的功能,例如:根据Jquery插件更改的范围中更改的值,它会相应地更改Icon。

为了使一切工作本质上,我做了这样,当Ajax得到一个“完整”事件时,它强制一个“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();是在span中触发“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 :(得分:0)

我猜你可以尝试使用jQuery的checkServerIcon内置方法:

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

浏览器之间可能存在一些可以通过使用jQuery方法修复的怪癖。

答案 1 :(得分:0)

使用JQuery更改方法而不是javascript onchange target.change()只会触发jquery的有界函数

答案 2 :(得分:0)

以下是解决方案:

我从我的span中删除了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:)