MozTW 討論區

各項 Mozilla 相關軟體與技術討論
現在的時間是 2025-08-20, 13:22

所有顯示的時間為 UTC + 8 小時





發表新文章 回覆主題  [ 6 篇文章 ] 
發表人 內容
文章發表於 : 2007-06-10, 15:24 
離線

註冊時間: 2006-06-30, 00:10
文章: 23
我在詳細說明我的問題好了
我是想做一個套件,放在statusbar,滑鼠一移上去,他就會用Ajax去外面抓匯率的資料,並且利用toolTipText顯示出來


我用Ajax取得
https://ibank.hncb.com.tw/netbank/servl ... e=chineseh

網站的原始碼,並且把他存msg到變數中

我用
var find = msg.indexOf("即時匯率",0)
去找,老是回傳-1

可是我用window.alert(msg)秀出原始碼時,
編碼又是正常的

另外
我去另一個網站又是不一樣的情況
我去
http://consumer.chinatrust.com.tw/ch/in ... _RATE.html
用Ajax取回來的中文是亂碼
而在tooltip顯示的也是亂碼
但是可以使用indexOf找到中文字

而這兩個網站的charSet都是big-5
照理來說,應該會有同樣的情況


另外我發現到,那個會回傳亂碼的網站(http://consumer.chinatrust.com.tw/ch/in ... _RATE.html )
他網頁編碼是big5,我用firefox去瀏覽該網站,並把該網站的編碼強制設定為utf-8
看到的亂碼跟我用Ajax,秀在status-bar的tooltip是一模一樣的

我聽說用ajax去取得的編碼是utf-8,而套件的xul檔編碼應該也是utf-8,所以他把資料顯示成utf-8
不知道是不是這樣...



這是我的Script,外面的onmouseover是從show()開始
=============================
代碼:
   var http_request = false;
   var msg;

   //Ajax的部份
    function makeRequest(url) {
        http_request = false;

        if (window.XMLHttpRequest) { // Mozilla, Safari,...
            http_request = new XMLHttpRequest();
         
            if (http_request.overrideMimeType) {
                http_request.overrideMimeType('text/xml');
            }
        } else if (window.ActiveXObject) { // IE
            try {
                http_request = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    http_request = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {}
            }
        }

        if (!http_request) {
            alert('Giving up :( Cannot create an XMLHTTP instance');
            return false;
        }
      //http_request.setRequestHeader( "Content-Type", "text/html;charset=big5" );
        http_request.onreadystatechange = alertContents;
        http_request.open('get', url, true);
        http_request.send(null);

    }

   //移掉所有在該節點的元素
   function removeAllChild(eleName){
      var parent = document.getElementById(eleName);
      while (parent.hasChildNodes()){
         parent.removeChild(parent.lastChild);
      }   
   }
   
   //加一行到指定的 toolTipId 中
   function addLine(toolTipId,msg){
      var parent =  document.getElementById(toolTipId);
      aEl = document.createElement("label");
      aEl.setAttribute("value",msg);
      parent.appendChild(aEl);
      aEl=null;
      parent=null;
   }
   
   function showInTooltip(toolTipId,msg){
      removeAllChild(toolTipId);
      var parent =  document.getElementById(toolTipId);
      var high = msg.length/150;
      for(i=0; i<3; i++){
         var aLine = msg.substring(0+i*150,150+i*150);
         addLine(toolTipId,aLine);
         aLine=null;
      }
   }
   
   
    function alertContents() {

   //window.alert(http_request.readyState);
   //window.alert(http_request.status);
        if (http_request.readyState == 4) {
            if (http_request.status == 200) {
            try{   
            
               msg = http_request.responseText;
               showInTooltip("erw-vbox",msg);
            
               var find1 = msg.match(/即時匯率/);
               var find2 = msg.indexOf(/即時匯率/);
               //window.alert(find1);
               //window.alert(find2);
      
               addLine("erw-vbox","aaaaaaaaaaaaaaaaaaaaaaaaaa");
               addLine("erw-vbox",find2);
            }catch(err){
               var errMsg;
               window.alert("err");   
               errMsg +="err.name = " + err.name + "\n";
               errMsg +="err.message = " + err.message + "\n";
               errMsg +="err.description = " + err.description + "\n";
               window.alert(errMsg);   
            }
            
            } else {
                alert('There was a problem with the request.');
            }
        }
    }
   
function show()
{
   //正常編碼
   makeRequest("https://ibank.hncb.com.tw/netbank/servlet/TrxDispatcher?trx=com.lb.wibc.trx.ExtSelect&state=prompt&rate=chinese");
   
   //不正常編碼
   //makeRequest("http://consumer.chinatrust.com.tw/ch/int_rate/EX_RATE.html");   
}


最後由 ericwang1017 於 2007-06-11, 14:54 編輯,總共編輯了 4 次。

回頂端
Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4
 個人資料  
引用回覆  
 文章主題 :
文章發表於 : 2007-06-11, 06:12 
離線
[網站管理員]
頭像

註冊時間: 2004-09-27, 09:24
文章: 1685
那如果用 msg.match(/即時匯率/) 行嗎?

_________________
korp + korp 中文站(沒精神更新)


回頂端
Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3
 個人資料  
引用回覆  
 文章主題 :
文章發表於 : 2007-06-11, 10:06 
離線

註冊時間: 2006-06-30, 00:10
文章: 23
var find1 = msg.match(/即時匯率/);
var find2 = msg.indexOf(/即時匯率/);
window.alert(find1);
window.alert(find2);

出現null與-1
看起來是都不行 >_<


回頂端
Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-TW; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4
 個人資料  
引用回覆  
 文章主題 :
文章發表於 : 2007-06-11, 15:53 
離線

註冊時間: 2006-06-30, 00:10
文章: 23
現在已經實驗了幾個網站...
//charset = big5,卻正常編碼 //makeRequest("https://ibank.hncb.com.tw/netbank/servlet/TrxDispatcher?trx=com.lb.wibc.trx.ExtSelect&state=prompt&rate=chinese");

//charset = big5,卻不正常編碼
//makeRequest("http://consumer.chinatrust.com.tw/ch/int_rate/EX_RATE.html");

//utf-8,大陸網站
makeRequest("http://www.xe.com/zh/");

只有不正常編碼那個網站的indexOf會順利找出中文字,其他都掛

而match我只有試過大陸網站,是可以抓到的,但是indexOf一樣掛

另外,XUL看起來像是XML,可是我想用
<?xml version="1.0" encoding="Big5"?>
強迫他使用big5解讀 似乎沒用


回頂端
Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-TW; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4
 個人資料  
引用回覆  
 文章主題 :
文章發表於 : 2007-06-11, 16:58 
離線

註冊時間: 2006-06-30, 00:10
文章: 23
後來不拘泥國內網站,跑去找國外網站就ok了
使用的是http://www.x-rates.com/d/TWD/table.html
網頁的資料

不過做這種擷取網站內容,在做Parse的動作,實在是dirty Work!

不過做了就做了,算是練習吧...
一度被中文編碼搞的氣死,做這個還是不要太拘泥中文資料比較好...

功能照片如下
圖檔


附加檔案:
2007-06-11_165050.jpg [24.57 KiB]
被下載 1166 次


最後由 ericwang1017 於 2007-06-11, 18:23 編輯,總共編輯了 1 次。
回頂端
Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-TW; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4
 個人資料  
引用回覆  
 文章主題 :
文章發表於 : 2007-06-11, 18:22 
離線

註冊時間: 2006-06-30, 00:10
文章: 23
後來我發現台灣銀行有UTF-8的即時匯率
http://rate.bot.com.tw/Pages/Static/UIP003.zh-TW.htm

改了一下馬上又可以用了

代碼:
   var http_request = false;
   var msg;

   //Ajax的部份
    function makeRequest(url) {
        http_request = false;

        if (window.XMLHttpRequest) { // Mozilla, Safari,...
            http_request = new XMLHttpRequest();
         
            if (http_request.overrideMimeType) {
                http_request.overrideMimeType('text/xml');
            }
        } else if (window.ActiveXObject) { // IE
            try {
                http_request = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    http_request = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {}
            }
        }

        if (!http_request) {
            alert('Giving up :( Cannot create an XMLHTTP instance');
            return false;
        }
      //http_request.setRequestHeader("Content-Type","application/x-www-form-urlencoded;");
      //http_request.setRequestHeader("charset","utf-8");
        http_request.onreadystatechange = alertContents;
        http_request.open('get', url, true);
        http_request.send(null);

    }

   //移掉所有在該節點的元素
   function removeAllChild(eleName){
      var parent = document.getElementById(eleName);
      while (parent.hasChildNodes()){
         parent.removeChild(parent.lastChild);
      }   
   }
   
   //加一行到指定的 toolTipId 中
   function addLine(toolTipId,msg){
      var parent =  document.getElementById(toolTipId);
      aEl = document.createElement("label");
      aEl.setAttribute("value",msg);
      parent.appendChild(aEl);
      aEl=null;
      parent=null;
   }
   
   function showInTooltip(toolTipId,msg){
      removeAllChild(toolTipId);
      var parent =  document.getElementById(toolTipId);
      var high = msg.length/150;
      for(i=0; i<10; i++){
         var aLine = msg.substring(0+i*150,150+i*150);
         addLine(toolTipId,aLine);
         aLine=null;
      }
   }
   
   
    function alertContents() {
      //window.alert(http_request.readyState);
      switch(http_request.readyState){               
      case 1:
         removeAllChild("erw-vbox");
         addLine("erw-vbox","正在連接...")
         break;
      case 2:
         removeAllChild("erw-vbox");
         addLine("erw-vbox","正在讀取...")                       
         break;
      case 3:
         removeAllChild("erw-vbox");
         addLine("erw-vbox","正在交互...")                                                 
         break;
      case 4:
            if (http_request.status == 200) {
            try{   
               //window.alert(http_request.getAllResponseHeaders());
               removeAllChild("erw-vbox");
               msg = http_request.responseText;
               
               
               
               //showInTooltip("erw-vbox",msg);
               
               var result;
               result = findKeyWord("美金 (USD)",msg,2);
               addLine("erw-vbox","美金:" + result);
               
               result = findKeyWord("歐元 (EUR)",msg,2);
               addLine("erw-vbox","歐元:" + result);
               
               result = findKeyWord("港幣 (HKD)",msg,2);
               addLine("erw-vbox","港幣:" + result);
               
               result = findKeyWord("英鎊 (GBP)",msg,2);
               addLine("erw-vbox","英鎊:" + result);
               
               result = findKeyWord("澳幣 (AUD)",msg,2);
               addLine("erw-vbox","澳幣:" + result);
               
               result = findKeyWord("加拿大幣 (CAD)",msg,2);
               addLine("erw-vbox","加拿大幣:" + result);
               
               result = findKeyWord("日圓 (JPY)",msg,2);
               addLine("erw-vbox","日圓:" + result);
               
               
               
               
      
            }catch(err){
               var errMsg="";
               errMsg +="name :" + err.name + "\n";
               errMsg +="message : " + err.message + "\n";
               errMsg +="description : " + err.description + "\n";
               window.alert(errMsg);   
            }
            
            } else {
                alert('There was a problem with the request.');
            }
        }
    }   
   
function show()
{
   //正常編碼
   //makeRequest("https://ibank.hncb.com.tw/netbank/servlet/TrxDispatcher?trx=com.lb.wibc.trx.ExtSelect&state=prompt&rate=chinese");
   
   //不正常編碼
   //makeRequest("http://consumer.chinatrust.com.tw/ch/int_rate/EX_RATE.html");   
   
   //utf-8,大陸網站
   //makeRequest("http://www.xe.com/zh/");   
   
   //國外網站
   //makeRequest("http://www.x-rates.com/d/TWD/table.html");   
   
   //台灣銀行 UTF-8
   makeRequest("http://rate.bot.com.tw/Pages/Static/UIP003.zh-TW.htm");   
}

function findKeyWord(keyWord,source,cellNo){
   var startWord = "/Images/Flags/America.gif";
   var endWord = "</td><td class=";
   
   //通常是Table的起始
   var startIdx = source.indexOf(startWord);
   
   //從table的起點往後找KeyWord
   var keyWordIdx = source.indexOf(keyWord,startIdx);

   //從keyword往後找結束符號
   var temp = keyWordIdx;
   for(i=0; i<cellNo; i++){
      temp = source.indexOf(endWord,temp)+1;
   }
   endIdx = temp-1;
   
   //從EndIndex往前找,找>關鍵字,但是要往前移一個
   var curIdx = source.lastIndexOf(">",endIdx)+1;
   return source.substring(curIdx,endIdx);
}




回頂端
Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-TW; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4
 個人資料  
引用回覆  
顯示文章 :  排序  
發表新文章 回覆主題  [ 6 篇文章 ] 

所有顯示的時間為 UTC + 8 小時


誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 8 位訪客


不能 在這個版面發表主題
不能 在這個版面回覆主題
不能 在這個版面編輯您的文章
不能 在這個版面刪除您的文章
不能 在這個版面上傳附加檔案

搜尋:
前往 :  
cron
Powered by phpBB® Forum Software © phpBB Group
正體中文語系由 竹貓星球 維護製作
© moztw.org, Mozilla Foundation
MozTW,Mozilla 台灣社群