修改弹窗Style

只能自定一个弹窗样式

首先必须明白的一点是,alert只是一个方法,而这个方法内部是native code,这是我们无法修改的部分,而最终暴露的只有这个alert方法名字而已,你甚至拿不到alert的属性,因此要真正意义上的做到修改alert样式是不可行的。

有了以上这个条件基础,我们能做的只有重写alert方法,替换掉系统自带的alert方法。

一行代码替换alert方法

  1. window.alert = function {};

看到这,就有很多人已经明了了,首先你可以先写好一个假的弹窗样式,然后通过这种方式显示出来,这种是html css js 三方同时更改达到效果,你也可以全部都JavaScript去完成结构样式的操作,今天我们的示例就是全部通过js来完成结构样式控制。

明确了基本方式是通过替换alert方法,那么就开始进一步的思考实现步骤。

实现自定义alert方法的步骤

确定弹窗样式HTML结构 —— 结构插入 —— 样式控制 —— 点击确定删除结构

确定结构

  1. <div>
  2. <p>alert内容</p>
  3. <div>确定</div>
  4. </div>

使用JS处理结构

于是有了下面这段代码:

  1. window.alert = alert;
  2. function alert(data) {
  3. var a = document.createElement("div"),//创建最外围标签
  4. p = document.createElement("p"),//创建显示内容的p标签
  5. btn = document.createElement("div"),//创建按钮标签
  6. textNode = document.createTextNode(data),//创建一个文字节点
  7. btnText = document.createTextNode("确定");//创建文字节点
  8. // 内部结构套入
  9. p.appendChild(textNode);//将需要显示的内容节点插入p标签内
  10. btn.appendChild(btnText);//将按钮文字插入按钮标签
  11. a.appendChild(p);//将p标签插入外围div
  12. a.appendChild(btn);//将按钮插入外围div
  13. // 整体显示到页面内
  14. document.getElementsByTagName("body")[0].appendChild(a);
  15. }

这 里为什么不直接用window.alert = function {};方法呢,这里考虑预编译时并不会对window.alert进行赋值,如果用这种方式写的话,在window.alert = function {} 之前调用alert还会是系统自带alert。

当你初步调用alert时,如果不传参数会报错,那么我们需要一个data的判 断,textNode = document.createTextNode(data)就可改成textNode = document.createTextNode(data ? data : "")

优化当前的JS代码

接下来我们会发现,我们还缺少样式和确定关闭功能。这里完全可以用DOM0级事件绑定。代码很快变成了这样:

  1. window.alert = alert;
  2. function alert(data) {
  3. var a = document.createElement("div"),
  4. p = document.createElement("p"),
  5. btn = document.createElement("div"),
  6. textNode = document.createTextNode(data ? data : ""),
  7. btnText = document.createTextNode("确定");
  8. // 内部结构套入
  9. p.appendChild(textNode);
  10. btn.appendChild(btnText);
  11. a.appendChild(p);
  12. a.appendChild(btn);
  13. // 整体显示到页面内
  14. document.getElementsByTagName("body")[0].appendChild(a);
  15. // 确定绑定点击事件删除标签
  16. btn.onclick = function {
  17. a.parentNode.removeChild(a);
  18. }
  19. }

样式控制

还剩下最后一个样式控制问题。为了写起来更美观更方便,我们需要写一个方法来控制样式。

  1. function css(targetObj, cssObj) {
  2. for(var i in cssObj) {
  3. targetObj.style[i] = cssObj[i];
  4. }
  5. }

这样我们就可以通过如下方式控制样式:

  1. css(target, {
  2. “background-color” : “red”,
  3. “text-align” : “center”,
  4. })

wait wait,还没完

测试后发现,如上的这种样式书写方式,IE8下面有渲染问题,那我们换成cssText。所以,样式控制代码改为——>

  1. function css(targetObj, cssObj) {
  2. var str = targetObj.getAttribute("style") ? targetObj.getAttribute("style") : "";
  3. for(var i in cssObj) {
  4. str += i + ":" + cssObj[i] + ";";
  5. }
  6. targetObj.style.cssText = str;
  7. }

这样咱就解决IE8的尴尬了,但是同时也带来了其他问题,字符串拼接,有可能会出现重复属性,因此如果你需要做一个通用的,还需要对字符串进行查重,但对于本例来说完全够用了。

完成版的alert功能

我们的demo就成了这样(样式还是自己调吧,下面的样式只是做个示范):

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>HTML5学堂 - alert</title>
  6. </head>
  7. <body>
  8. <script>
  9. window.alert = alert;
  10. function alert(data) {
  11. var a = document.createElement("div"),
  12. p = document.createElement("p"),
  13. btn = document.createElement("div"),
  14. textNode = document.createTextNode(data ? data : ""),
  15. btnText = document.createTextNode("确定");
  16. // 控制样式
  17. css(a, {
  18. "position" : "fixed",
  19. "left" : "0",
  20. "right" : "0",
  21. "top" : "20%",
  22. "width" : "100px",
  23. "margin" : "0 auto",
  24. "background-color" : "#f00",
  25. "font-size" : "20px",
  26. "text-align" : "center"
  27. });
  28. css(btn, {
  29. "background" : "blue",
  30. })
  31. // 内部结构套入
  32. p.appendChild(textNode);
  33. btn.appendChild(btnText);
  34. a.appendChild(p);
  35. a.appendChild(btn);
  36. // 整体显示到页面内
  37. document.getElementsByTagName("body")[0].appendChild(a);
  38. // 确定绑定点击事件删除标签
  39. btn.onclick = function {
  40. a.parentNode.removeChild(a);
  41. }
  42. }
  43. function css(targetObj, cssObj) {
  44. var str = targetObj.getAttribute("style") ? targetObj.getAttribute("style") : "";
  45. for(var i in cssObj) {
  46. str += i + ":" + cssObj[i] + ";";
  47. }
  48. targetObj.style.cssText = str;
  49. }
  50. alert(123);
  51. </script>
  52. </body>
  53. </html>

最 后总结下,本例运用到的知识点,DOM操作、预编译期与执行、for-in循环,cssText。本文的主要目的在于引导思路,无论做什么项目,思路很重 要,要懂得变通,如果你想通过某些属性去修改alert样式,那你想破头都想不出,所有效果实现方法都不是唯一的,仅仅只是需要一个你想要的alert样 式,完全可以“造假”,合理利用“造假”的方法,可以使你的效果写起来比别人轻松很多。

时间: 2024-10-11 18:39:39

修改弹窗Style的相关文章

Endnote从头开始五:修改output style(转载)

Endnote从头开始五:修改output style Endnote中虽然有大量的期刊格式,但是并不能囊括所有我们需要的style,所以学会自己制作或编辑已有的期刊格式是很重要的,本节内容是Endnote的高阶操作. 1 打开EndNote\Edit\OutPut Styles\New Style… 先看第一项 About This Style 2 看第二项,Anonymous Works,这项也不用管它 3 看第三项 Page Numbers,这一项可以做一些选择: 4 Journal Na

自定义弹窗Style样式

由于系统默认alert弹出窗口不能自定义样式,有可能不符合网站的风格,虽然网上应该有很多这样的JS 但是还是自己写的比较放心,顺便练习一下对DOM的操作 支持IE6下的SELECT不能遮罩的问题,谷歌支持圆角,IE6下就比较丑了,四四方方的,不过可以自定义自己喜欢的样式 听取建议后,修改了position:fixed, IE6下用hack处理了. 点击看效果: 点击模拟Alert弹出框 点击模拟Alert弹出框 点击模拟Alert弹出框 所需CSS: <style type="text/c

如何修改element.style内联样式;

我们在写前面 web页面样式的时候,会发现有些时候,我们怎么修改 style里面的值,页面上的样式都不会修改,当你用工具查看时,会发现里面会有 element.style的值,这个值还找不到是在哪里出现的,还修改不了. 其实element.style是一种内联样式,很多情况下是在一些JavaScript代码里写死的,这种方法相当不好.但是有些时候,我们在使用第三方js文件时,会遇到.哪么我们如何去修改它呢,在才源代码中   用!important 语法优先权来实现我们想要的效果. 举个例子: 默

如何修改element.style样式

相信很多朋友在修改主题css时遇到过一些问题,比如说出现这个elememt.style,这个有时候无法直接修改,因为找不到.因此可以通过css中的 !important 语法优先权来实现我们想要的效果. 举个例子: 默认情况下上面的背景颜色是绿色,我们找不到element.style该怎么修改呢,这时候就可以在下面CSS样式表里面修改: 如上图,在css样式表里面加入一个背景样式background:#FFFFFF ! important ,可以看到的是最上面的绿色被禁用,白色就是优先显示了.

修改element.style 的css样式

有时候没有设置css但是会自动出现css,使我们调整css不好调 可以在你要强制改变的css后加 ! important即可强制更改

商务通弹窗破解方法

之前的破解的原理:伪造图片Map点击欺骗商务通识别来实现更换图片和点击,这种方法代码使用很少效果也好,但是必须要付费400修改过的用户才能使用.破解后商务通所有功能仍可以继续使用,如:邀请.强制邀请现在的破解原理:重构弹窗JS调用来进行破解弹窗,经过分析,商务通在弹出邀请对话框时会调用一个function LR_showInviteDiv(h1,h2),然而我们只需要在页面中进行再次重构这个调用,商务通就会默认来调用重构的调用从而实现破解弹窗效果..此方法针对初始用户,开通了商务通却没有付款修改

SuperMap 二维地图和三维场景弹窗窗口大小控制

注:此处所说的弹窗窗口,主要指的是那些弹窗窗口中嵌入iframe,包含信息页面的窗口大小控制. 1.首先来了解下 SuperMap 示例中的处理方案 二维的处理方式 1 //初始化Anchored类 2 popup = new SuperMap.Popup.Anchored( 3 "chicken", 4 marker.getLonLat(), 5 new SuperMap.Size(220,140), 6 "<iframe frameborder=no border=

编写可拖拽的弹窗

可拖拽的弹窗 在刚刚重构完的项目中使用到了element ui框架,踩了不少坑也学到了不少的东西.其中比较麻烦的是它的dialog弹窗组件是无法移动拖拽的,然而客户又强烈的要求一定要有这个功能,所以就自己写了个可拖拽的弹窗组件.虽然拖拽起来不是很流畅,但是也算是满足要求了. 1. 实现原理 主要的实现原理还是获取鼠标在div中的位置,获取位置后设置div的left和top来达到div跟随鼠标移动的效果.因为写的是vue,所以利用了vue的自定义指令来操作dom. 2. 实现步骤 2-1 设计盒子

javascript:第五章 练习 修改文本框的值

<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>分类名称</title> <style> h2,ul,li{margin:0;padding:0;} #list{height:149px;width:570px;margin