javascript 弹出菜单/窗口实现代码

window.open 新建的浏览器窗口
<iframe /> 创建的窗口
页面 DOM 创建的伪弹出窗口:如弹出 tips 等

一、当页面无 JS 的时候
通常来说,无 JS 的情况那就按 HTML 的行为来做事。让链接可以链接,就已经解决。比较简单,我们简单带过:

1. window.open 新建的浏览器窗口:尽量让 JS 触发器绑定在 <a /> 上,并把 a 链接到一个新的页面,即可。

// 链接与 window.open 的目标相同

 代码如下 复制代码
<a href="/target.html" target="_blank">[open window]</a>

// 记得阻止链接有默认行为,不然有 JS 的时候会打开两次

 代码如下 复制代码
window.open('./iframe.html', 'name', 'height=300,width=500');
return false;

 2. <iframe /> 创建的窗口:如果是用 JS 动态创建的,那么记得触发器也应该像 window.open 的方法一样,把解法链接写在一个 <a /> 上,让用户通过链接来访问。而如果是隐藏的,那么尽量来使用 <noscript /> 来隐藏,再用 JS 让其正常显示出来;或者高度为 0 的空 iframe 。这样即可保证在有 JS 的时候可用,而在无 JS 的时候可以正常显示。详细应用可以参照:支付宝新首页的几点前端实践。

// 动态创建,请尽量使用这种方法,因为 IE8 不能用 JS focus 到动态创建的 focusable 元素
// 而空 src 则请使用 javascript:'' 这种方式,因为这是解决性能的最好方式,详见:空路径对页面性能影响的解决方案

 代码如下 复制代码

<a href="/target.html" target="_blank">[open iframe]</a>
<iframe src="javascript:''" frameborder=0 id="theframe"></iframe>

// js
document.getElementById('theframe').src = '/target.html'

 3. 页面 DOM 创建的伪弹出窗口:使用 <noscript /> 来隐藏。链接用锚点。

 代码如下 复制代码
<a href="#target">[open current page DOM]</a>

... 很多很多东西隔在中间 ...

 代码如下 复制代码
<noscript><div id="target">content</div></noscript>

 二、大多数情况下
大数多情况下,用户的浏览器都是有开启 JS 的。而我们要做的是:focus 到弹出的窗口,并且第一个 tab 就可以访问里面的内容。听过来挺简单的,hub? 先看看 DEMO:

预览:可访问弹出菜单/窗口

1. window.open 新建的浏览器窗口:focus 到新建的窗口即可。

 代码如下 复制代码
// 引用自:QuickMode - popups
function popitup(url) {
    newwindow=window.open(url,'name','height=200,width=150');
    if (window.focus) {
        // focus 到新建窗口
        newwindow.focus();
    }
    // 阻止触发器的默认行为
    return false;
}

2. <iframe /> 创建的窗口:调试了好久,IE8/9 需要等 iframe onload 成功后 setTimeout 来 hack;firefox 不能使用 ifrcontentWindow.focus(),只能用 iframe.focus()。综合起来需要这样的代码:

 代码如下 复制代码

// for all except firefox
setTimeout(function(){
    f.contentWindow.focus();
}, 50);

// hack for firefox
navigator.userAgent.toLowerCase().indexOf('firefox') !== -1 && f.focus();

3. 页面 DOM 创建的伪弹出窗口:对于 dom,除了 <a /> <input /> 等这些 focusable 元素(W3C SPEC),都是不可以 focus 的。那么当需要 focus 到一个 div 时,我们有什么方法可以做到呢?通常来说,我们可以设置 Tabindex 来让像 <div /> 这样的非 focusable 元素可以触发 focus 事件。但我们想要的时真正 focus 到一个地方,以便于使用 tab 来访问这个区域的内容,所以这种方法对我们等于无用。

目前还没有比较好的方法(对于我能想到的和找到的),所以目前来说,我们只能利用一个 focusable 元素来创建 focus 目标。我们可以这样做:

<a href="#" class="getfocus">Get focus</a>
<input title="testing" />
但问题是,对于这个链接对于我们来说是毫无作用的,我们需要隐藏他,又能 focus 到。但 display:none 的时候是不能 focus 的。对于隐藏 来说,这里也不想说太多。推荐看看这篇文章:使用clip隐藏内容。那么我们可以这样来 hack 我们的这个链接:

 代码如下 复制代码

// html: 注意用 hidefocus 来删除虚线框
<a href="#" class="getfocus" hidefocus>Get focus</a>

// CSS: 使用 clip
.getfocus{
    position:relative;
    clip:rect(1px 1px 1px 1px);
    clip:rect(1px, 1px, 1px, 1px);
}

// javascript: 记得把 <a /> 放在这个 DOM 结构的最前面方便自上至下 tab 下去
a.focus()
三、总结:
至此,重要的技术实现点也已经说明白。代码请见这个粗陋的 DEMO,虽然只是没有特别优化的一段代码,但相信可以解决很多问题。对于可访问性,我们要走的路还有很多。一点点来吧,从今天开始。

时间: 2024-10-30 12:02:28

javascript 弹出菜单/窗口实现代码的相关文章

js中可访问弹出菜单/窗口实现代码

[Open Window] [Open Iframe] | [Open Current Page DOM] get focus Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a ga

如何创建一个JavaScript弹出DIV窗口层的效果_javascript技巧

在本教程中,我将用最通俗的语言和最简洁的代码给大家演示如何创建一个JavaScript弹出DIV窗口层的效果. 创建一个弹出DIV窗口可能是现在网站/网页制作中最常碰到的问题之一.传统的JavaScript弹窗已经不适合目前网站的设计理念了,理由有二:首先,不友好--生硬的弹出对话框且伴随着"哐"的一声对用户体验是个很大的挑战:其次,兼容性不够强--有相当多的浏览器屏蔽了这种JS的Alert()方法.于是,一个良好用户体验的网站需要一种更合理的解决方案--使用很少的HTML代码,很少的

javascript弹出拖动窗口_javascript技巧

可以拖动的弹出窗口,在很多网页上都可以见到,非常的人性化,下面通过一段javascript代码就可以实现弹出拖动窗口,废话不多说了,直接贴代码了. <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.jb51.net/" /> <title>

请教LOTUS WEB 方式下弹出对话窗口的代码?

问题描述 在C/S环境中,我做了一个弹出的窗口,代码如下:FIELDA1Name:=@PickList([Custom];@Name([CN];@Subset(@DbName;1)):"Company/ADDBM.nsf";"UserView";"人员信息列表";"人员信息";1);FIELDA1ID:=@DbLookup("":"NoCache";@Name([CN];@Subset(

jquery 弹出登录窗口实现代码_jquery

主要层左右居中,设置left等于窗口宽除二减去自身层宽除二就居中了,至于窗口上下居中我没做到,固定了top等于滚动条隐去的 scrollTop加上50px; 当事件触发这个类时,首先判断一下两个层是否已经append到body里面,否则每次触发它就一直增加增加了.设置了五个参数title. content.width.height.cssName,它们分别定义了层标题.层内内容.层宽.层高.层内容的样式名.层内内容又设置了url. text.id.iframe四种加载方式,通过ajax以get或

javascript弹出层输入框(示例代码)_javascript技巧

如下所示: 复制代码 代码如下:    <script language="javascript" type="text/javascript">         function alertWin(title, msg, w, h) {             var titleheight = "22px"; // 窗口标题高度             var bordercolor = "#666699";

asp.net 弹出警告窗口实现代码_实用技巧

复制代码 代码如下: /// <summary> /// 提供一个可选"是""否"的弹出窗口,若选是,则跳到url1,选否则跳到url2 /// </summary> /// <param name="strMsg"></param> /// <param name="url1">选"是"</param> /// <param n

javascript 弹出的窗口返回值给父窗口具体实现_javascript技巧

直接上代码,有些地方可以用到: 复制代码 代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><TITLE> New Document </TITLE><META NAME="Generator" CONTENT="EditPlus"><META NAME=&qu

javascript弹出窗口实现代码_javascript技巧

很多网页都实现了弹出窗口,使用方面,特别的人性化,本文就大家介绍javascript实现弹出窗口特效,具体代码如下: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>弹出窗口</title> <script src="js/jquery-1.11.1.js"></sc