在打印包含 <select> 元素的网页时,下拉列表会按原样打印。
当然,这在打印页面上几乎毫无用处。它甚至可能隐藏了理解打印页面内容至关重要的重要细节(例如,产品的选项)。
不幸的是,我不知道有任何真正简单且干净的方法来处理这个问题。一种选择是使用无序列表替换所有 select HTML 元素,并复制相同的内容。在常规显示 CSS 中隐藏无序列表,然后在打印样式表中显示它。我认为这是一个合理的方法,除了它一直都是一个很大的麻烦之外。
就像我们经常在这里做的那样,让我们依靠 jQuery 来完成繁重的工作。
- 循环遍历页面上的每个 select 元素。
- 在其后面插入一个带有选项 UL 的 DIV。
- 循环遍历该 select 中的每个选项,并将 LI 追加到 UL 中。
- 确保 DIV 通常是隐藏的(display: none 即可),并在打印样式表中显示。
$(function(){
$("select").each(function(i){
var $el = $(this);
var $options = $el.find("option");
$el.after("<div class='print-select'>Options: <ul id=sel"+i+"></ul></div>");
var $curPrintBox = $("#sel"+i);
$options.each(function() {
$curPrintBox.append("<li>"+$(this).text()+"</li>");
});
});
});
查看演示页面的源代码以查看所有 JavaScript、CSS 和 HTML 代码。
使用 MooTools
David Walsh,一如既往,使用 相同的技术,只不过是用 MooTools 实现的。
嘿,我一直在寻找这样的东西!
谢谢 Chris(和 David)!
哦哦,谢谢,我稍后会试试
查看我的网站以查看它
不错的功能,一如既往!还有一件事可以使它更有用,就是在代表所选选项的 li 元素中添加另一个 id。:-)
哇,这真的很有用。谢谢
我修改了示例以打印所有选项,但选中的选项为粗体(其他选项为斜体)。也许有人会发现这个示例有用。要尝试,请按照以下说明操作
将此添加到屏幕样式中
将此添加到打印样式中(.selected 类必须重复)
Javascript 函数修改如下
我将使用 PHP 来做这件事而不是 jQuery。
创建一个选项数组,生成 select 和 option,然后生成隐藏的 div。
我再次忘记了我不能写标签。
所以我的消息是
我将使用 PHP 来做这件事而不是 jQuery。
创建一个选项数组,生成 select 和 option,然后生成隐藏的 div。
是的,但这意味着 HTML 中会有重复的内容,而 jQuery 解决方案只会更改加载的 DOM。
这是一个两难选择:语义化 HTML 或无 JavaScript 解决方案。
Matti,如果你计算总下载大小(和请求数量),你会知道 PHP 更胜一筹。假设你不会创建内部脚本表(你可能不会……),你需要另一个请求。此外,如果你将 jquery 代码的大小与 PHP 生成的 HTML 代码的大小进行比较(因为 PHP 代码不会下载),你会发现 PHP 绝对更小。
我个人会使用 PHP 解决方案,因为如果你使用 javascript/jQuery,用户只需在浏览器中禁用 javascript,然后 BAM,你所有的努力就白费了。
是的,我同意你的看法。我也用 PHP 来做这件事 :)
我个人会选择服务器端选项,但“最小化”版本只有 55KB(或者我错过了什么),如果你已经在使用 jQuery 或“只是添加它”,它是一个简单而优雅的解决方案。而且,让我们面对现实,JS 是网络的一部分,牺牲一点打印并不是你殉道/恐惧中最糟糕的事情。
使用 jQuery 并不是坏习惯。
这似乎是一个非常有用的技术。
但是,这次让我发表评论的是我在你的演示源代码中注意到的一些内容。
具体来说
google.load("jquery", "1.3.2");
在创建概念页面时,这似乎是一个非常有用的工具。在哪里可以找到更多关于此的信息?
我注意到,在我点击提交后,它忽略了代码标签,只显示了一行,除非这部分内容正在等待批准?无论如何,让我这次再试一次,修改一下标签
(script src="http://www.google.com/jsapi" type="text/javascript")
(/script)
(script type="text/javascript")
google.load("jquery", "1.3.2");
(/script)
用 ( & ) 替换了标准标签的打开/关闭,除了 google.load 行,代码中就是这样。
@Ben B:你可以在此处找到有关 Google AJAX 库 API 的信息:http://code.google.com/apis/ajaxlibs/
也许我们可以使用 size 属性?
function printpage() {
var s = document.getElementsByTagName('select');
for (var i=0; i<s.length; i++) {
s[i].size = s[i].options.length;
}
window.print();
}
但是我还没有成功地在打印后将其恢复正常。
我做了一个小改动,也可以使它非常有用。
如果你更改以下行
var $options = $el.find("option");
为
var $options = $el.find("option:selected");
你将只打印选定的项目。
好主意,但是如果你不在不可打印版本中创建 div.print-select,你就会做一些正确的事情
1)在打印版本中:select{display:none}
2)在脚本中:$(“select:hidden”).each(function(i)…
抱歉我的英语不太好 (
我唯一不满的是,你每次加载页面时都会占用用户的系统资源(无论多么轻微),无论他们是否会打印页面(因为如果他们不打印,这段代码的效果毫无用处)。
我想知道在给定时间段内加载的每个网页中,有多少百分比实际上会被打印。我猜想应该是一个极小的数字。
非常好。我喜欢 jquery 解决方案,特别是考虑到可能只有 1% 的人会打印它。
我不得不承认,你想出了使用 JavaScript/jQuery 的一些非常不同的方法,我不认为我会想到这样做。
为什么不直接使用 jQuery 设置“multiple”属性?
(括号应该是 < 和 >)
自动显示所有选项
这是一个好主意,可能是最干净的方法。我认为为了让它完美地呈现,你必须确保将 select 的宽度设置为足够宽,以避免出现任何截断(可能为 100%)。
我认为一个不错的补充是在打印版本的样式表中隐藏 select 菜单。
这很棒,Chris。我一直在查看几个使用不同技术来实际设置标签样式的网站。有没有人对这个主题有什么建议?根据我查看过的网站,它似乎变得相当复杂……我想在背景中使用单个图像和 CSS 滚动……但还没有成功……
干杯 :D