主題: [Discuz] 論壇的[code]代碼 [打印本頁]
發表人:
Katsuya 時間: 2008-4-9 03:48 PM 主題: 論壇的[code]代碼
這裡的code是我常用的代碼
因為常常設密碼
範例
但上面的copy to clipboard 卻對FF不支援,不知道可不可以修改為FF和IE通用的呢?
發表人:
Jonson 時間: 2008-4-9 06:10 PM
因為安全性、隱私性緣故,FX、JavaScript 都不提供直接存取剪貼簿功能
為什麼 IE 可以!?
因為實際負責複製資料到剪貼簿的指令: execCommend("copy") 是 IE 提供的指令
以前曾見過有人寫了一大串 Script,讓 FX 也可以使用剪貼簿
複製純文字
/**************************************************
http://www.krikkit.net/howto_javascript_copy_clipboard.html
**************************************************/
function setClipboard(maintext) {
if (window.clipboardData) {
return (window.clipboardData.setData("Text", maintext));
}
else if (window.netscape) {
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
if (!clip) return;
var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
if (!trans) 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);
var copytext=maintext;
str.data=copytext;
trans.setTransferData("text/unicode",str,copytext.length*2);
var clipid=Components.interfaces.nsIClipboard;
if (!clip) return false;
clip.setData(trans,null,clipid.kGlobalClipboard);
return true;
}
return false;
}
貼上純文字
/**************************************************
http://www.codebase.nl/index.php/command/viewcode/id/174
**************************************************/
function getClipboard() {
if (window.clipboardData) {
return(window.clipboardData.getData('Text'));
}
else if (window.netscape) {
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
if (!clip) return;
var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
if (!trans) return;
trans.addDataFlavor('text/unicode');
clip.getData(trans,clip.kGlobalClipboard);
var str = new Object();
var len = new Object();
try {
trans.getTransferData('text/unicode',str,len);
}
catch(error) {
return null;
}
if (str) {
if (Components.interfaces.nsISupportsWString) str=str.value.QueryInterface(Components.interfaces.nsISupportsWString);
else if (Components.interfaces.nsISupportsString) str=str.value.QueryInterface(Components.interfaces.nsISupportsString);
else str = null;
}
if (str) {
return(str.data.substring(0,len.value / 2));
}
}
return null;
}
現在看到比較新的作法是利用 Flash 的 flashvars 屬性做到
JavaScript 程式碼及 SWF 檔,請見 http://www.jeffothy.com/weblog/clipboard-copy/
發表人:
mmmmnb 時間: 2008-5-19 11:07 PM
想請問一下那個網站提供的SWF要怎麼使用?
我想要再我的論壇新增一個FireFox可用的CODE語法
因為是免費論壇 所以無法更動程式碼部分
發表人:
Jonson 時間: 2008-5-20 01:13 AM
<SCRIPT LANGUAGE="JavaScript" type="text/javascript">
<!--
function copy(inElement) {
if (inElement.createTextRange) {
var range = inElement.createTextRange();
if (range && BodyLoaded==1)
range.execCommand('Copy');
} else {
var flashcopier = 'flashcopier';
if(!document.getElementById(flashcopier)) {
var divholder = document.createElement('div');
divholder.id = flashcopier;
document.body.appendChild(divholder);
}
document.getElementById(flashcopier).innerHTML = '';
var divinfo = '<embed src="_clipboard.swf" FlashVars="clipboard='+encodeURIComponent(inElement.value)+'" width="0" height="0" type="application/x-shockwave-flash"></embed>';
document.getElementById(flashcopier).innerHTML = divinfo;
}
}
-->
</SCRIPT>
<form name="formtocopy">
<textarea name="texttocopy">
A whole bunch of text here that will be copied.
</textarea>
<br>
<a href="javascript:copy(document.formtocopy.texttocopy);">Copy the Text!</a>
</form>
既然是不提供更改程式碼的免費論壇,那要新增這功能恐怕是不太可能。
論壇程式我沒研究,所以幫不上忙了。
發表人:
mmmmnb 時間: 2008-5-20 02:57 AM
上面的script免費論壇是有辦法安插到<HEAD>中
插進去檢視原始檔也有看到這些script
自己在本機測試是可以用只是複製出來不能換行
丟到論壇上就無法複製囉
可能是下面的form那邊出問題
能修改成不用FORM而像code語法用<div>嗎
發表人:
Jonson 時間: 2008-5-21 03:50 AM
<SCRIPT LANGUAGE="JavaScript" type="text/javascript">
function copy(inElement) {
inElement = document.getElementById(inElement);
var rangeText = (inElement.innerText) ? inElement.innerText : inElement.textContent;
var flashcopier = 'flashcopier';
if(!document.getElementById(flashcopier)) {
var divholder = document.createElement('div');
divholder.id = flashcopier;
document.body.appendChild(divholder);
}
document.getElementById(flashcopier).innerHTML = '';
var divinfo = '<embed src="_clipboard.swf" FlashVars="clipboard='+encodeURIComponent(rangeText)+'" width="0" height="0" type="application/x-shockwave-flash"></embed>';
document.getElementById(flashcopier).innerHTML = divinfo;
}
</SCRIPT>
<div id="texttocopy" style="width:300px;height:200px;border:1px solid black;">
A whole bunch of text here that will be copied.
</div>
<a href="javascript:copy('texttocopy');">Copy the Text!</a>
發表人:
mmmmnb 時間: 2008-5-21 10:42 AM
多謝Jonson兄
基本上可用了
例: http://ytk.b.forumable.net/tc/viewthread.php?tid=2328
不過我稍微改一下 因為CODE語法中就是要不解析Discuz!標籤和HTML
在沒辦法改程式碼的情況下自定義的Discuz!標籤好像沒辦法達成這樣的效果
所以我就用自定義的標籤包住原來的CODE標籤 然後複製目標指向原CODE標籤的DIV ID
不過一個頁面有兩個以上的CODE標籤第二個就無法複製囉
因為原CODE標籤生成的DIV ID會遞增 code0 code1 ....
這是免費論壇的極限了吧
發表人:
Jonson 時間: 2008-5-21 09:19 PM
<a href="###" class="smalltxt" onclick="copy($(this.parentNode.parentNode.nextSibling.id));">[Copy to clipboard]</a>
看能不能直接取代原本的那個複製連結;
底下那個
<a href="javascript:copy('code0');">FireFox點我複製文字</a>
就不需要了,
[Jonson 在 2008-5-21 09:28 PM 作了最後編輯]
發表人:
Jonson 時間: 2008-5-21 09:43 PM
上面使用 this.parentNode.parentNode.nextSibling.id 這種層推的方式取得節點 (node),實在不是很好的方法
因為有一些 IE 不當做節點的標籤 (tag),FX 會把它們當做節點
不過,因為論壇格式固定,所以這方法可能可以用
或者你可以在 onclick 中呼叫另一個函數來分析、取得你想要的節點
[Jonson 在 2008-5-21 11:30 PM 作了最後編輯]
發表人:
mmmmnb 時間: 2008-5-22 05:59 AM
不行用 ><
看來要去好好KK javascript和php了
想到一個方法手動 不過好麻煩
EX:
[newcode=code0][/newcode]
[newcode=code1][/newcode]
.
.
.
[newcode=codeN][/newcode]
這樣
發表人:
Jonson 時間: 2008-5-22 10:47 PM
<DIV class=msgborder id=texttocopy style="BORDER: black 1px solid;">
<DIV class="msgheader right">
<A class=smalltxt onclick="copy(this.parentNode.nextSibling.nextSibling.nextSibling.nextSibling.id);" href="###">
[Copy to clipboard for FX]
</A>
</DIV>
<BR><BR>
<DIV class=msgheader>
<DIV class=right>
<A class=smalltxt onclick="copycode($('code0'));" href="###">
[Copy to clipboard for IE]
</A>
</DIV>
CODE:
</DIV>
<DIV class=msgborder id=code0>
[size=6]1234[/size]<BR>1234<BR>[size=7]1234[/size]<BR>[align=right]1234[/align]<BR>[align=center]1234[/align]<BR>[color=Red]1234[/color]<BR>[align=center][b][i][u][size=7][color=LemonChiffon]1234[/color][/size][/u][/i][/b][/align]<BR>1234
</DIV>
<BR>
</DIV>
<A href="javascript:copy('code0');">FireFox複製文字點我</A>
第一個 onclick 中還可以寫成:
copy(this.parentNode.parentNode.childNodes[4].id);
如果可以將上面 CODE 中的 "<BR><BR>" 拿掉,
那麼第一個 onclick 裡面可改成底下這樣:
copy(this.parentNode.nextSibling.nextSibling.id);
如果可以將最後面那個 "<BR>" 拿掉,
onclick 可以改成底下這樣:
copy(this.parentNode.parentNode.lastChild.id);
最後一行
<A href="javascript:copy('code0');">FireFox複製文字點我</A>
可以拿掉了
[Jonson 在 2008-5-22 10:54 PM 作了最後編輯]
歡迎光臨 TWed2k (http://twed2k.org/) |
Powered by Discuz! 4.1.0 |