Board logo

主題: [Discuz] 論壇的[code]代碼 [打印本頁]

發表人: Katsuya    時間: 2008-4-9 03:48 PM     主題: 論壇的[code]代碼

這裡的code是我常用的代碼
因為常常設密碼

CODE:
[Copy to clipboard]
範例
但上面的copy to clipboard 卻對FF不支援,不知道可不可以修改為FF和IE通用的呢?
發表人: Jonson    時間: 2008-4-9 06:10 PM

因為安全性、隱私性緣故,FX、JavaScript 都不提供直接存取剪貼簿功能
為什麼 IE 可以!?
因為實際負責複製資料到剪貼簿的指令: execCommend("copy") 是 IE 提供的指令

以前曾見過有人寫了一大串 Script,讓 FX 也可以使用剪貼簿

複製純文字

CODE:
[Copy to clipboard]
/**************************************************
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;
}
貼上純文字

CODE:
[Copy to clipboard]
/**************************************************
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



CODE:
[Copy to clipboard]
<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



CODE:
[Copy to clipboard]
<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



CODE:
[Copy to clipboard]
<a href="###" class="smalltxt" onclick="copy($(this.parentNode.parentNode.nextSibling.id));">[Copy to clipboard]</a>
看能不能直接取代原本的那個複製連結;
底下那個

CODE:
[Copy to clipboard]
<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



CODE:
[Copy to clipboard]
<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