专栏首页HTML5学堂如何修改alert样式

如何修改alert样式

HTML5学堂:无论是PC还是移动端,系统自带alert样式总是让人感觉很丑陋,今天就教大家如何修改alert弹窗样式。

只能自定一个弹窗样式

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

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

一行代码替换alert()方法

window.alert = function() {};

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

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

实现自定义alert()方法的步骤

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

确定结构

<div>
    <p>alert内容</p>
    <div>确定</div>
</div>

使用JS处理结构

于是有了下面这段代码:

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

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

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

优化当前的JS代码

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

window.alert = alert;
function alert(data) {
    var a = document.createElement("div"),
        p = document.createElement("p"),
        btn = document.createElement("div"),
        textNode = document.createTextNode(data ? data : ""),
        btnText = document.createTextNode("确定");
    // 内部结构套入
    p.appendChild(textNode);
    btn.appendChild(btnText);
    a.appendChild(p);
    a.appendChild(btn);
    // 整体显示到页面内
    document.getElementsByTagName("body")[0].appendChild(a);
 
    // 确定绑定点击事件删除标签
    btn.onclick = function() {
        a.parentNode.removeChild(a);
    }
}

样式控制

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

function css(targetObj, cssObj) {
    for(var i in cssObj) {
        targetObj.style[i] = cssObj[i];
    }
}

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

css(target, {
    “background-color” : “red”,
    “text-align” : “center”,
})

wait wait,还没完

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

function css(targetObj, cssObj) {
    var str = targetObj.getAttribute("style") ? targetObj.getAttribute("style") : "";
    for(var i in cssObj) {
        str += i + ":" + cssObj[i] + ";";
    }
    targetObj.style.cssText = str;
}

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

完成版的alert功能

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

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>HTML5学堂 - alert</title>
</head>
<body>
    <script>
        window.alert = alert;
        function alert(data) {
            var a = document.createElement("div"),
                p = document.createElement("p"),
                btn = document.createElement("div"),
                textNode = document.createTextNode(data ? data : ""),
                btnText = document.createTextNode("确定");
            // 控制样式
            css(a, {
                "position" : "fixed",
                "left" : "0",
                "right" : "0",
                "top" : "20%",
                "width" : "100px",
                "margin" : "0 auto",
                "background-color" : "#f00",
                "font-size" : "20px",
                "text-align" : "center"
            });
            css(btn, {
                "background" : "blue",
            })
            // 内部结构套入
            p.appendChild(textNode);
            btn.appendChild(btnText);
            a.appendChild(p);
            a.appendChild(btn);
            // 整体显示到页面内
            document.getElementsByTagName("body")[0].appendChild(a);
 
            // 确定绑定点击事件删除标签
            btn.onclick = function() {
                a.parentNode.removeChild(a);
            }
        }
        function css(targetObj, cssObj) {
            var str = targetObj.getAttribute("style") ? targetObj.getAttribute("style") : "";
            for(var i in cssObj) {
                str += i + ":" + cssObj[i] + ";";
            }
            targetObj.style.cssText = str;
        }
        alert(123);
    </script>
</body>
</html>

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

本文章内容小编:HTML5学堂-其其。耗时3h~

本文分享自微信公众号 - HTML5学堂(h5course-com),作者:HTML5学堂

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-03-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 开发图片预加载框架

    HTML5学堂:在此前的一篇文章当中,我们讲解了图片预加载,对图片预加载的知识以及原理等内容均进行了一些讲解。对于我们开发人员来说,几乎每个移动端的项目(专题类...

    HTML5学堂
  • 了解页面重构吗?

    了解页面重构吗? 正文 HTML5学堂:在HTML5的职业发展当中,存在着一种职位叫做“页面重构师”,这种职位到底是什么?又和我们的HTML5开发工程师、WEB...

    HTML5学堂
  • 2016.07 第3周 群问题分享

    HTML+CSS 怎么实现输入框高度自适应 2016.07.18~2016.07.22 核心内容 contenteditable 问题解析 因为textarea...

    HTML5学堂
  • JavaScript---网络编程(1)-介绍、变量、运算符与语句

    JavaScript也是一种编程语言。并不是Java的分支哦。 可以直接在浏览器中运行的编程语言。

    谙忆
  • 【学习】七天搞定SAS(六):宏的编写、程序调错

    在SAS各种繁杂的PROC之后,还要来看看MACRO才可以嘛。又不能写函数... SAS中的MACRO:宏编写 MACRO主要是DO和%LET的各种组合,前者负...

    小莹莹
  • 记一次网络诈骗追踪过程

    本文素材均来源于真实事件,有关细节因隐私问题暂时隐去。事件是近日的某天,一位朋友通过微信联系到我,当时我正沉浸在LOL被坑的苦恼中…… ? 一开始我以为是咸鱼...

    FB客服
  • GT3.1 简化您的App性能测试(3)——原理讲解,溯本求源续

    在上一章的内容中,GT君为大家介绍了CPU、内存、流量、流畅度等不同维度检测的实现原理。在本章中GT君将继续从页面启动时长维度、布局的构建与绘制维度、数据库操作...

    腾讯移动品质中心TMQ
  • Vue 与小程序:父组件给子组件传值的区别

    wsuo
  • SDNLAB技术分享(十四):ONOS项目介绍(下)

    第二部分,创新项目及ONOS特性增强项目介绍 NFV相关 随着云计算、SDN、虚拟化等理念和技术的不断成熟,以通用替代专有将原本传统专业的网元设备上的网络功能提...

    SDNLAB
  • LeetCode Weekly Contest 25 之 545.Boundary of Binary Tree

    这道题考的是树的各种遍历,还是比较难的,早上刚复习了树的三种迭代遍历,否则让我用递归的方法还真的搞不定。题目的大致意思是说,先遍历根的【左边界】,并且输出,然后...

    用户1147447

扫码关注云+社区

领取腾讯云代金券