0

赤い円をクリックすると、ウィンドウにアラートが 1 回ポップアップ表示されます。firefox と chrome では正常に動作しますが、ie8 ではアラートが 2 回ポップアップします。どうすれば修正できますか?次のコードを参照してください。

Raphael("world", 1000, 400, function () {
        var r = this;
        r.rect(0, 0, 1000, 400, 0).attr({
                stroke: "none",
                fill: "0-#9bb7cb-#adc8da"
        });
        var click = function(){
                alert(this.type);    
        };

        r.setStart();
        var hue = Math.random();
        for (var country in worldmap.shapes) {
                r.path(worldmap.shapes[country]).attr({stroke: "#ccc6ae", fill: "#f0efeb", "stroke-opacity": 0.25});
        }

        var dot = r.circle(772.9870633333333, 166.90446666666668).attr({
                title: "Point",
                fill: "red", 
                stroke: "#fff", 
                "stroke-width": 2, 
                r: 5
        });
        var world = r.setFinish();
        world.click(click);
});
4

3 に答える 3

1

私はこの問題を数回経験しました。クリックイベントの代わりにマウスアップイベントを使用することで解決しました。IEは最悪です。

于 2013-03-05T07:41:38.917 に答える
0

この問題を修正する方法を見つけました。RaphaelSetオブジェクトを配列オブジェクトに置き換えてすべてのRahpael要素オブジェクトをプッシュし、配列をループして各要素のクリックイベントを追加します。次のコードを参照してください。

    var set = [];
//  r.setStart();
    for (var country in worldmap.shapes) {
        var element = r.path(worldmap.shapes[country]).attr({stroke: "#ccc6ae", fill: "#f0efeb", "stroke-opacity": 0.25});
        set.push(element);
    }

    var dot = r.circle(772.9870633333333, 160.90446666666668 , 5).attr({
            title: "Point",
            fill: "red", 
            stroke: "#fff", 
            "stroke-width": 2
    });

    set.push(dot);
    for(var i = 0; i < set.length; i++){
        var element = set[i];
        element.click(click);
    }
//  var world = r.setFinish();
//  world.click(click);  
于 2013-03-06T03:15:19.210 に答える
0

私がやっていることは完全に異なっていましたが、Firefox でも同様の問題がありました。

私がそれを解決した方法は、イベントがあまりにも短い間隔で 2 回発生するのを防ぐことでした。

私はこの機能を使用します:

function rateLimit(func) {
    var lastcall = func.lastcall || 0,
        now = new Date().getTime();
    if( now-lastcall < 250) return false;
    func.lastcall = now;
    return true;
}

次に、頻繁に起動しないように制限したい関数で、これを行うことができます。

if( !rateLimit(arguments.callee)) return false;

ただし、 を使用している場合は、小さな問題が発生する可能性があります。これはalert()、実行が完全にブロックされ、2 回目の実行がまだ発生するためです。console.log()値を追跡する代わりにを使用することを強くお勧めしalert()ます。これにより、プログラムの流れが中断されるのを回避できます (特に、非同期処理に入る場合、 で停止すると本当の謎が解けますalert) 。

お役に立てれば!

于 2013-03-06T03:20:40.457 に答える