打钩复制本帖标题和地址的修改方法

标签:Discuz!, JavaScript

效果看本帖结束处,点下那个勾就知道了,理论上支持所有的浏览器,不过我只测试了IE6、firefox3和chrome0.3。

基本方法来自于下面这帖,只不过加了点创意并增强兼容性了。
http://www.discuz.net/thread-821216-1-1.html
这帖还有在文章前面添加隐藏连接的实现代码,有兴趣的可以看看。

先给出js函数,有写注释,自己看看吧
function mycopy(text, alertmsg, change) {
	var errmsg = "由于您的浏览器有所限制,请按Ctrl+C手动复制到剪贴板";
	var text2 = text;
	if (change) {
		text2 = text.replace("\r\n", change);
	}
	if(window.clipboardData) {
	//处理IE浏览器,如果是放在common.js里,则可以写成if(is_ie)
		clipboardData.setData('Text', text);
		alert(alertmsg);
	} else if(navigator.userAgent.indexOf("Opera") != -1) { //处理Opera浏览器
		window.location = text;
		alert(alertmsg);
	} else if (window.netscape) { //处理netscape和firefox浏览器
		try {
			netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
		} catch (e) {
			prompt("由于您的浏览器限制该功能,请按Ctrl+C手动复制到剪贴板\n若要开启该功能,请在浏览器地址栏输入'about:config'并回车\n然后将'signed.applets.codebase_principal_support'设置为'true'", text2);
			return;
		}
		var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
		if (!clip) {
			prompt(errmsg, text2);
			return;
		}
		var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
		if (!trans) {
			prompt(errmsg, text2);
			return;
		}
		trans.addDataFlavor('text/unicode');
		var str = new Object();
		var len = new Object();
		var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
		str.data = text;
		trans.setTransferData("text/unicode",str,text.length*2);
		var clipid = Components.interfaces.nsIClipboard;
		if (!clip) {
			prompt(errmsg, text2);
			return;
		}
		clip.setData(trans,null,clipid.kGlobalClipboard);
		alert(alertmsg);
	} else //处理其他浏览器,如chrome等
		prompt(errmsg, text2);
}
然后就是让打勾时调用这段代码了:

打开viewthread.htm模板,搜索:
<!--{if $post['number'] == 1 && ($thread['tags'] || $relatedkeywords)}-->
	<p class="posttags">{lang thread_keywords}
	<!--{if $thread['tags']}-->$thread[tags]<!--{/if}-->
	<!--{if $relatedkeywords}--><span class="postkeywords">$relatedkeywords</span><!--{/if}-->
	</p>
<!--{/if}-->
在下面加入:
<!--{if $post['number'] == 1}-->
<div align="center">
<br /><br />
<strong>本帖地址</strong>:<a href="{$boardurl}viewthread.php?tid=$tid"><font color = red>{$boardurl}viewthread.php?tid=$tid</font></a>
<input type="checkbox" onclick="this.disabled=true;mycopy('$post[subject]\r\n{$boardurl}viewthread.php?tid=$tid','您已复制标题及链接,请粘贴到QQ|MSN等发给好友!', ' : ')" />  [打勾复制本帖标题和地址]
</div>
<!--{/if}-->
如果你开了伪静态的话,把3处
{$boardurl}viewthread.php?tid=$tid
都改为
{$boardurl}thread-$tid-1-1.html
然后更新缓存即可。
此外,
<!--{if $post['number'] == 1}-->
<!--{if $post['first']}-->
似乎是等效的,可以自由替换。
如果想让每页的1楼都显示这个,把这句替换为
<!--{if $post['count'] == 0}-->
即可。

顺便说下,common.js里有个setcopy函数,但只能识别IE浏览器,其他都要手动复制,而且没有处理换行问题,在chrome浏览器中就只能复制第一行了。
有兴趣的可以改进这个函数,为不影响大家独立思考,设为回复可见吧。
此外,如果想让Chrome等浏览器也可以自动复制的话,可以参考这篇:基本兼容所有浏览器的复制到剪贴板的方法

/*
添加了2个默认参数
若第3个参数不为空,则把换行替换为第3个参数
若第4个参数也不为空(如传入true),则把所有换行都替换为第3个参数;否则只替换匹配到的第1个换行

此外,兼容了其他浏览器。
*/
function setcopy(text, alertmsg) {
	var errmsg = "由于您的浏览器有所限制,请按Ctrl+C手动复制到剪贴板";
	var text2 = text;
	if (arguments[2]) {
		text2 = arguments[3] ? text.replace(/\r\n/g, arguments[2]) : text.replace("\r\n", arguments[2]);
	}
	if(is_ie) {
		clipboardData.setData('Text', text);
		alert(alertmsg);
	} else if(navigator.userAgent.indexOf("Opera") != -1) {
		window.location = text;
		alert(alertmsg);
	} else if (window.netscape) {
		try {
			netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
		} catch (e) {
			prompt("由于您的浏览器限制该功能,请按Ctrl+C手动复制到剪贴板\n若要开启该功能,请在浏览器地址栏输入'about:config'并回车\n然后将'signed.applets.codebase_principal_support'设置为'true'", text2);
			return;
		}
		var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
		if (!clip) {
			prompt(errmsg, text2);
			return;
		}
		var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
		if (!trans) {
			prompt(errmsg, text2);
			return;
		}
		trans.addDataFlavor('text/unicode');
		var str = new Object();
		var len = new Object();
		var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
		str.data = text;
		trans.setTransferData("text/unicode",str,text.length*2);
		var clipid = Components.interfaces.nsIClipboard;
		if (!clip) {
			prompt(errmsg, text2);
			return;
		}
		clip.setData(trans,null,clipid.kGlobalClipboard);
		alert(alertmsg);
	} else
		prompt(errmsg, text2);
}

9条评论 你不来一发么↓ 顺序排列 倒序排列

    向下滚动可载入更多评论,或者点这里禁止自动加载

    想说点什么呢?