JavaScript Title、alt提示(Tips)實現源碼解讀

來源:互聯網
上載者:User

而對於圖片標籤img也有一個alt屬性可以起到類似的作用。但很顯然這種提示框太單調了,為此有人用JavaScript實現了漂亮的提示框效果,這種效果常用在WEB遊戲中,其中的網易郵箱與迅雷影視頁面就用到這種效果,雖然彼此實現效果有些差異,但整體實現思路是不變的。為了方便大家瞭解實現的細節,以方便定製自己想要的效果,我上網找了一段不錯的源碼,並對其進行了詳細的注釋,希望對大家有協助。

  

含注釋代碼: 複製代碼 代碼如下:/***********************************************
  一個JavaScript Title、alt提示(Tips)源碼解讀
代碼注釋:唐國輝
作者部落格:http://webflash.cnblogs.com
***********************************************/

//定義getElementById捷徑
function $(obj)
{
if(typeof(obj)=='object')
{
return obj;
}
else
{
return document.getElementById(obj);
}
}
//定義document.write捷徑,代替複雜的DOM操作
function $P(str)
{
document.write(str);
}
//指令碼錯誤屏蔽
window.onerror=function ()
{
return true;
};
/*
定義變數:
pltsPop(提示內容文字,來自對象的alt或title屬性,不包含HTML)
toolTip(提示內容DOM對象,即後面定義的content變數)
pltsPoptop(上方提示標題DOM對象)
pltsPopbot(下方提示標題DOM對象)
topLeft(左上方提示標題DOM對象)
botLeft(左下方提示標題DOM對象)
topRight(右上方提示標題DOM對象)
botRight(右下方提示標題DOM對象)
*/
var pltsPop,toolTip,pltsPoptop,pltsPopbot,topLeft,botLeft,topRight,botRight;
//設定提示視窗相對提示對象的位置位移量
var pltsoffsetX=10;
var pltsoffsetY=15;
var pltsTitle="";
//建立一個絕對位置的隱藏圖層
$P('<div id=\"pltsTipLayer\" style="display:none; position:absolute; z-index:10001" mce_style="display:none; position:absolute; z-index:10001"></div>');
//把剛建立的層對象賦值給一個變數,此語句一定要出現在層建立之後
var pltsTipLayer=$('pltsTipLayer');
//定義滑鼠移到對象上時處理函數,主要提取alt或title屬性值,並初始化提示框HTML及樣式
function PltsMouseOver(ev)
{
//相容不同瀏覽器的事件和對象擷取
var Event=window.event||ev;
var o=Event.srcElement||Event.target;
//如果對象alt屬性存在並且不等於空,就把它的值存到dypop屬性,並清空當前alt內容
if(o.alt!=null&&o.alt!="")
{
o.dypop=o.alt;
o.alt="";
}
//如上,對具有title屬性的對象作同樣的判斷和處理,清空title屬性值是讓對象預設的提示效果失效
if(o.title!=null&&o.title!="")
{
o.dypop=o.title;
o.title="";
}
pltsPop=o.dypop;
if(pltsPop!=null&&pltsPop!=""&&typeof(pltsPop)!="undefined")
{
//把上面建立的提示層顯示出來,暫時移到左邊很遠,雖然顯示但使用者看不到
pltsTipLayer.style.left=-1000;
pltsTipLayer.style.display='';
/*
格式化提示資訊,把其中的\n換成<br/>,比如像下面這樣定義title值,顯示出來會是作者和性別各一行,因為Tom和Sex之間有\n:
<div title="Author:Tom
Sex:male">Article title...</div>
*/
var Msg=pltsPop.replace(/\n/g,"<br/>");
Msg=Msg.replace(/\0x13/g,"<br/>");
//定義Regex檢查提示內容是否含有類似這樣的內容“{提示標題}”,而且{}和{{}是排除在處的,如果沒有就預設用“簡介”作為提示標題
var re=/\{(.[^\{]*)\}/ig;
if(!re.test(Msg))
{
pltsTitle="<label style="\" mce_style="\""color:#000\">簡介</label>";
}
else
{
re=/\{(.[^\{]*)\}(.*)/ig;
//提取{}中的內容
pltsTitle=Msg.replace(re,"$1")+" ";
//把{內容},包括{}在內的內容替換為空白,得到最終提示本文的內容
re=/\{(.[^\{]*)\}/ig;
Msg=Msg.replace(re,"");
}
//定義提示框內容Html與Style,並把獲得的相關內容放到對應變數中
var content="<dl id=\"toolTip\" style="\" mce_style="\""-moz-opacity:0.85;opacity:0.85;FILTER:alpha(opacity=85);padding:2px;background:#fff;\"><dd id=\"pltsPoptop\" class=\"toolTipTitle\" style="\" mce_style="\""line-height:20px;\"><p id=\"topLeft\" class=\"left\"><b><label style="\" mce_style="\""color:#ffffff\"></label>"+pltsTitle+"</b></p><p id=\"topRight\" class=\"right\" style="\" mce_style="\""display:none\"><b>"+pltsTitle+"<label style="\" mce_style="\""color:#ffffff\"></label ></b></p></dd><dd class=\"toolTipMsg\">"+Msg+"</dd><dd id=\"pltsPopbot\" style="\" mce_style="\""display:none\" class=\"toolTipTitle\"><p id=\"botLeft\" class=\"left\"><b><label style="\" mce_style="\""color:#ffffff\"></label >"+pltsTitle+"</b></p><p id=\"botRight\" class=\"right\" style="\" mce_style="\""display:none\"><b>"+pltsTitle+"<label style="\" mce_style="\""color:#ffffff\"></label></b></p></dd></dl>";
pltsTipLayer.innerHTML=content;
toolTip=$("toolTip");
pltsPoptop=$("pltsPoptop");
pltsPopbot=$("pltsPopbot");
topLeft=$("topLeft");
botLeft=$("botLeft");
topRight=$("topRight");
botRight=$("botRight");
//設定提示框寬度,它的大小是提示框自身大小和瀏覽器可見視窗大小一半兩者中的最小值,即在瀏覽器視窗小過提示框本身寬度後,會自動調整提示框大小到一個新的寬度
toolTip.style.width=Math.min(pltsTipLayer.clientWidth,document.documentElement.clientWidth/2.2)+"px";
}
else
{
pltsTipLayer.innerHTML='';
pltsTipLayer.style.display='none';
}
}
//定義滑鼠在對象上移動時處理函數,每移動一像素觸發一次事件
function PltsMouseMove(ev)
{
if(pltsTipLayer.innerHTML=='')
return true;
var Event=window.event||ev;
//擷取游標當前X、Y座標
var MouseX=Event.clientX;
var MouseY=Event.clientY;
//擷取提示框寬高度
var popHeight=pltsTipLayer.clientHeight;
var popWidth=pltsTipLayer.clientWidth;
//如果當前游標Y座標+提示框Y軸位移量+提示框高度>當前視窗可見高度,一般處理視窗中下方要提示的對象,比如頁尾有一個連結需要提示時就會是這種情況,此時考慮使用下方標題
if(MouseY+pltsoffsetY+popHeight>document.documentElement.clientHeight)
{
//提示框顯示在要提示對象上方時需要一個額外值popTopAdjust作為提示框最終定位的依據
popTopAdjust=-popHeight-pltsoffsetY*1.5;
pltsPoptop.style.display="none";
pltsPopbot.style.display="";
}
else
{
popTopAdjust=0;
pltsPoptop.style.display="";
pltsPopbot.style.display="none";
}
//判斷使用左標題還是右標題
if(MouseX+pltsoffsetX+popWidth>document.documentElement.clientWidth)
{
popLeftAdjust=-popWidth-pltsoffsetX*2;
topLeft.style.display="none";
botLeft.style.display="none";
//下面兩個標題都顯示,其實最終看到的只有一個位置上的標題,因為topRight是pltsPoptop的子項目,如果pltsPoptop不顯示,topRight顯示也是看不到的,botLeft同理
topRight.style.display="";
botRight.style.display="";
}
else
{
popLeftAdjust=0;
topLeft.style.display="";
botLeft.style.display="";
topRight.style.display="none";
botRight.style.display="none";
}
//把綜合處理得到的提示框最終位置值設定到對象,其中scrollTop是網頁被捲去的高度,因為style.top是相對整個文檔的而不是瀏覽器視窗,所以要算上滾動隱藏的高度,scrollLeft同理
pltsTipLayer.style.left=MouseX+pltsoffsetX+document.documentElement.scrollLeft+popLeftAdjust+"px";
pltsTipLayer.style.top=MouseY+pltsoffsetY+document.documentElement.scrollTop+popTopAdjust+"px";
return true;
}
//定義事件綁定函數
function PltsInit()
{
document.onmouseover=PltsMouseOver;
document.onmousemove=PltsMouseMove;
}
//呼叫事件綁定函數
PltsInit();

調用方法:把上面的代碼存到一個外部獨立的JS檔案中,然後在網頁頁面中包含這個JS檔案,最後給需要提示的對象加上title屬性,圖片可以加alt屬性就可以了。舉例:<a href="#" title="{完整標題}完整標題文字">縮寫標題</a> 或 <img src="#" alt="圖片提示" />

相關連結:
1、http://www.cnblogs.com/czh-liyu/archive/2007/12/30/1021146.html
2、http://boxover.swazz.org
3、http://blog.csdn.net/lanmao100/archive/2008/10/31/3191767.aspx

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.