寫法記錄


setInterval(function(){
            $("img").each(function(){
                if($(this).width() > 300 || $(this).height() > 300){
                    var imgID;
                    //alert($(this).attr('src'));
                   
                    if(!$(this).data('tagtoo_imgobj')){
                        imgID =  new Date().getTime()
                        $(this).data('tagtoo_imgobj', imgID);
                        $(this).addClass("tagtoo_imgobj"+imgID);
                    }
                    else{
                        imgID = $(this).data('tagtoo_imgobj');
                    }
                   
                    //alert(imgID);
                   
                    var top = $(this).offset().top;
                    var left = $(this).offset().left;
                    var width = $(this).width();
                    var height = $(this).height();
                    //if(top != $(this).data('top') || left != $(this).data('left') || width != $(this).data('width') || height != $(this).data('height')){
                        $(this).data('top', top);
                        $(this).data('left', left);
                        $(this).data('width', width);
                        $(this).data('height', height);
                        $(".tagtoo_regional_tag"+imgID).remove();
                        Tagtoo.LoadTagData("",imgID);
                    //}
                }
            });
        }, 800);


用以上的程式碼下去實測, 會發現以下事實:
1. 如果用圖片的位置和長寬來做為判斷圖片是否有更動的依據, 會發現這些資訊在最初有改變過一次, 但後來都沒有改變, 也因此根本不會進到if 那個狀況內, 也就跟本不會LoadTagData

2....

// 想法: 在網頁load完成後, 去查詢每個img 的狀況, 如果發現它的狀態有變動, 就重繪一次tags
// 問題: 這樣仍有很大的機率標籤會歪掉!  似乎是img 的width 和 height 沒有真正進入視線範圍是 // 不會正確

--> 只能用進入視線做為畫tag之判斷依據了... 如果要做到不mouseover 就顯示tag的話


結果: 總覺得好像標籤的顯示和"圖片有沒有進入視線"有關, 最後trace 到root發現原來是這樣的!

原本是用mouseenter 當成改變鎖定image 物件的條件, 也就是說, 假如滑鼠移到一圖片上, 全域變數像Tagtoo.imgWidth 和 Tagtoo.imgHeight 就會改變, 圖片也會被嵌上一個class name 叫做 "tagtoo_plugin_active_img" , 因為以前的架構下同一時間只會有一個這樣的物件, 所以不會出問題, 然而現在架構改了, 變成不必靠滑鼠移過來驅動圖片標籤, 所以這樣的工作難度也增加, 以前在setHotTags() 裡頭會去計算tags的位置, 用calculateDotPos() 這個函式, 之前一直沒有檢察到這個函式, 然而剛剛看過以後, 發現裡面有個關鍵的地方出了問題, 之前沒改到, 注意以下程式碼黃色底的部分:


Tagtoo.calculateDotPos = function(desp, imgID){
    var imgclass = "tagtoo_imgobj" + imgID;
var imgobj = $('img[class*="'+imgclass+'"]');
var img_left_top_cordX = imgobj.offset().left;
var img_left_top_cordY = imgobj.offset().top;
var ratioX = 0;
var ratioY = 0;
var tag_cor = new Array();

var ratios = desp.split(",");
if(ratios.length == 6){
// calculate the new dot "desp" format(from old dot desp)
var desp_string = Tagtoo.reCalculateDotDesp(desp);
var desps = desp_string.split(",");
ratioX = parseFloat(desps[0])/1000;
ratioY = parseFloat(desps[1])/1000;
}
else{
ratioX = parseFloat(ratios[0])/1000;
ratioY = parseFloat(ratios[1])/1000;
}
// calculate the absolute coordinate of this reginonal tag(dot)
tag_cor[0] = ratioX * Tagtoo.imgWidth+ img_left_top_cordX;
tag_cor[1] = ratioY * Tagtoo.imgHeight+ img_left_top_cordY;
return tag_cor;
}

注意到了嗎? 他仍是沿用舊的架構, 去讀Tagtoo.imgWidth, 而這個變數是共用的, 不保險的, 在滑鼠沒有移到圖片上時, 這個變數根本就會是錯的(不會是你目前看的圖片的長寬), 會是最後一次滑鼠移到圖片上時該圖片的長寬, 如果標籤是依據此而算的, 鐵定會歪, 我改成這樣以後就好了:


Tagtoo.calculateDotPos = function(desp, imgID){
    var imgclass = "tagtoo_imgobj" + imgID;
var imgobj = $('img[class*="'+imgclass+'"]');
var img_left_top_cordX = imgobj.offset().left;
var img_left_top_cordY = imgobj.offset().top;
        var imgWidth = imgobj.width();
        var imgHeight = imgobj.height();
var ratioX = 0;
var ratioY = 0;
var tag_cor = new Array();

var ratios = desp.split(",");
if(ratios.length == 6){
// calculate the new dot "desp" format(from old dot desp)
var desp_string = Tagtoo.reCalculateDotDesp(desp);
var desps = desp_string.split(",");
ratioX = parseFloat(desps[0])/1000;
ratioY = parseFloat(desps[1])/1000;
}
else{
ratioX = parseFloat(ratios[0])/1000;
ratioY = parseFloat(ratios[1])/1000;
}
// calculate the absolute coordinate of this reginonal tag(dot)
tag_cor[0] = ratioX * imgWidth + img_left_top_cordX;
tag_cor[1] = ratioY * imgHeight + img_left_top_cordY;
return tag_cor;
}


注意到裡面差異了嗎? 這就是為什麼之前會覺得好像出現在視野裡的圖片上的tag會排列得比較整齊的原因~

留言

熱門文章