打钩复制本帖标题和地址的修改方法
2008 10 24 12:50 AM 3593次查看
分类:Discuz! 标签:Discuz!, JavaScript
基本方法来自于下面这帖,只不过加了点创意并增强兼容性了。
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);
}
向下滚动可载入更多评论,或者点这里禁止自动加载。