<a href="#" onclick=""> 不能不知道的技巧

在一个超链接中 可以使用href 和onlick,有时要在A的标记同时使用,在同时使用时,有时让href起作用或者失效,那么如何设计呢?

使用javascript的时候,通常我们会通过类似:
<a href="#" onclick="javascript:方法">提交</a>
的方式,通过一个伪链接来调用javascript方法.

这种方法有一个问题是:
虽然点击该链接的时候不会跳转页面.但是滚动条会往上滚,解决的办法是返回一个false.
如下所示:


<a href="#" onclick="javascript:方法;return false;">提交</a>

有时恰好要利用锚记功能,再比如 给Micolog博客加简单的回复功能所使用的代码

<a href="#commentarea" onclick="return backcomment('{{comment.author}}');">回复</a>

//回复自动输入姓名函数
function backcomment(msg){
backdb=document.getElementById('comment');
backdb.value="@"+msg;
return true;
}

<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"> <html> <head id="Head1"> <title> 领丰集团--MES </title> <link href="Inc/Css/login/css/bootstrap.min.css" rel="stylesheet" type="text/css" /> <link href="Inc/Css/login/css/ace.min.css" rel="stylesheet" type="text/css" /> <link href="Inc/Css/login/css/ace-rtl.min.css" rel="stylesheet" type="text/css" /> <link href="Inc/Css/login/css/icon.css" rel="stylesheet" type="text/css" /> <!--[if lte IE 8]> <link rel="stylesheet" type="text/css" href="Inc/Css/login/css/ace-ie.min.css" /> <![endif]--> <script src="Inc/Js/Plugs/jQuery/jquery.min.js" type="text/javascript"></script> <script src="Inc/Js/Plugs/jquery/jquery.cookie.js" type="text/javascript"></script> <script type="text/javascript" src="Inc/Js/LoginService.js"></script> <script type="text/javascript"> //如果为移动设备自动转址到设动版 $(document).ready(function () { //return; var href = window.location.href; var v_loginame = $.cookie("loginame"); //若存在用户名cookie if (v_loginame) { $("#uid").val(v_loginame); $("#uid").focus(); //接收从main页面返回的error =1错误信息,并弹出! if (href.indexOf("error=1") != -1)at $("#errormsg").html("请求已超时,请重新登入MES系统!"); } else $("#uid").focus(); //键盘确认时进行登陆验证 document.onkeydown = function (e) { var ev = window.event || e; if (ev.keyCode == 13) { CheckLogin(); } }; $("#btnPassword").click(GetPassword); $("#resetpassword").click(ResetPassword); }); window.onload = function () { var href = window.location.href; var uid, pwd; //SSO转向JXC登录验证 if (href.indexOf("UID=") > -1 && href.indexOf("PWD=") > -1) { uid = AccountLogin.Base64ToString(href.split("UID=")[1].split("&")[0]).value; pwd = AccountLogin.Base64ToString(href.split("PWD=")[1].split("&")[0]).value; $("#uid").val(uid); //验证是否有动态密码验证 CheckType(); $("#pwd").val(pwd); CheckLogin(); } }; //验证账号或口令卡 function CheckLogin() { var loginame, pwd, dypasswd, ret, p_issso, p_isdpt, p_isOpenDpt, p_isUseOpt; loginame = $("#uid").val(); if (loginame.length == 0) { $("#accounterror").html("账号不能为空!"); return; } pwd = $("#pwd").val(); if (pwd.length == 0) { $("#passworderror").html("密码不能为空"); return; } //取得sso的验证开关 p_issso = AccountLogin.GetConfigSet("IsSSOValid").value; if (p_issso != "0") { dypasswd = $("#dypasswd").val(); p_isUseOpt = AccountLogin.IsValidOtp(loginame).value; if (p_isUseOpt.split(&#39;,&#39;)[0] == "Y" && dypasswd.length == 0) { $("#passworderror").html("账号:" + loginame + "已启用动态密码验证,动态密码不能为空!"); return; } ret = AccountLogin.CheckSSOLogin(loginame, pwd, dypasswd).value; var key = ret.split(","); if (key[0] == "Y") { checkBILogin(p_issso); } else { //口令与密码验证不通过时 $("#dypasswd").val(""); if (key.length > 0) { $("#pwd").val("").focus(); alert(key[1]); } return; } } else { checkBILogin(p_issso); } } function onloadUI() { var wh = ($(window).width() - 725) / 2; $("#loginbanner").animate({ left: wh }, 0); $("#downdiv").animate({ left: 55 }, 0); $("#person").animate({ left: wh }, 0); window.setTimeout("LoadPanner()", 100); // showNote(); } function LoadPanner() { var wh = ($(window).width() + 100) / 2; $("#loginpanner").animate({ left: wh }, 0); } function CancelLogin() { $("#uid").val("").focus(); $("#pwd").val(""); } function ResetLogin(p_button) { if (p_button.reset) { p_button.reset.style.display = "block"; } else { var v_div = document.createElement(&#39;div&#39;); p_button.parentNode.appendChild(v_div); p_button.reset = v_div; v_div.style.position = "absolute"; v_div.style.top = p_button.offsetTop + p_button.offsetHeight + "px"; v_div.style.left = "0px"; v_div.style.width = "100%"; v_div.style.height = "90px"; v_div.style.paddingTop = "3px"; var v_iframe = document.createElement(&#39;iframe&#39;); v_div.appendChild(v_iframe); v_iframe.src = "Reset.aspx"; v_iframe.style.width = "100%"; v_iframe.style.height = "100%"; v_iframe.style.border = "solid 1px #90D1F1"; v_iframe.style.overflow = "hidden"; } p_button.blur(); } function Printhelp() { var url = " http://" + document.URL.split(&#39;/&#39;)[2] + "/sso/Inc/help/printhelp.doc"; window.location.href = url; } //用户验证方式检测 function CheckType() { var loginame = $("#uid").val(); if (loginame == "") { //初始化 retset(); return; } var p_isdpt = AccountLogin.GetConfigSet("IsDPWValid").value; //开启动态口令卡验证 if (p_isdpt == "1") { ret = AccountLogin.IsValidOtp(loginame).value; if (ret.split(&#39;,&#39;)[0] == "Y") { $("#dypasswd,#dyptext").show(); } else $("#dypasswd,#dyptext").hide(); } loadFact(loginame); } function loadFact(loginame) { $("#factno").empty(); $("#errormsg").html(""); var fxml = AccountLogin.GetFactList(loginame).value; if (fxml.replace("<NewDataSet />", "").length == 0) { $("#errormsg").html("请选择登陆厂别!"); return; } var option = ""; if ($.browser.msie) { var XMLDom = new ActiveXObject("Microsoft.XMLDOM"); XMLDom.loadXML(fxml); } else XMLDom = fxml; $(XMLDom).find("Data").each(function () { option += "<option value=&#39;" + $(this).find(&#39;FACTNO&#39;).text().trim() + "&#39;>" + $(this).find(&#39;FACTNAME&#39;).text() + "</option>"; }); $("#factno").append(option); $("#factno").find("option[0]").attr("selected", true); } function retset() { $("#uid").val("").focus(); $("#pwd").val(""); $("#dypswd,#dypswdvalue").hide(); } function show_box(id) { $(&#39;.widget-box.visible&#39;).removeClass(&#39;visible&#39;); $(&#39;#&#39; + id).addClass(&#39;visible&#39;); } function GetPassword() { var email = $("#useremail").val(); var type = "false"; if ($.trim(email).length > 0) { if (isEmail(email)) { type = "true"; } $.ajax({ type: "POST", async: false, dataType: "text", cache: false, url: "UI/Handler.ashx", data: { MothodName: "Email", p_email: email, p_type: type }, contentType: "application/x-www-form-urlencoded", error: function (xhr, ajaxOptions, thrownError) { window.document.write(xhr.responseText + thrownError); }, success: function (res) { alert(res); } }); } else alert("请输入账号或邮件地址!"); } function isEmail(str) { var reg = /^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/; return reg.test(str); } function ResetPassword() { var r_message = ""; var v_old = document.getElementById(&#39;old&#39;), v_new = document.getElementById(&#39;new&#39;); if (v_old.value == "" || v_new.value == "") { alert("输入密码不能为空值!"); return; } if (v_old.value != v_new.value) { alert("输入密码不一致!"); return; } $.ajax({ type: "POST", async: false, dataType: "text", cache: false, url: "UI/Handler.ashx", data: { MothodName: "Update", p_hash: request["hash"], p_pwd: v_old.value }, contentType: "application/x-www-form-urlencoded", error: function (xhr, ajaxOptions, thrownError) { window.document.write(xhr.responseText + thrownError); }, success: function (res) { r_message = res; } }); if (r_message) { alert("密码重置成功!"); window.location.assign("Login.aspx"); } else { alert("密码重置失败,请联通络系统维护人员!"); } } function CheckOS() { var x = navigator.userAgent.match(/x86_64|Win64|WOW64/) || navigator.cpuClass === &#39;64&#39; ? &#39;64&#39; : &#39;32&#39;; if (x == "64") { $("#printDownload").html(&#39;[ <a name="Alang" id="A1" href="/lfxj/slPrint_x64V2.1_aliyun.zip">报表列印控件下载</a> ]&#39;); $("#ExplorerDownload").html(&#39;[ <a name="Alang" id="A1" href="/lfxj/chrome64.exe">浏览器下载</a> ]&#39;); } else { $("#printDownload").html(&#39;[ <a name="Alang" id="A2" href="/lfxj/slPrint_x86V2.1_aliyun.rar">报表列印控件下载</a> ]&#39;); $("#ExplorerDownload").html(&#39;[ <a name="Alang" id="A2" href="/lfxj/chrome32.exe">浏览器下载</a> ]&#39;); } } </script> <style type="text/css"> .login-layout { background: url(&#39;Inc/Css/login/css/img/bg/bg-05.jpg&#39;) #f3f3f3; } .login-container { width: 500px; margin: 0px auto; margin-top: 2%; } .login-layout .widget-box { visibility: hidden; position: absolute; overflow: hidden; width: 100%; border-bottom: 0px; box-shadow: none; padding: 6px; background-color: #fff; -webkit-transform: scale(0, 1) translate(-150px); } .error { color: Red; } </style> </head> <body class="login-layout" onload="CheckOS()"> <form name="form2" method="post" action="./login.aspx?ReturnUrl=%2flfxj%2fMain.aspx%3fuid%3dlfit002%26pwd%3d251289&error=1" id="form2"> <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE2MzM0MzM0MDBkZOHjsIIU57s89WK6gN8Mco90VTSSMfOvi5xlFACzUNlb" /> <script type="text/javascript" src="/lfxj/ajaxpro/prototype.ashx"></script> <script type="text/javascript" src="/lfxj/ajaxpro/core.ashx"></script> <script type="text/javascript" src="/lfxj/ajaxpro/converter.ashx"></script> <script type="text/javascript" src="/lfxj/ajaxpro/AccountLogin,App_Web_cbhnaljf.ashx"></script> <input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="EEDA5EB3" /> <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEdAAIxWz1UdzUxzn5dgMn23JQTWSBi3t7AiBe0pTmtLU9og20iuEUbb0xsJDsF2zq1w8jftRNcTcPUX+wGarsyFFCf" /> <div class="login-container"> <div class="center"> <h1> <i class="icon-leaf green"></i><span class="red">LFMES</span> <span class="white">领丰电子--MES</span> </h1> <h4 class="blue"> © LinFeng CO.LTD</h4> </div> <div class="space-6"> </div> <div class="position-relative"> <div id="login-box" class="login-box visible widget-box no-border"> <div class="widget-body"> <div class="widget-main"> <h4 class="header blue lighter bigger"> <i class="icon-coffee green"></i>请输入您的账号密码 </h4> <fieldset> <label class="block clearfix"> <span class="block input-icon input-icon-right">账号: <input type="text" id="uid" class="form-control" onblur="CheckType();" value="xctest" /> <i class="icon-user"></i></span> </label> <label class="block clearfix"> <span class="block input-icon input-icon-right">密码: <input type="password" id="pwd" class="form-control" value="" /> <i class="icon-lock"></i></span> </label> <label class="block clearfix" > <span class="block input-icon input-icon-right">公司: <select id="factno" class="form-control"> </select> </span> <span class="block input-icon input-icon-right" style="display:none"> <input type="radio" name="profact_mk" checked value="1" style="display:none"/> </span> <span id="errormsg" class="error"></span> </label> <label class="block clearfix" style="display:none"> <span class="block input-icon input-icon-right" id="dypwd"> <label id="dyptext" style="display: none"> 动态密码:</label> <input type="password" id="dypasswd" style="display: none" class="form-control" value="" /> <i class="icon-lock"></i></span> </label> <div class="clearfix"> <div id="div_lang"> <label><input type="radio" name="lang" checked="checked" value="zh"/><font color="red"> [ 中文 ]</font></label>   <p class="divDownload"> <span id="ExplorerDownload"></span> </p> <p class="divDownload"> <span id="printDownload"></span> </p> </div> <input name="Login" type="button" id="Login" class="width-35 pull-right btn btn-sm btn-primary" value="登入" onclick="CheckLogin()" /> </div> <div class="space-4"> </div> </fieldset> </div> <div class="toolbar clearfix"> </div> </div> </div> <div id="forgot-box" class="forgot-box widget-box no-border"> <div class="widget-body"> <div class="widget-main"> <h4 class="header red lighter bigger"> <i class="icon-key"></i>取回密码 </h4> <div class="space-6"> </div> <fieldset> <label class="block clearfix"> <span class="block input-icon input-icon-right">请输入账号或Email: <input id="useremail" class="form-control" /> <i class="icon-envelope"></i></span> </label> <div class="clearfix"> <button type="button" id="btnPassword" class="width-35 pull-right btn btn-sm btn-danger"> <i class="icon-lightbulb"></i>发 送 </button> </div> </fieldset> </div> <div class="toolbar center"> <a href="#" onclick="show_box(&#39;login-box&#39;); return false;" class="back-to-login-link"> 返回登录 <i class="icon-arrow-right"></i></a> </div> </div> </div> <div id="signup-box" class="signup-box widget-box no-border"> <div class="widget-body"> <div class="widget-main"> <h4 class="header green lighter bigger"> <i class="icon-group blue"></i>新用户注册 </h4> <div class="space-6"> </div> <fieldset> <label class="block clearfix"> <span class="block input-icon input-icon-right">账号: <input type="email" class="form-control" /> <i class="icon-envelope"></i></span> </label> <label class="block clearfix"> <span class="block input-icon input-icon-right">邮箱: <input type="email" class="form-control" /> <i class="icon-envelope"></i></span> </label> <label class="block clearfix"> <span class="block input-icon input-icon-right">姓名: <input type="text" class="form-control" /> <i class="icon-user"></i></span> </label> <label class="block clearfix"> <span class="block input-icon input-icon-right">密码: <input type="password" class="form-control" /> <i class="icon-lock"></i></span> </label> <label class="block clearfix"> <span class="block input-icon input-icon-right">请重新输入一次密码: <input type="password" class="form-control" /> <i class="icon-retweet"></i></span> </label> <div class="space-24"> </div> <div class="clearfix"> <button type="reset" class="width-30 pull-left btn btn-sm"> <i class="icon-refresh"></i>重置 </button> </div> </fieldset> </div> <div class="toolbar center"> <a href="#" onclick="show_box(&#39;login-box&#39;); return false;" class="back-to-login-link"> <i class="icon-arrow-left"></i>返回登录</a> </div> </div> </div> <div id="reset-box" class="forgot-box widget-box no-border"> <div class="widget-body"> <div class="widget-main"> <h4 class="header red lighter bigger"> <i class="icon-key"></i>重置密码 </h4> <div class="space-6"> </div> <fieldset> <label class="block clearfix"> <span class="block input-icon input-icon-right">新密码: <input id="old" class="form-control" type="password" /> <i class="icon-envelope"></i></span> </label> <label class="block clearfix"> <span class="block input-icon input-icon-right">确认密码: <input id="new" class="form-control" type="password" /> <i class="icon-envelope"></i></span> </label> <div class="clearfix"> <button type="button" id="resetpassword" class="width-35 pull-right btn btn-sm btn-danger"> <i class="icon-lightbulb"></i>确 定 </button> </div> </fieldset> </div> <div class="toolbar center"> <a href="#" onclick="show_box(&#39;login-box&#39;); return false;" class="back-to-login-link"> 返回登录 <i class="icon-arrow-right"></i></a> </div> </div> </div> </div> </div> </form> </body> </html> <!--[if IE 6]> <script type="text/javascript"> DownIE8(); </script> <![endif]-->我打算用postman做接口测试,帮我找出这个网页得接口
09-10
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> <title>🎨 AI 图片生成器 - 智能图像创作平台</title> <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@300;400;500;700&display=swap" rel="stylesheet"> <style> :root { --primary: #6a11cb; --secondary: #2575fc; --accent: #ff6f61; --light: rgba(255, 255, 255, 0.9); --dark-bg: #1a1a2e; --card-bg: rgba(255, 255, 255, 0.12); --shadow: 0 8px 32px rgba(0, 0, 0, 0.15); --transition: all 0.3s ease; --text: white; --border: rgba(255, 255, 255, 0.2); --success: #4caf50; --warning: #ff9800; } .theme-dark { --primary: #1a1a2e; --secondary: #16213e; --card-bg: rgba(30, 30, 40, 0.4); --border: rgba(255, 255, 255, 0.1); --text: #eee; } * { box-sizing: border-box; color-scheme: dark; } body { font-family: &#39;Noto Sans SC&#39;, &#39;Segoe UI&#39;, sans-serif; margin: 0; padding: 0; background: linear-gradient(135deg, var(--primary), var(--secondary)); color: var(--text); min-height: 100vh; position: relative; transition: background 0.5s; } body::before { content: &#39;&#39;; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: url(&#39;https://particles.js.org/images/background.png&#39;); opacity: 0.05; pointer-events: none; z-index: -1; } header { background: rgba(0, 0, 0, 0.4); padding: 1.2rem; text-align: center; box-shadow: 0 4px 12px rgba(0,0,0,0.2); backdrop-filter: blur(10px); } h1 { margin: 0; font-size: 2.4rem; font-weight: 700; text-shadow: 0 2px 8px rgba(0,0,0,0.3); } .tagline { font-size: 1.1rem; opacity: 0.9; margin: 0.5rem 0 0; } nav { margin-top: 1rem; } nav a { color: white; margin: 0 14px; text-decoration: none; font-weight: 500; font-size: 1rem; transition: var(--transition); } nav a:hover { text-decoration: underline; } button.theme-btn { float: right; background: none; border: 1px solid white; color: white; padding: 6px 12px; border-radius: 8px; cursor: pointer; font-size: 0.9rem; } main { display: grid; grid-template-columns: 1fr 380px; gap: 1.5rem; padding: 1rem; max-width: 1400px; margin: 0 auto; } @media (max-width: 900px) { main { grid-template-columns: 1fr; } } .left-panel { display: flex; flex-direction: column; gap: 1.5rem; } .container { background: var(--card-bg); border-radius: 16px; padding: 2rem; box-shadow: var(--shadow); backdrop-filter: blur(10px); border: 1px solid var(--border); transition: var(--transition); } h2 { font-size: 1.5rem; margin-top: 0; color: var(--text); text-shadow: 0 1px 4px rgba(0,0,0,0.3); } p.example { font-size: 0.95rem; opacity: 0.8; margin-bottom: 1.2rem; } label { display: block; margin-top: 1rem; font-size: 1.1rem; font-weight: 500; } input[type="text"], select, input[type="search"] { width: 100%; padding: 14px; margin: 0.5rem 0; border: none; border-radius: 8px; font-size: 1rem; background: rgba(255, 255, 255, 0.2); color: white; outline: none; transition: var(--transition); } input[type="text"]::placeholder, input[type="search"]::placeholder { color: rgba(255,255,255,0.6); } input[type="text"]:focus, input[type="search"]:focus { background: rgba(255, 255, 255, 0.3); transform: translateY(-2px); } button { margin-top: 1.5rem; padding: 14px 28px; background: var(--accent); color: white; border: none; border-radius: 8px; font-size: 1.1rem; cursor: pointer; transition: var(--transition); font-weight: 600; width: 100%; } button:hover { background: #e05a4f; transform: translateY(-2px); box-shadow: 0 6px 14px rgba(255,111,97,0.4); } button:active { transform: translateY(0); } .btn-small { width: auto !important; padding: 8px 16px; font-size: 0.9rem; margin-left: 8px; } .tag { display: inline-block; background: rgba(255,255,255,0.2); padding: 6px 12px; border-radius: 20px; font-size: 0.9rem; margin: 4px; cursor: pointer; transition: 0.3s; } .tag:hover { background: var(--accent); transform: scale(1.05); } #result { margin-top: 1.5rem; text-align: center; min-height: 200px; } #result.loading { color: rgba(255,255,255,0.8); font-style: italic; } #result img { max-width: 100%; max-height: 400px; border-radius: 12px; box-shadow: 0 8px 20px rgba(0,0,0,0.3); border: 4px solid var(--border); margin: 1rem auto; display: block; cursor: zoom-in; } .img-caption { margin-top: 0.5rem; font-size: 0.9rem; opacity: 0.9; } .action-buttons { margin-top: 1rem; display: flex; justify-content: center; gap: 10px; } .thumbnail-wall { display: grid; grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); gap: 10px; margin-top: 1.5rem; } .thumb-item { position: relative; height: 90px; border-radius: 10px; overflow: hidden; box-shadow: 0 4px 10px rgba(0,0,0,0.2); transition: var(--transition); cursor: zoom-in; } .thumb-item:hover::after { content: &#39;❌&#39;; position: absolute; top: 5px; right: 5px; width: 20px; height: 20px; background: rgba(255,0,0,0.7); border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 12px; color: white; z-index: 2; } .thumb-item img { width: 100%; height: 100%; object-fit: cover; } .clear-btn { background: #aaa !important; margin-top: 1rem !important; font-size: 0.9rem !important; } .clear-btn:hover { background: #888 !important; } .stat-item { display: flex; justify-content: space-between; margin: 0.6rem 0; font-size: 0.95rem; } .rank-item { padding: 8px 0; border-bottom: 1px dashed rgba(255,255,255,0.2); } .rank-item:last-child { border-bottom: none; } .notification-bar { background: var(--warning); color: #000; text-align: center; padding: 8px; font-weight: 500; border-radius: 8px; margin-bottom: 1rem; animation: pulse 2s infinite; } @keyframes pulse { 0% { opacity: 0.8; } 50% { opacity: 1; } 100% { opacity: 0.8; } } footer { text-align: center; padding: 1.5rem; margin-top: 3rem; color: rgba(255,255,255,0.6); font-size: 0.9rem; } /* === 全屏预览模态框 === */ .modal { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.9); z-index: 1000; justify-content: center; align-items: center; flex-direction: column; animation: fadeIn 0.3s ease; } .modal.active { display: flex; } .modal-content { max-width: 90vw; max-height: 80vh; border-radius: 10px; box-shadow: 0 0 30px rgba(255, 255, 255, 0.2); overflow: hidden; position: relative; } .modal-content img { max-width: 100%; max-height: 80vh; display: block; } .modal-caption { margin-top: 1rem; font-size: 1rem; color: white; text-align: center; max-width: 90vw; } .close-modal { position: absolute; top: 15px; right: 20px; font-size: 2rem; color: white; background: none; border: none; cursor: pointer; opacity: 0.8; } .close-modal:hover { opacity: 1; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } /* === 加载动画 === */ .loader { border: 5px solid rgba(255,255,255,0.3); border-top: 5px solid #fff; border-radius: 50%; width: 40px; height: 40px; animation: spin 1s linear infinite; margin: 20px auto; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } </style> </head> <body> <!-- 头部导航 --> <header> <h1>🎨 AI 图片生成器</h1> <p class="tagline">用文字描绘世界 · 让想象瞬间成像</p> <nav> <a href="index.html">首页</a> <a href="guide.html">教程</a> <a href="gallery.html">作品墙</a> <button onclick="toggleTheme()" class="theme-btn">🌙/☀️ 主题</button> </nav> </header> <main> <!-- 左侧主功能区 --> <section class="left-panel"> <!-- 提示输入区 --> <div class="container"> <h2>✨ 描述你的创意</h2> <p class="example">例如:一只穿宇航服的猫在火星上钓鱼,赛博朋克风格</p> <label for="prompt">文字提示 (Prompt)</label> <input type="text" id="prompt" placeholder="输入你想要的画面描述..." oninput="suggestPrompt(this.value)" /> <!-- AI 灵感助手 --> <div id="suggestion" style="font-size:0.9rem; opacity:0.7; margin-top:0.5rem;"></div> <label for="style">艺术风格</label> <select id="style"> <option value="">无特定风格</option> <option value="anime">动漫风格</option> <option value="realistic">写实风格</option> <option value="oil painting">油画风格</option> <option value="cyberpunk">赛博朋克</option> <option value="watercolor">水彩画</option> <option value="surrealism">超现实主义</option> </select> <button onclick="generateImage()">🚀 生成图片</button> <div id="result"> <!-- 生成结果将显示在这里 --> </div> </div> <!-- 使用示例 --> <div class="container"> <h2>💡 灵感示例</h2> <div class="examples"> <span class="tag" onclick="useExample(&#39;一只机械熊猫在竹林里打太极&#39;)">机械熊猫</span> <span class="tag" onclick="useExample(&#39;未来城市悬浮花园,阳光穿透云层&#39;)">悬浮花园</span> <span class="tag" onclick="useExample(&#39;深海发光水母群环绕沉船&#39;)">深海秘境</span> <span class="tag" onclick="useExample(&#39;蒸汽朋克火车站,齿轮飞转&#39;)">蒸汽车站</span> </div> </div> </section> <!-- 右侧信息面板 --> <section class="right-panel"> <!-- 消息通知 --> <div class="container"> <div class="notification-bar" id="notification"> 🎉 欢迎使用!试试输入“星空下的图书馆” </div> </div> <!-- 统计信息 --> <div class="container"> <h2>📊 使用统计</h2> <div class="stat-item"><strong>总生成数:</strong><span id="total-count">0</span></div> <div class="stat-item"><strong>今日生成:</strong><span id="today-count">0</span></div> <div class="stat-item"><strong>最近生成:</strong><span id="last-time">从未</span></div> </div> <!-- 风格推荐 --> <div class="container"> <h2>🎨 风格推荐</h2> <div> <span class="tag" onclick="setStyle(&#39;anime&#39;)">动漫</span> <span class="tag" onclick="setStyle(&#39;cyberpunk&#39;)">赛博朋克</span> <span class="tag" onclick="setStyle(&#39;oil painting&#39;)">油画风</span> <span class="tag" onclick="setStyle(&#39;realistic&#39;)">超写实</span> </div> </div> <!-- 排行榜 --> <div class="container"> <h2>🏆 热门创作</h2> <div class="rank-item">1. 宇宙鲸鱼穿越星云 —— 142 次生成</div> <div class="rank-item">2. 唐风赛博都市夜景 —— 98 次生成</div> <div class="rank-item">3. 会飞的鲸鱼书店 —— 87 次生成</div> </div> <!-- 历史记录 --> <div class="container"> <h2>🖼️ 生成历史</h2> <input type="search" id="search" placeholder="搜索历史..." oninput="searchHistory()"> <div class="thumbnail-wall" id="history"></div> <button class="clear-btn" onclick="clearHistory()">🗑️ 清除所有</button> </div> </section> </main> <footer> © 2025 AI Image Generator Tool | 使用 Unsplash 模拟数据 | 学习演示用途 </footer> <!-- === 全屏预览模态框 === --> <div id="imageModal" class="modal"> <button class="close-modal" onclick="closeModal()">×</button> <div class="modal-content"> <img id="modalImage" src="" alt="Preview"> </div> <div class="modal-caption" id="modalCaption"></div> </div> <script> let history = JSON.parse(localStorage.getItem(&#39;aiImageHistory&#39;)) || []; const modal = document.getElementById("imageModal"); const modalImg = document.getElementById("modalImage"); const modalCaption = document.getElementById("modalCaption"); // ======== 主题切换 ======== function toggleTheme() { document.body.classList.toggle("theme-dark"); localStorage.setItem("theme", document.body.classList.contains("theme-dark") ? "dark" : "light"); } window.onload = function () { const saved = localStorage.getItem("theme"); if (saved === "dark") document.body.classList.add("theme-dark"); updateStats(); updateHistory(); startNotificationCycle(); }; // ======== 模拟通知轮播 ======== const notifications = [ "🎉 新增赛博朋克风格模板!", "💡 小技巧:加入‘电影质感’让画面更高级", "🔥 热门趋势:‘东方幻想’主题正流行", "📌 试试‘发光生物+雨夜’组合" ]; let notifIndex = 0; function startNotificationCycle() { setInterval(() => { const bar = document.getElementById("notification"); bar.style.opacity = 0; setTimeout(() => { bar.textContent = notifications[notifIndex % notifications.length]; bar.style.opacity = 1; notifIndex++; }, 300); }, 4000); } // ======== 图片预览 ======== function viewImage(src, caption) { modalImg.src = src; modalCaption.textContent = caption || ""; modal.classList.add("active"); document.body.style.overflow = "hidden"; } function closeModal() { modal.classList.remove("active"); document.body.style.overflow = ""; } modal.onclick = e => e.target === modal && closeModal(); document.onkeydown = e => e.key === "Escape" && closeModal(); // ======== 下载与分享 ======== async function downloadImage(url) { try { const res = await fetch(url); const blob = await res.blob(); const blobUrl = URL.createObjectURL(blob); const a = document.createElement(&#39;a&#39;); a.href = blobUrl; a.download = `AI-${Date.now()}.jpg`; a.click(); URL.revokeObjectURL(blobUrl); } catch (err) { alert("下载失败,请右键图片另存为。"); } } function copyPrompt(prompt) { navigator.clipboard.writeText(prompt).then(() => { alert("✅ 提示词已复制!"); }); } // ======== 删除历史 ======== function deleteHistory(index) { if (confirm("删除这条记录?")) { history.splice(index, 1); localStorage.setItem(&#39;aiImageHistory&#39;, JSON.stringify(history)); updateHistory(); updateStats(); } } // ======== 搜索历史 ======== function searchHistory() { const q = document.getElementById("search").value.trim().toLowerCase(); const filtered = q ? history.filter(h => h.prompt.toLowerCase().includes(q)) : history; renderHistory(filtered); } function renderHistory(list) { const container = document.getElementById(&#39;history&#39;); container.innerHTML = &#39;&#39;; if (list.length === 0) { container.innerHTML = &#39;<p style="opacity:0.6">暂无记录</p>&#39;; return; } [...list].reverse().forEach((item, idx) => { const realIdx = history.indexOf(item); const div = document.createElement(&#39;div&#39;); div.className = &#39;thumb-item&#39;; div.onclick = () => viewImage(item.imageUrl, item.prompt); div.oncontextmenu = e => { e.preventDefault(); deleteHistory(realIdx); }; div.innerHTML = `<img src="${item.imageUrl}" alt="hist">`; container.appendChild(div); }); } function clearHistory() { if (confirm("清空所有历史?")) { history = []; localStorage.removeItem(&#39;aiImageHistory&#39;); updateHistory(); updateStats(); alert("已清除"); } } // ======== 统计功能 ======== function updateStats() { const total = history.length; const today = history.filter(h => new Date(h.timestamp).toDateString() === new Date().toDateString()).length; const last = history.length ? history[history.length-1].timestamp : "从未"; document.getElementById("total-count").textContent = total; document.getElementById("today-count").textContent = today; document.getElementById("last-time").textContent = last; } // ======== 示例与推荐 ======== function useExample(text) { document.getElementById("prompt").value = text; } function setStyle(style) { document.getElementById("style").value = style; } function suggestPrompt(input) { const suggestions = { cat: "一只发光的猫在极光下跳舞", robot: "机器人在废弃城市种花", forest: "会说话的古树守护精灵村落", city: "空中漂浮的未来图书馆" }; const key = Object.keys(suggestions).find(k => input.toLowerCase().includes(k)); document.getElementById("suggestion").textContent = key ? "💡 灵感:" + suggestions[key] : ""; } // ======== 图片模拟池 ======== const imagePool = { default: [&#39;abstract&#39;, &#39;art&#39;, &#39;creative&#39;], anime: [&#39;anime&#39;, &#39;manga&#39;, &#39;cartoon&#39;], realistic: [&#39;realistic&#39;, &#39;photo&#39;, &#39;highly detailed&#39;], &#39;oil painting&#39;: [&#39;oil painting&#39;, &#39;brush strokes&#39;, &#39;classic art&#39;], cyberpunk: [&#39;cyberpunk&#39;, &#39;neon&#39;, &#39;futuristic&#39;], watercolor: [&#39;watercolor&#39;, &#39;painting&#39;, &#39;soft colors&#39;], surrealism: [&#39;surreal&#39;, &#39;dreamlike&#39;, &#39;melting&#39;] }; function getRandomImageUrl(prompt, style) { const tags = imagePool[style] || imagePool.default; const tag = tags[Math.floor(Math.random() * tags.length)]; return `https://source.unsplash.com/random/800x600/?${encodeURIComponent(tag)}&t=${Date.now()}`; } // ======== 生成图片 ======== function generateImage() { const promptInput = document.getElementById("prompt").value.trim(); const styleSelect = document.getElementById("style").value; const resultDiv = document.getElementById("result"); if (!promptInput) { alert("请输入描述!"); return; } resultDiv.className = "loading"; resultDiv.innerHTML = `<div class="loader"></div><p>🧠 正在创作...</p>`; setTimeout(() => { const imageUrl = getRandomImageUrl(promptInput, styleSelect); const displayStyle = document.getElementById("style").options[document.getElementById("style").selectedIndex].text; const fullPrompt = `${promptInput}${styleSelect ? `, ${displayStyle}风格` : &#39;&#39;}`; resultDiv.className = ""; resultDiv.innerHTML = ` <h3>✅ 生成成功!</h3> <img src="${imageUrl}" onclick="viewImage(&#39;${imageUrl}&#39;, &#39;${fullPrompt}&#39;)"> <p class="img-caption"><strong>Prompt:</strong> ${promptInput}</p> ${styleSelect ? `<p class="img-caption"><strong>风格:</strong> ${displayStyle}</p>` : &#39;&#39;} <div class="action-buttons"> <button class="btn-small" onclick="downloadImage(&#39;${imageUrl}&#39;)">📥 下载</button> <button class="btn-small" onclick="copyPrompt(&#39;${fullPrompt}&#39;)">💬 分享</button> </div> `; const record = { prompt: promptInput, style: displayStyle, imageUrl, timestamp: new Date().toLocaleString() }; history.push(record); localStorage.setItem(&#39;aiImageHistory&#39;, JSON.stringify(history)); updateHistory(); updateStats(); }, 1800); } </script> </body> </html> 给教程制作一个二级网页
最新发布
11-07
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值