资讯专栏INFORMATION COLUMN

一个气泡提示的Javascript控件

z2xy / 3606人阅读

摘要:功能很简单,就是可以在文本框下面显示一个气泡提示,如上图。只要在文本框启用,提交时内容为空时就会出现如图提示。

某日,忽的想写个js小控件。功能很简单,就是可以在文本框下面显示一个气泡提示,如上图。图是Chrome里截来的,是Chrome原生的提示样式。只要在文本框启用『required』,提交时内容为空时就会出现如图提示。

首先第一步,该是要构建一个提示文字的HTML模型,那么弹出提示时就可以被重复构建了(如上图)。

</>复制代码

  1. 提示文字..

HTML模型包含两个部分,提示文字和一个啥也没有是div,那个div就是用来显示提示消息上方的小三角的~因此,我们还需要一些CSS来定义赋予样式。

</>复制代码

  1. .megbox{
  2. position: absolute;
  3. background-color: #FFF;
  4. border: 1px solid #a4acb5;
  5. padding: 5px 10px;
  6. border-radius: 5px;
  7. z-index: 100;
  8. }
  9. .megbox_top{
  10. width: 13px;
  11. height: 7px;
  12. position: absolute;
  13. background: url(./images/up.gif) no-repeat;
  14. top: -7px;
  15. }
  16. .megbox_meg{
  17. padding-left: 25px;
  18. background: url(./images/warning.gif) no-repeat;
  19. line-height: 20px;
  20. }
  21. .megbox_txt{}/* 暂且保留,说不定以后加点什么样式~~ */

CSS一共需要调用到两张背景图: 

因为气泡提示基本上是悬浮在文本框上方的,所以不会被计入正常流中,因此通过「position: absolute」属性使其脱离正常流。

接下来就是Javascript的部分了。因为本人大学学的是C++,所以对面向对象比较钟情,所以就用面向对的方法来开发这个js控件。

首先,定义一下我们需要那些属性和方法:

属性:

element:气泡指向的文本框元素,姑且称之为目标元素吧~;

message:消息提示的内容;

id:说不定我们需要弹出好多个提示框,所以我们需要一个唯一标识来区隔它们~;

方法:

Show:显示气泡提示;

Remove:移除气泡;

OK,首先写个构造函数,这个类就叫MessageBox吧~

</>复制代码

  1. MessageBox = function(element, id, message)
  2. {
  3. // Init value
  4. this.message = "";
  5. this.element = undefined;
  6. this.id = "";
  7. this.message = message;
  8. this.element = element;
  9. this.id = id;
  10. };

接着就是完成两个方法了~

Show——首先要解决两个问题:

插入DOM元素;

显示在哪儿?

第一个问题好解决,查一查W3School就O了~

第二个,因为我们是用绝对定位,而且是要显示在目标元素附近。因此就需要知道目标元素的位置。这个嘛…就要Google一下了。

我参照了这位大牛的函数——阮一峰。

略做修改后,如下:

</>复制代码

  1. document.getElementView = function (element)
  2. {
  3. if(element != document)
  4. return {
  5. width: element.offsetWidth,
  6. height: element.offsetHeight
  7. }
  8. if (document.compatMode == "BackCompat"){
  9. return {
  10. width: document.body.clientWidth,
  11. height: document.body.clientHeight
  12. }
  13. } else {
  14. return {
  15. width: document.documentElement.clientWidth,
  16. height: document.documentElement.clientHeight
  17. }
  18. }
  19. };
  20. document.getElementLeft = function (element)
  21. {
  22. var actualLeft = element.offsetLeft;
  23. var current = element.offsetParent;
  24. while (current !== null){
  25. actualLeft += current.offsetLeft;
  26. current = current.offsetParent;
  27. }
  28. return actualLeft;
  29. };
  30. document.getElementTop = function (element)
  31. {
  32. var actualTop = element.offsetTop;
  33. var current = element.offsetParent;
  34. while (current !== null){
  35. actualTop += current.offsetTop;
  36. current = current.offsetParent;
  37. }
  38. return actualTop;
  39. };

把他们都作为document方法加进入了~这样似乎不太好,最安全的做法应该是作为MessageBox的私有方法。不过个人喜欢啦~

Remove的话就是把创建的元素删除而已~

最后方法定义如下:

</>复制代码

  1. MessageBox.prototype = {
  2. constructor : MessageBox, // 声明构造函数
  3. Show : function()
  4. {
  5. if(!this.element) return false;
  6. if(this.element.box)
  7. this.element.box.Remove(true);
  8. var megbox = document.createElement("div");
  9. megbox.className = "megbox";
  10. megbox.id = "megbox_" + this.id; //把id加上前缀,作为气泡的id
  11. var megbox_top = document.createElement("div");
  12. megbox_top.className = "megbox_top";
  13. var megbox_meg = document.createElement("div");
  14. megbox_meg.className = "megbox_meg";
  15. var megbox_txt = document.createElement("div");
  16. megbox_txt.className = "megbox_txt";
  17. var megs=document.createTextNode(this.message);
  18. megbox.appendChild(megbox_top);
  19. megbox.appendChild(megbox_meg);
  20. megbox_meg.appendChild(megbox_txt);
  21. megbox_txt.appendChild(megs);
  22. this.element.box = this;
  23. document.getElementsByTagName("body")[0].appendChild(megbox);
  24. var node_view = document.getElementView(this.element);
  25. var node_top = document.getElementTop(this.element);
  26. var node_left = document.getElementLeft(this.element);
  27. megbox.style.top = (node_top + node_view.height + 5) + "px";
  28. megbox.style.left = node_left + "px";
  29. return true;
  30. },
  31. Remove : function()
  32. {
  33. var id = this.id;
  34. var node = document.getElementById("megbox_" + id);
  35. if(node)
  36. {
  37. node.parentNode.removeChild(node);
  38. return true;
  39. }
  40. return false;
  41. }
  42. };

因为提示框显示在目标元素下方,因此提示框绝对定位的

top = nodetop + nodeview.height + 5 ;(如下图)

加上5px是为了避免提示框贴在文本框底部。

如此,气泡提示控件就完成了,调用时如下:

</>复制代码

  1. var test = document.getElementById("test");
  2. var Box = new MessageBox(test, 1, "Test Message..");
  3. Box.Show(); // Show the MessageBox
  4. // -----------------------------------
  5. if(Box instanceof MessageBox) Box.Remove(); // Remove MessageBox

最后,附上增强版MessageBox——下载地址››

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/110824.html

相关文章

  • 一个气泡提示Javascript控件

    摘要:功能很简单,就是可以在文本框下面显示一个气泡提示,如上图。只要在文本框启用,提交时内容为空时就会出现如图提示。 showImg(http://segmentfault.com/img/bVbrGa); 某日,忽的想写个js小控件。功能很简单,就是可以在文本框下面显示一个气泡提示,如上图。图是Chrome里截来的,是Chrome原生的提示样式。只要在文本框启用『required』,提交...

    DataPipeline 评论0 收藏0
  • 一个气泡提示Javascript控件

    摘要:功能很简单,就是可以在文本框下面显示一个气泡提示,如上图。只要在文本框启用,提交时内容为空时就会出现如图提示。 showImg(http://segmentfault.com/img/bVbrGa); 某日,忽的想写个js小控件。功能很简单,就是可以在文本框下面显示一个气泡提示,如上图。图是Chrome里截来的,是Chrome原生的提示样式。只要在文本框启用『required』,提交...

    VPointer 评论0 收藏0
  • APICloud Github 5大开源项目集合展示

    摘要:自成立之初,一直秉承着开源一切的初心,为了给予广大开发者们更多的资源及内容。借此,官方将开源项目进行分类和介绍,使开发者们更好的去了解去使用。更多的开源项目均在中。 APICloud自成立之初,一直秉承着开源一切的初心,为了给予广大开发者们更多的资源及内容。不知不觉,2年时间已过,APICloud的github上已经集合了APICloud模块、前端框架及文档、云API SDK、开发工具...

    caspar 评论0 收藏0
  • APICloud Github 5大开源项目集合展示

    摘要:自成立之初,一直秉承着开源一切的初心,为了给予广大开发者们更多的资源及内容。借此,官方将开源项目进行分类和介绍,使开发者们更好的去了解去使用。更多的开源项目均在中。 APICloud自成立之初,一直秉承着开源一切的初心,为了给予广大开发者们更多的资源及内容。不知不觉,2年时间已过,APICloud的github上已经集合了APICloud模块、前端框架及文档、云API SDK、开发工具...

    EscapedDog 评论0 收藏0

发表评论

0条评论

z2xy

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<