world_eyes

          記錄點滴的地方

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            10 隨筆 :: 3 文章 :: 1 評論 :: 0 Trackbacks

          2009年4月11日 #

            在Android的應用程序開發中,通常使用的是Java語言,除了要熟悉Java語言的基礎外,還需要了解Android提供的Java擴展功能。

          一、重要包描述

          Android.app:提供高層的程序模型、提供基本的運行環境。

          Android.content:包含對各種的設備上的數據進行訪問和發布的類。

          Android.database:通過內容提供者瀏覽和操作數據庫。

          Android.graphics:底層的圖形庫,包含畫布、顏色過濾、點、矩形,可以將它們直接繪制到屏幕上。

          Android.location:定位和服務的相關類。

          Android.media:提供了一些管理音頻視頻的媒體接口的相關類。

          Android.net提供了關于網絡訪問的類,超過通常的java.net.*接口。

          Android.os:提供了系統服務,消息傳輸,IPC機制。

          Android.opengl:提供了OpenGL的工具。

          Android.provider:提供類訪問Android的內容提供者。

          Android.telephony:提供與撥打電話相關的API交互

          Android.view:提供基本的用戶界面接口框架。

          Android.util:涉及工具性的方法,例如時間日期型的操作。

          Android.webkit:默認瀏覽器操作接口。

          Android.widget:包含各種U元素,在應用程序的屏幕中使用。

          二、Android的相關文件類型概述

          Java文件---應用程序源文件

          Android的應用必須使用Java來開發。

          Class文件---Java編譯后的目標文件。

          不想J2SE,java編譯成class文件就直接可以運行,Android平臺上的class 文件不能直接在Android平臺上運行。由于google使用了自己的Dalvik來運行應用,所以這里的class也肯定不能在Android Dalvik上運行,Androidclass文件實際上只是編譯過程的中間目標文件,需要鏈接成Dex文件才能運行在Dalvik上。

          Dex文件---Android平臺上的可執行文件。

          Dalvik執行的并非是Java字節碼,而是另一種字節碼:dex格式的字節碼(Java字節碼->dex字節碼)。Dalvik可以執行許多VM而不會占用太多的Resource.

          APK 文件---Android上的安裝文件

          APKAndroid安裝包的擴展名,一個Android安裝包包含了與某個應用程序相關的所有文件,APK文件將AndroidMainfest.xml文件、應用程序代碼(DEX)文件、資源文件和其他文件打成一個壓縮包。一個工程只能打進一個.apk文件。

           

          三、Android ADB工具的使用

          ADBAndroid提供的一個通用調試工具,借助這個工具,我們管理手機模擬器的狀態。

          1.ADB功能操作

          快速更新設備或手機模擬器的代碼,如應用或Android系統升級。

          在設備上運行shell命令

          管理設備或手機模擬器上的預定接口

          在設備或手機模擬器上復制、粘貼文件

          2.ADB的常用操作

          安裝應用到模擬器

          adb install app.apk

          Android沒有提供一個卸載應用的命令,只能手動刪除:

          Adb shell

          Cd data/app

          Rm.app.apk

          進入設備或模擬器的shell

          Adb shell

          通過以上命令,可以進入設備或模擬器的shell環境中,在這個shell中,你可以執行各種Linux的命令,另外如果只想執行一條shell命令,可以采用以下方式:

          Adb shell[command]

          如:

          Adb shell emesg

          會打印出內核的調試信息

          發布端口

          可以設置任意的端口號,作為主機箱模擬器或設備的請求端口。如:

          Adb forward tcp 5555 tcp8000

          復制文件

          復制一個文件或目錄到設備或模擬器上;

          Adb push

          如:

          Adb push test.txt/tmp/test.txt

          Adb pull

          如:

          Adb pull /Android/lib/libwebcore.os

          搜索/等待模擬器、設備實例

          取得當前運行的模擬器、設備的實例列表及每個實例的狀態或等待正在運行的設備

          Adb devices 

          Adb wait-for-device

          查看debug報告

          Adb bugreport

          記錄無線通信日志

          無線通信日志非常多,在運行時沒必要記錄,可以通過命令設置記錄

          Adb shell

          Logcat -b radio

          獲取設備ID和序列號

          Adb get-product 

          Adb get-serialno

          訪問數據庫SQLite3

          Adb shell

          Sqlite3

          posted @ 2011-03-09 10:25 world_eyes 閱讀(351) | 評論 (0)編輯 收藏

          轉載來的,遇到這樣問題的朋友應該不多,我是配置好環境了,也裝了個PHP的CMS測試過了,PHPMYADMIN運行也正常,但是運行另外一套 PHP網站程序就出現HTTP 500服務器內部錯誤,還好找到了解決辦法!

          感謝Oliver分享,原文 地址:http://tech.flyingcat.cn/?p=212

          在IIS + PHP的環境下安裝phpmyadmin或wordpress的時候經常會發生一個奇怪的現象,例如:phpmyadmin安裝的web文件夾根目錄的話 打開顯示HTTP 500服務器內部錯誤,但將網站放到一個子目錄下就沒問題。
          這個問題的原因在于phpmyadmin和wordpress等程序的index.php文件中都用到了require(./xxx.php)這樣的語 句。

          解決辦法1
          把里面的require(./xxx.php)改成 require(xxx.php)。

          解決辦法2
          給網站的上級目錄賦予iis用戶讀權限。

          posted @ 2010-06-08 10:19 world_eyes 閱讀(8789) | 評論 (1)編輯 收藏

          經常有朋友在安裝某種小軟件后,IE主頁被篡改,而你在ie選項里改回來后,再打開又時主頁又變成了另外一個網址。這說明這個流氓軟件在注冊表里還 有別的 窠,這些可能位置都有哪些呢?我們根據有限經驗,先列出最重要的這幾條,期待朋友們補充更多的發現。點擊開始-運行-輸入regedit回車,依次找到如 下位置——當然,筆者推薦使用Registry Workshop軟件,可以直接粘 貼以下地址回車,并將該地址添加到收藏夾,以后舊的不用再找,新的也可見者收藏。

          1、internet選項對應的注冊表值:

          HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerMainStart Page

          這項的值和ie選項里的主頁是同步的,可以先試試。convert swf to avi

          2、綁定ie主程序運行參數:

          HKEY_CLASSES_ROOTApplicationsiexplore.exeshellopencommand

          這項的正常值是”C:Program FilesInternet ExplorerIEXPLORE.EXE” %1,流氓軟件將自己的網址附加在后面當作一個運行參數,那么打開ie主程序時就會自動跳轉到該網址,這招夠狠。

          3、 綁定ie窗體控件ieframe.dll主頁命令:

          HKEY_CLASSES_ROOTCLSID{871C5380-42A0-1069-A2EA-08002B30309D}shellOpenHomePageCommand

          這項的默認值是”C:Program FilesInternet Exploreriexplore.exe”,同樣,流氓網址可能附加在后面,攔截主頁。

          4、綁定ie快捷方式運行目標:

          還有一種在注冊表里無論如何也搜索不到,卻遠在天邊近在眼前的手段,就是修改了ie 快捷方式屬性里的運行目標。注意是快捷方式,不是桌面默認顯示的ie圖標。正常的ie快捷方式有四種

          可以看出上面三個ie快捷方式依次是由桌面ie圖標創建、由開始菜單頂端ie圖標創建、由系統盤ie主程序創建的(當然如果你隱藏了擴展名,第三個 快捷 方式就沒有.exe后綴),flv player 第四種是在開始按鈕右邊快速啟動欄上的“啟動Internet Explorer”圖標。右鍵查看這些快捷方式屬性

          筆者快速啟動欄已刪除啟動ie的圖標,擱筆追思,遠求而來,故上面窗口略顯異域。這兩個 快捷方式,目標默認值都是”C:Program FilesInternet Exploreriexplore.exe”,這下病毒又有空可鉆了,只要把自己的網址追加到后面,那么你經這個圖標打開ie時,就會立即跳到它的網 址,真是無所不用其極。

          所以筆者建議,如果主頁被篡改并改不回來了,請先右鍵你 啟動ie時所打開的快捷方式,看屬性“目標”后面有無追加網址,有則刪之;不行的話就去注冊表里查看那些可能位置:

          HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerMainStart Page
          HKEY_CLASSES_ROOTApplicationsiexplore.exeshellopencommand
          HKEY_CLASSES_ROOTCLSID{871C5380-42A0-1069-A2EA-08002B30309D}shellOpenHomePageCommand

          看值的后面有沒有“尾巴”,這些網址有時可能是亂碼,全部剪掉,swf to mov回 復默認值,主頁就改回來 了。這樣只是暫時堵住,若想徹底杜絕,請先卸載新安裝的流氓軟件,以后也莫亂逛網站或接受推薦下載安裝那些你以為是發現新天地其實可 能早已臭名昭著的小流氓。當然,如果你熟悉了更多的篡改主頁伎倆,就不用有這些顧慮了。筆者再次推薦注冊表管理軟件Registry Workshop,平時多積累自己的 發現,保持“與毒俱進”,將病毒流氓的伎倆盡收囊中。那么以后就可以高枕無憂了。

          posted @ 2010-06-04 18:04 world_eyes 閱讀(382) | 評論 (0)編輯 收藏

               Tomcat下,不同的二級域名,Session默認是不共享的,因為Cookie名稱為JSESSIONID的Cookie根域是默認是沒設置的,訪問 不同的二級域名,其Cookie就重新生成,而session就是根據這個Cookie來生成的,所以在不同的二級域名下生成的Session也不一樣。 找到了其原因,就可根據這個原因對Tomcat在生成Session時進行相應的修改(注:本文針對Tomcat 6.0)。

               單個web項目運行在tomcat上但是卻使用多個子域名,如:

           - site.com
           - www.site.com
           - sub1.site.com
           - sub2.site.com
           - etc.

           

          這樣會導致session的不能共享,在網絡上查找的并卻最快的解決辦法。

           

          解決辦法:

          Usage:
           - compile CrossSubdomainSessionValve & put it in a .jar file
           - put that .jar file in $CATALINA_HOME/lib directory
           - include a <Valve className="org.three3s.valves.CrossSubdomainSessionValve"/> in
          $CATALINA_HOME/conf/server.xml

          package org.three3s.valves;

          import java.io.*;

          import javax.servlet.*;
          import javax.servlet.http.*;

          import org.apache.catalina.*;
          import org.apache.catalina.connector.*;
          import org.apache.catalina.valves.*;
          import org.apache.tomcat.util.buf.*;
          import org.apache.tomcat.util.http.*;

          /**
           * <p>
           * Replaces the domain of the session cookie generated by Tomcat with a domain
           * that allows that session cookie to be shared across subdomains. This valve
           * digs down into the response headers and replaces the Set-Cookie header for
           * the session cookie, instead of futilely trying to modify an existing Cookie
           * object like the example at 
          http://www.esus.be/blog/?p=3. That approach does
           * not work (at least as of Tomcat 6.0.14) because the
           * <code>org.apache.catalina.connector.Response.addCookieInternal</code> method
           * renders the cookie into the Set-Cookie response header immediately, making
           * any subsequent modifying calls on the Cookie object ultimately pointless.
           * </p>
           * 
           * <p>
           * This results in a single, cross-subdomain session cookie on the client that
           * allows the session to be shared across all subdomains. However, see the
           * {
          @link getCookieDomain(Request)} method for limits on the subdomains.
           * </p>
           * 
           * <p>
           * Note though, that this approach will fail if the response has already been
           * committed. Thus, this valve forces Tomcat to generate the session cookie and
           * then replaces it before invoking the next valve in the chain. Hopefully this
           * is early enough in the valve-processing chain that the response will not have
           * already been committed. You are advised to define this valve as early as
           * possible in server.xml to ensure that the response has not already been
           * committed when this valve is invoked.
           * </p>
           * 
           * <p>
           * We recommend that you define this valve in server.xml immediately after the
           * Catalina Engine as follows:
           * 
           * <pre>
           * &lt;Engine name=&quot;Catalina&quot;&gt;
           *     &lt;Valve
           * className=&quot;org.three3s.valves.CrossSubdomainSessionValve&quot;/&gt;
           * </pre>
           * 
           * </p>
           
          */
          public class CrossSubdomainSessionValve extends ValveBase {
              
          public CrossSubdomainSessionValve() {
                  
          super();
                  info 
          = "org.three3s.valves.CrossSubdomainSessionValve/1.0";
              }

              @Override
              
          public void invoke(Request request, Response response) throws IOException, ServletException {
                  
          // this will cause Request.doGetSession to create the session cookie if
                  
          // necessary
                  request.getSession(true);

                  
          // replace any Tomcat-generated session cookies with our own
                  Cookie[] cookies = response.getCookies();
                  
          if (cookies != null) {
                      
          for (int i = 0; i < cookies.length; i++) {
                          Cookie cookie 
          = cookies[i];
                          
          // System.out.println("CrossSubdomainSessionValve: Cookie name is "
                          
          // + cookie.getName());
                          if (Globals.SESSION_COOKIE_NAME.equals(cookie.getName())) replaceCookie(request, response, cookie);
                      }
                  }

                  
          // process the next valve
                  getNext().invoke(request, response);
              }

              
          /**
               * Replaces the value of the response header used to set the specified
               * cookie to a value with the cookie's domain set to the value returned by
               * <code>getCookieDomain(request)</code>
               * 
               * 
          @param request
               * 
          @param response
               * 
          @param cookie
               *            cookie to be replaced.
               
          */
              
          protected void replaceCookie(Request request, Response response, Cookie cookie) {
                  
          // copy the existing session cookie, but use a different domain
                  Cookie newCookie = new Cookie(cookie.getName(), cookie.getValue());
                  
          // System.out.println("CrossSubdomainSessionValve: CookiePath is " +
                  
          // cookie.getPath());
                  if (cookie.getPath() != null) newCookie.setPath(cookie.getPath());
                  String domain 
          = getCookieDomain(request);
                  
          if (!".piaoyoo.com".equals(domain)) domain = request.getServerName();
                  
          // System.out.println("CrossSubdomainSessionValve: CookieDomain is " +
                  
          // domain);
                  newCookie.setDomain(domain);
                  newCookie.setMaxAge(cookie.getMaxAge());
                  newCookie.setVersion(cookie.getVersion());
                  
          // System.out.println("CrossSubdomainSessionValve: CookieComment is " +
                  
          // cookie.getComment());
                  if (cookie.getComment() != null) newCookie.setComment(cookie.getComment());
                  newCookie.setSecure(cookie.getSecure());

                  
          // if the response has already been committed, our replacement strategy
                  
          // will have no effect
                  if (response.isCommitted()) System.out.println("Error CrossSubdomainSessionValve: response was already committed!");

                  
          // find the Set-Cookie header for the existing cookie and replace its
                  
          // value with new cookie
                  MimeHeaders headers = response.getCoyoteResponse().getMimeHeaders();
                  
          for (int i = 0, size = headers.size(); i < size; i++) {
                      
          if (headers.getName(i).equals("Set-Cookie")) {
                          MessageBytes value 
          = headers.getValue(i);
                          
          if (value.indexOf(cookie.getName()) >= 0) {
                              StringBuffer buffer 
          = new StringBuffer();
                              ServerCookie.appendCookieValue(buffer, newCookie.getVersion(), newCookie.getName(), newCookie.getValue(),
                                      newCookie.getPath(), newCookie.getDomain(), newCookie.getComment(), newCookie.getMaxAge(), newCookie
                                              .getSecure());
                              
          // System.out.println("CrossSubdomainSessionValve: old Set-Cookie value: "
                              
          // + value.toString());
                              
          // System.out.println("CrossSubdomainSessionValve: new Set-Cookie value: "
                              
          // + buffer);
                              
          // System.out.println("-----------------------------");
                              value.setString(buffer.toString());
                          }
                      }
                  }
              }

              
          /**
               * Returns the last two parts of the specified request's server name
               * preceded by a dot. Using this as the session cookie's domain allows the
               * session to be shared across subdomains. Note that this implies the
               * session can only be used with domains consisting of two or three parts,
               * according to the domain-matching rules specified in RFC 2109 and RFC
               * 2965.
               * 
               * <p>
               * Examples:
               * </p>
               * <ul>
               * <li>foo.com => .foo.com</li>
               * <li>www.foo.com => .foo.com</li>
               * <li>bar.foo.com => .foo.com</li>
               * <li>abc.bar.foo.com => .foo.com - this means cookie won't work on
               * abc.bar.foo.com!</li>
               * </ul>
               * 
               * 
          @param request
               *            provides the server name used to create cookie domain.
               * 
          @return the last two parts of the specified request's server name
               *         preceded by a dot.
               
          */
              
          protected String getCookieDomain(Request request) {
                  String cookieDomain 
          = request.getServerName();
                  String[] parts 
          = cookieDomain.split("\\.");
                  
          if (parts.length >= 2) cookieDomain = parts[parts.length - 2+ "." + parts[parts.length - 1];
                  
          return "." + cookieDomain;
              }

              
          public String toString() {
                  
          return ("CrossSubdomainSessionValve[container=" + container.getName() + ']');
              }
          }



          posted @ 2010-06-04 17:17 world_eyes 閱讀(1682) | 評論 (0)編輯 收藏


          一臺服務器幾乎所有網站打開網頁 甚至HTML網頁 都出現了

          <i*f*r*a*m*e src="http://xxx.xx.htm" height=0 width=0></<i*f*r*a*m*e>
          這種樣式的代碼 有的在頭部 有的在尾部 部分殺毒軟件打開會報毒

          打開HTML或ASP PHP頁面 在源碼中怎么也找不到這段代碼

          分析原因

          首先懷疑ARP掛馬,用防ARP的工具又沒有發現有arp欺騙

          而且arp欺騙一般不會每次都被插入代碼,而是時有時無

          而且使用http://127.0.0.1 或者http://localhost 訪問的時候也可以找到這段代碼

          arp欺騙的可能排除。

          然后就想到可能是JS被篡改,或者是其它的包含文件,查找后沒有發現被改的頁面 連新建的HTML頁面瀏覽的時候也會被插入這段代碼,那就只能是通過IIS掛上去的了。

          備份iis數據然后重裝iis,代碼消失,將備份的iis恢復,問題又來了。


          仔細尋找,問題應該出在IIS的配置文件上,打開配置文件,沒有發現那段代碼。

          那很有可能是調用了某個文件,這個怎么查啊,忽然想起了大名鼎鼎的Filemon

          本地載了一個上傳到服務器上,,打開Filemon,數據太多了,過濾掉一些沒有用的

          只留下iis的進程,數據還是很多,看來服務器上的站點還是挺多人在訪問的。

          關掉所有站點,建了一個測試站點anky 目錄為D:\www\ 在下面建了一個空白頁面test.htm

          訪問一下這個頁面代碼被插進來了,再看一下Filemon 奇怪怎么讀取C:\Inetpub\wwwroot\iisstart.htm

          打開C:\Inetpub\wwwroot\iisstart.htm一看,里面就躺著

          <<i*f*r*a*m*e src="http://xx.xxx.jj.htm" height=0 width=0></<i*f*r*a*m*e>

          把代碼刪除了留空,訪問test.htm 正常了,把C:\Inetpub\wwwroot\iisstart.htm刪除了再訪問

          test.htm 出現 “讀取數據頁腳文件出錯”問題就出這里了,看來是調用了

          這個文件。


          把C:\Inetpub\wwwroot\iisstart.htm清空就正常了,這樣怎么行,解決問題當然要連根拔掉。

          continue

          有沒有可能是擴展造成的,到擴展中檢查了一遍全部都是正常的

          當然 通過ISAPI 掛馬的也是存在的

          左想右想最后還是覺得配置文件有問題

          打開配置文件,配置文件在%windir%\system32\inetsrv\Metabase.xml

          用記事本打開,查找iisstart.htm 找到一行,開始以為是默認站點,后來一想不對啊

          默認站點都刪除了,再仔細一看這句代碼為

          DefaultDocFooter="FILE:C:\Inetpub\wwwroot\iisstart.htm"

          刪除掉這一行,問題徹底解決了。

          ==========================================================================
          現象:不管是訪問服務器上的任何網頁,就連404的頁面也會在<html>后加入
          <<i*f*r*a*m*e SRc=http://xxx.xxx.com/k.htm width=1 height=1 frameborder=0></<i*f*r*a*m*e>,掛馬的位置在html標記左右,上面這段惡意代碼,它會每隔幾秒 加入代碼,也就是說在輸出具體的東西之前就被掛了,有時有有時又沒有,不是網頁源代碼問題,也沒有在網頁源代碼中加入惡意代碼,即使重裝服務器,格式化重 分區過第一個硬盤,放上去網站沒多久一樣再會出現這種情況。


          首先就排除了網站被入侵的可能,因為首頁能加在那個位置只能是title的地方,用js控制也不大可能.然后去看了php.ini的設置也沒有任何的異 常,而且這個插入的代碼有的時候出現有的時候不出現,說明不是網站的問題了.打開同服務器的其他網站也有這個情況發生,而且狀況一一樣.檢查并且搜索掛馬 的關鍵字之后確定不是網站程序的問題.

          那么剩下的要么是IIS自己出了問題,要么是網絡的問題,因為數據是處理沒有問題(這個由程序輸出,而且即使是html都會出問題),經過一個一個排查, 最后基本可以確定就是arp欺騙欺騙數據報走向,然后中間人修改一些定義的關鍵字.因為是網絡層次有問題(所以重做系統是沒有用的).


          目的:通過arp欺騙來直接掛馬
          優點:可以直接通過arp欺騙來掛馬.

          通常的arp欺騙的攻擊方式是在同一vlan下,控制一臺主機來監聽密碼,或者結合ssh中間人攻擊來監聽ssh1的密碼.
          但這樣存在局限性:
          1.管理員經常不登陸,那么要很久才能監聽到密碼
          2.目標主機只開放了80端口,和一個管理端口,且80上只有靜態頁面,那么很難利用.而管理端口,如果是3389終端,或者是ssh2,那么非常難監聽 到密碼.

          優點:
          1.可以不用獲得目標主機的權限就可以直接在上面掛馬
          2.非常隱蔽,不改動任何目標主機的頁面或者是配置,在網絡傳輸的過程中間直接插入掛馬的語句.
          3.可以最大化的利用arp欺騙,從而只要獲取一臺同一vlan下主機的控制權,就可以最大化戰果.


          原理:arp中間人攻擊,實際上相當于做了一次代理。

          正常時候: A---->B ,A是訪問的正常客戶,B是要攻擊的服務器,C是被我們控制的主機
          arp中間人攻擊時候: A---->C---->B
          B---->C---->A
          實際上,C在這里做了一次代理的作用

          那么HTTP請求發過來的時候,C判斷下是哪個客戶端發過來的包,轉發給B,然后B返回HTTP響應的時候,在HTTP響應包中,插入一段掛馬的代碼,比 如<愛生活,愛貓撲>...之類,再將修改過的包返回的正常的客戶A,就起到了一個掛馬的作用.在這個過程中,B是沒有任何感覺的,直接攻擊 的是正常的客戶A,如果A是管理員或者是目標單位,就直接掛上馬了.

          什么是ARP?

          英文原義:Address Resolution Protocol 
          中文釋義:(RFC-826)地址解析協議 局域網中,網絡中實際傳輸的是“幀”,幀里面是有目標主機的MAC地址的。所謂“地址解析”就是主機在
          發送幀前將目標IP地址轉換成目標MAC地址的過程。ARP協議的基本功能就是通過目標設備的IP地址,查詢目標設備的MAC地址以保證通信的順利進 行。 

          注解:簡單地說,ARP協議主要負責將局域網中的32為IP地址轉換為對應的48位物理地址,即網卡的MAC地址,比如IP地址為192.168.0.1 網卡MAC地址為00-03-0F-FD-1D-2B。整個轉換過程是一臺主機先向目標主機發送包含IP地址信息的廣播數據包,即ARP請求,然后目標主 機向該主機發送一個含有IP地址和MAC地址數據包,通過MAC地址兩個主機就可以實現數據傳輸了。 

          應用:在安裝了以太網網絡適配器的計算機中都有專門的ARP緩存,包含一個或多個表,用于保存IP地址以及經過解析的MAC地址。在Windows中要查 看或者修改ARP緩存中的信息,可以使用arp命令來完成,比如在Windows XP的命令提示符窗口中鍵入“arp -a”或“arp -g”可以查看ARP緩存中的內容;鍵入“arp -d IPaddress”表示刪除指定的IP地址項(IPaddress表示IP地址)。arp命令的其他用法可以鍵入“arp /?”查看到。
          ============================================================================
          解決方案如下:

          聯系機房,用撥網線的排除法,找出同路由內中了類似47555病毒的機器,隔離。殺毒。

          其他機器,遇到這種情況,重裝系統是沒用的。

          Asion注:  ARP和掛馬 有很深的學問

          來源:http://i.mop.com/Noisa/blog/2008/03/13/6264338.html

          posted @ 2010-06-04 16:04 world_eyes 閱讀(633) | 評論 (0)編輯 收藏

          微軟關于IE、Firefox、Opera和Safari的JavaScript兼容性研究曾經發表過一份草案,可以點擊下載《JScript Deviations from ES3 以下為網上的一些搜集和整理(FF代表Firefox)

           集合類對象問題
          現有代碼中存在許多 document.form.item("itemName") 這樣的語句,不能在 FF 下運行
          解決方法:
          改用 document.form.elements["elementName"]
          說明:IE下,可以使用()或[]獲取集合類對象;Firefox下,只能使用[]獲取集合類對象.
          解決方法:統一使用[]獲取集合類對象.


          window.event
          現有問題:
          使用 window.event 無法在 FF 上運行
          解決方法:
          FF 的 event 只能在事件發生的現場使用,此問題暫無法解決。可以這樣變通:
          原代碼(可在IE中運行):
          <input type="button" name="someButton" value="提交" onclick="javascript:gotoSubmit()"/>
          <script language="javascript">
              function gotoSubmit() {
                 alert(window.event);    // use window.event
              }
          </script>

          新代碼(可在IE和FF中運行):
          <input type="button" name="someButton" value="提交" onclick="javascript:gotoSubmit(event)"/>
          <script language="javascript">
             function gotoSubmit(e) {
                e = e? e : (window.event ? window.event : null);
                alert(e);           
            }
          </script>

          此外,如果新代碼中第一行不改,與老代碼一樣的話(即 gotoSubmit 調用沒有給參數),則仍然只能在IE中運行,但不會出錯。所以,這種方案 tpl 部分仍與老代碼兼容。

           

          HTML 對象的 id 作為對象名的問題
          現有問題:
          在 IE 中,HTML 對象的 ID 可以作為 document 的下屬對象變量名直接使用。在 FF 中不能。
          解決方法:
          用 getElementById("idName") 代替 idName 作為對象變量使用。

          用idName字符串取得對象的問題
          現有問題:
          在IE中,利用 eval(idName) 可以取得 id 為 idName 的 HTML 對象,在FF 中不能。
          解決方法:
          用 getElementById(idName) 代替 eval(idName)。

           

          變量名與某 HTML 對象 id 相同的問題
          現有問題:
          在 FF 中,因為對象 id 不作為 HTML 對象的名稱,所以可以使用與 HTML 對象 id 相同的變量名,IE 中不能。
          解決方法:
          在聲明變量時,一律加上 var ,以避免歧義,這樣在 IE 中亦可正常運行。
          此外,最好不要取與 HTML 對象 id 相同的變量名,以減少錯誤。

           

          event.x 與 event.y 問題
          現有問題:
          在IE 中,event 對象有 x, y 屬性,FF中沒有。
          解決方法:
          在FF中,與event.x 等效的是 event.pageX。但event.pageX IE中沒有。
          故采用 event.clientX 代替 event.x。在IE 中也有這個變量。
          event.clientX 與 event.pageX 有微妙的差別(當整個頁面有滾動條的時候),不過大多數時候是等效的。
          如果要完全一樣,可以稍麻煩些:
          mX = event.x ? event.x : event.pageX;
          然后用 mX 代替 event.x
          其它:
          event.layerX 在 IE 與 FF 中都有,具體意義有無差別尚未試驗。

           

          關于frame
          現有問題:
          在 IE中 可以用window.testFrame取得該frame,FF中不行
          解決方法:
          在frame的使用方面FF和ie的最主要的區別是:
          如果在frame標簽中書寫了以下屬性:
          <frame src="/xx.htm" id="frameId" name="frameName" />
          那么ie可以通過id或者name訪問這個frame對應的window對象
          而FF只可以通過name來訪問這個frame對應的window對象
          例如如果上述frame標簽寫在最上層的window里面的htm里面,那么可以這樣訪問
          IE: window.top.frameId或者window.top.frameName來訪問這個window對象
          FF: 只能這樣window.top.frameName來訪問這個window對象
          另外,在FF和ie中都可以使用window.top.document.getElementById("frameId")來訪問frame標簽
          并且可以通過window.top.document.getElementById("testFrame").src = 'xx.htm'來切換frame的內容
          也都可以通過window.top.frameName.location = 'xx.htm'來切換frame的內容

           

          父結點的問題
          在FF中沒有 parentElement parentElement.children  而用 parentNode parentNode.childNodes
          childNodes的下標的含義在IE和FF中不同,FF使用DOM規范,childNodes中會插入空白文本節點。
          一般可以通過node.getElementsByTagName()來回避這個問題。當html中節點缺失時,IE和FF對parentNode的解釋不同,例如
          <form>
          <table>
            <input/>
          </table>
          </form>

          FF中input.parentNode的值為form, 而IE中input.parentNode的值為空節點
          FF中節點沒有removeNode方法,必須使用如下方法 node.parentNode.removeChild(node)

           

          const 問題
          現有問題:
          在 IE 中不能使用 const 關鍵字。如 const constVar = 32; 在IE中這是語法錯誤。
          解決方法:
          不使用 const ,以 var 代替。

          body 對象
          FF的body在body標簽沒有被瀏覽器完全讀入之前就存在,而IE則必須在body完全被讀入之后才存在

           

          URLencoding
          在js中如果書寫url就直接寫&不要寫&例如var url = 'xx.jsp?objectName=xx&objectEvent=xxx';
          frm.action = url那么很有可能url不會被正常顯示以至于參數沒有正確的傳到服務器
          一般會服務器報錯參數沒有找到
          當然如果是在tpl中例外,因為tpl中符合xml規范,要求&書寫為&
          一般FF無法識別js中的&

           

          nodeName 和 tagName 問題
          現有問題:
          在FF中,所有節點均有 nodeName 值,但 textNode 沒有 tagName 值。在 IE 中,nodeName 的使用好象有問題
          解決方法:
          使用 tagName,但應檢測其是否為空。

           

          元素屬性
          IE下 input.type屬性為只讀,但是FF下可以修改
          document.getElementsByName() 和 document.all[name] 的問題
          在 IE 中,getElementsByName()、document.all[name] 均不能用來取得多個具有相同name的div 元素集合。

           

          兼容firefox的 outerHTML,FF中沒有outerHtml的方法

          if (window.HTMLElement) {
            HTMLElement.prototype.__defineSetter__("outerHTML",function(sHTML) {
                  var r=this.ownerDocument.createRange();
                  r.setStartBefore(this);
                  var df=r.createContextualFragment(sHTML);
                  this.parentNode.replaceChild(df,this);
                  return sHTML;
              });

              HTMLElement.prototype.__defineGetter__("outerHTML",function() {
                  var attr;
                  var attrs=this.attributes;
                  var str="<"+this.tagName.toLowerCase();
                  for (var i=0;i<attrs.length;i++) {
                      attr=attrs[i];
                      if(attr.specified)
                          str+=" "+attr.name+'="'+attr.value+'"';
                  }

                  if(!this.canHaveChildren)
                      return str+">";
                  return str+">"+this.innerHTML+"</"+this.tagName.toLowerCase()+">";
                  });

             HTMLElement.prototype.__defineGetter__("canHaveChildren",function() {
               switch(this.tagName.toLowerCase()) {
                   case "area":
                   case "base":
                   case "basefont":
                   case "col":
                   case "frame":
                   case "hr":
                   case "img":
                   case "br":
                   case "input":
                   case "isindex":
                   case "link":
                   case "meta":
                   case "param":
                   return false;
               }
               return true;
             });
          }


          自定義屬性問題
          說明:IE下,可以使用獲取常規屬性的方法來獲取自定義屬性,也可以使用getAttribute()獲取自定義屬性;FF下,只能使用getAttribute()獲取自定義屬性.
          解決方法:統一通過getAttribute()獲取自定義屬性.

           
          event.srcElement問題
          說明:IE下,even對象有srcElement屬性,但是沒有target屬性;Firefox下,even對象有target屬性,但是沒有srcElement屬性.
          解決方法:使用obj(obj = event.srcElement ? event.srcElement : event.target;)來代替IE下的event.srcElement或者Firefox下的event.target.


          window.location.href問題
          說明:IE或者Firefox2.0.x下,可以使用window.location或window.location.href;Firefox1.5.x下,只能使用window.location.
          解決方法:使用window.location來代替window.location.href.


          模態和非模態窗口問題
          說明:IE下,可以通過showModalDialog和showModelessDialog打開模態和非模態窗口;Firefox下則不能.
          解決方法:直接使用window.open(pageURL,name,parameters)方式打開新窗口
          如果需要將子窗口中的參數傳遞回父窗口,可以在子窗口中使用window.opener來訪問父窗口. 例如:var parWin = window.opener; parWin.document.getElementById("Aqing").value = "Aqing";

           

          事件委托方法
          IE:document.body.onload = inject; //Function inject()在這之前已被實現
          FF:document.body.onload = inject();
          如果要加傳遞參數,可以做個閉包
          (function(arg){

             document.body.onload=function(){inject(arg);};

          })(arg)

          innerText在IE中能正常工作,但是innerText在FireFox中卻不行.
          解決方法:
          if(navigator.appName.indexOf("Explorer") > -1){
              document.getElementById('element').innerText = "my text";
          } else{
              document.getElementById('element').textContent = "my text";
          }


          FF中類似 obj.style.height = imgObj.height 的語句無效
          解決方法:
          obj.style.height = imgObj.height + 'px';


          IE,FF以及其它瀏覽器對于 table 標簽的操作都各不相同,在ie中不允許對table和tr的innerHTML賦值,使用js增加一個tr時,使用appendChile方法也不管用
          解決方法:
          //向table追加一個空行:
          var row = otable.insertRow(-1);
          var cell = document.createElement("td");
          cell.innerHTML = " ";
          cell.className = "XXXX";
          row.appendChild(cell);


          樣式部分
          -----------------------------------------------------------------------------------------------------------
          cursor:hand VS cursor:pointer
          FF不支持hand,但ie支持pointer
          解決方法: 統一使用pointer

          padding 問題
          padding 5px 4px 3px 1px FireFox無法解釋簡寫,
          必須改成 padding-top:5px; padding-right:4px; padding-bottom:3px; padding-left:1px;

          消除ulol等列表的縮進時
          樣式應寫成:list-style:none;margin:0px;padding:0px;
          其中margin屬性對IE有效,padding屬性對FireFox有效

          CSS透明
          IE:filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=60)
          FF:opacity:0.6

          CSS圓角
          IE:不支持圓角
          FF: -moz-border-radius:4px,或者-moz-border-radius-topleft:4px;-moz-border- radius-topright:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius- bottomright:4px;

          CSS雙線凹凸邊框
          IE:border:2px outset;
          FF: -moz-border-top-colors: #d4d0c8 white;-moz-border-left-colors: #d4d0c8 white;-moz-border-right-colors:#404040 #808080;-moz-border-bottom-colors:#404040 #808080;

          posted @ 2009-04-11 18:25 world_eyes 閱讀(220) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 五峰| 虞城县| 鸡东县| 吴忠市| 金阳县| 左云县| 邢台县| 无锡市| 寿宁县| 南昌县| 孟津县| 嘉祥县| 民权县| 镇江市| 溧水县| 长岭县| 高邑县| 山东省| 襄汾县| 商南县| 鹤壁市| 黑河市| 古交市| 晴隆县| 奉化市| 淳化县| 盐城市| 沾益县| 永新县| 托里县| 揭东县| 兴隆县| 阜南县| 九龙城区| 阳谷县| 安宁市| 涞源县| 古田县| 鄢陵县| 赣州市| 新干县|