2017年6月14日 星期三

如何IE8以前版本支援 Javascript .trim()


一樣處理舊系統的Bug ,一樣是萬惡的IE 搞出來的

在IE8 前 Javascript  String.trim() 似乎會無作用

所以要自己處理並宣告一下,才能正常使用

相容性作法如下:

if(typeof String.prototype.trim !== 'function') {
  String.prototype.trim = function() {
        return this.replace(/^\s+|\s+$/g, '');
 } } 


這樣即可達到相容性了

參考資料:  https://stackoverflow.com/questions/2308134/trim-in-javascript-not-working-in-ie

2017年5月24日 星期三

showModalDialog 如何改成使用window.open


showModalDialog 是無法在新版的瀏覽器上使用了,所以別再花時間找解法,真正的解法就只能改寫,即然要改寫,就有很多種作法,看是要用jquery的Dialog改,還是要用傳統的window.open來改都可以,這篇是要教你如何用最簡單的方式改寫讓網頁可以正常使用
當要改寫時,我這裡分兩部份,一為開啟,一為回傳值,可以依你的網站使用的性質進行調整。如果你的網站使用showModalDialog 非常單純,只是純粹開啟網頁這樣只要處理如何開啟的轉換即可,首先可以加上以下這段語法:
// fix for deprecated method in Chrome 37
     window.showModalDialog = function (arg1, arg2, arg3) {

        var w;
        var h;
        var resizable = "no";
        var scroll = "no";
        var status = "no";

        // get the modal specs
        var mdattrs = arg3.split(";");
        for (i = 0; i < mdattrs.length; i++) {
           var mdattr = mdattrs[i].split(":");

           var n = mdattr[0];
           var v = mdattr[1];
           if (n) { n = n.trim().toLowerCase(); }
           if (v) { v = v.trim().toLowerCase(); }

           if (n == "dialogheight") {
              h = v.replace("px", "");
           } else if (n == "dialogwidth") {
              w = v.replace("px", "");
           } else if (n == "resizable") {
              resizable = v;
           } else if (n == "scroll") {
              scroll = v;
           } else if (n == "status") {
              status = v;
           }
        }

        var left = window.screenX + (window.outerWidth / 2) - (w / 2);
        var top = window.screenY + (window.outerHeight / 2) - (h / 2);
        var targetWin = window.open(arg1, arg1, 'toolbar=no, location=no, directories=no, status=' + status + ', menubar=no, scrollbars=' + scroll + ', resizable=' + resizable + ', copyhistory=no, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left);
        targetWin.focus();
     };
這段主要是將window.showModalDialog進行宣告,如在IE會是覆寫改用此作法,這樣原本的showModalDialog都不用改code,即可運行,這樣至少不用一行一行CODE去改寫
解決了開啟之後,接下來就是回傳值了,這就沒那麼簡單,原本showModalDialog的作法是在呼叫時用變數去接回傳值,等該視窗處理完成後就會將回傳值放置該變數中,如下示意
呼叫頁(父頁)
var returnValue = window.showModalDialog(…);

處理頁(子頁)
window.returnValue = data;
window.close();

然後returnValue 就能接到值啦,是蠻方便的,但如果用window.open作就沒辦法這麼簡單做啦,改用window.open,因為視窗開啟後,其它頁面還是都能作業,所以父頁不能在那等待接值,因此要從子頁主動回傳參數才行,所以我們就要利用以下的方式進行改寫
呼叫頁(父頁)  宣告一個function 準備來接收子頁的回傳值
function setReturnValue(data){
  if (data != null)  {
        document.forms[0].elements["id"].value = data[0];
        ….
    }
}


處理頁(子頁) 在原本的window.returnValue =…  改成用
  window.opener.setReturnValue(data) ;

將值傳至父頁,這樣即可完成改寫啦,希望這篇說明能幫助到你!!

參考資料:

2017年5月23日 星期二

showModalDialog在IE11失效排除法


Javascript showModalDialog 是非正規的用法,微軟自己發明的,原本其它瀏覽器都還有支援,但在chrome v37 之後也不支援了,沒想到微軟在IE10之後自己也不支援了,真是有點給他OOXX的
所以目前一些舊網站如有使用了showModalDialog  要如何是好呢? 如果是只限IE使用的網站,最簡單的就是在網頁上強制降版使用相容性來檢視 這樣就能恢復原有的功能,只要在網頁的meta加上以下這句,這樣在開啟網頁時就會自動以IE8的相容性檢視來運行此網頁

<meta http-equiv="x-ua-compatible" content="ie=8" />

不過這個只限網站在IE瀏覽器上使用,如要在其它瀏覽器上使用,只能走上改寫一途了

2017年3月7日 星期二

CKEditor 如何設定資料無

標籤


CKEditor 預設在使用時,會在最外層加上<P> </P>
剛好遇到一個案例,是需要一行的CKEditor
當編輯好的內容於 前端顯示時,會因為<P> </P> 所以導致 呈現時 資料造成版型跑掉了

因此,要改一下參數,讓CKEditor 不要加上<P> 標籤

可以修改 CKEditor\config.js
CKEDITOR.editorConfig = function( config ) { config.enterMode = CKEDITOR.ENTER_BR // pressing the ENTER Key puts the <br/> tag config.shiftEnterMode = CKEDITOR.ENTER_P; //pressing the SHIFT + ENTER Keys puts the <p> tag }; 

這樣在使用編輯器時,就不會帶入<P> tag了,不過原本已存在的資料 不會讀出自行去除<P> 這還是要靠自己才行


參考資料:
https://processwire.com/talk/topic/10999-ckeditor-remove-wrapping-from-in-source-code/

2017年1月10日 星期二

MYSQL忘記密碼重設密碼


當忘記MYSQL 密碼或是將一個資料庫儲存實體移至在別處執行時
有可能會出現以下訊息:

ERROR 1045 (28000): Access denied for user 'root'@'127.0.0.1' (using password: YES)



如要重設密碼來解這問題,可以依以下方式操作:

1.先停掉mysql 服務,在console or command line 下執行

mysqld --skip-grant-tables
這個指令用以啟動mysql,但會跳過權限檢查。

網路上有人寫只要在my.ini 之中的
[mysqld] 下加上
skip-grant-tables

後重啟MYSQL 也可以做到

2.要另一個console 下連線mysql的指令

mysql -u root

應該就可以不進行權限驗證,連線登入成功

3.進行密碼的重設
use mysql

UPDATE user SET password=PASSWORD("123456") WHERE User = 'root' AND Host = 'localhost';

而在新版的MYSQL (EX: v5.7.x )權限架構已有些不同,所以要改用以下指令執行:

UPDATE mysql.user SET authentication_string = PASSWORD('123456'), password_expired = 'N'  WHERE User = 'root' AND Host = 'localhost';

4.執行後即完成密碼重置的動作,別忘了 mysql 要重啟服務,如果你不是改在參數檔,像我上述第一點請執行以下指令:

c:\mysql\bin\mysqladmin -u root shutdown

5.重啟後即可利用新密碼登入系統


2017年1月3日 星期二

Tomcat AJP connecting to backend failed 排除

最近在追查apache+tomcat 一天總有一二次的不明斷線,而等一陣子後就正常了,系統也不用重啟 在查了log發現以下ERROR LOG
  ajp_send_request::jk_ajp_common.c (1630): (ap) connecting to backend failed. Tomcat is probably not started or is listening on the wrong port (errno=60) 

看起來是因這個問題產出的LOG,去查了一下,蠻多在JBOSS上會發一這問題,不管用mod_jk或是用mod_proxay_ajp 都會發生 所以依建議,調整connectionTimeout 看看是否能改善


<connector address="${jboss.bind.address}" connectiontimeout="60000000" emptysessionpath="true" enablelookups="false" maxthreads="1000" port="8009" protocol="AJP/1.3" redirectport="8443">
參考資料:
http://stackoverflow.com/questions/13061385/apache-mod-jk-module-fail-to-connect-jboss-after-running-some-time

2016年12月8日 星期四

[Resolve]Apache2.4 (OS 64)指定的網路名稱無法使用 AH00341: winnt_accept: Asynchronous AcceptEx failed. 問題排除

新裝的Apache 2.4.x 版本 在windows 平台上安裝好 看起來正常,但執行一會就無法連上了
而services 都還是正常啟動的 只是無法連線,重啟後又正常但沒多久又會再次發生

查詢ERROR LOG 發現以下錯誤訊息
Apache (OS 64)指定的網路名稱無法使用 AH00341: winnt_accept: Asynchronous AcceptEx failed.


找了一下發現蠻多人都有此問題,有人提及 apache 2.0 可以在httpd.conf mpm_winnt 加上 Win32DisableAcceptEx參數即可排除此問題

<IfModule mpm_winnt.c>
Win32DisableAcceptEx
EnableMMAP Off
EnableSendfile Off
ThreadsPerChild 1700
MaxRequestsPerChild 0
</IfModule>

說AcceptEx()是一個微軟的WinSock2 API ,通過使用BSD風格的accept() API提供了性能改善。一些流行的Windows產品,比如防病毒軟件或虛擬專用網絡軟件,會幹擾AcceptEx()的正確操作。

官方也有相關的參考說明:
http://httpd.apache.org/docs/2.0/mod/mpm_winnt.html#win32disableacceptex 


但http.conf裡找不到mpm_winnt,看來可能不適用,網路也一堆人反應沒效果
再找了一下發現把conf/httpd.conf 之中註解掉的 EnableMMAP  & EnableSendfile

#EnableMMAP off
#EnableSendfile on

#AcceptFilter http none
#AcceptFilter https none

打開並設定如下

EnableMMAP off
EnableSendfile off
AcceptFilter http none
AcceptFilter https none

至於AcceptFilter ,有文章提及Apache 如有變慢的情況或是假死(就是上述提及的狀況) 可以將此參數也打開

但如果加了AcceptFilter https none不能使用ssl的情況,則要重新MARK #AcceptFilter https none(我是沒有遇過,是參考的文件中有提及,標示出來留意一下)

相關的參考說明: