亚洲综合一区无码精品,亚洲国产精品午夜电影,亚洲Av无码乱码在线播放http://www.tkk7.com/zhuyan/category/20908.htmlJAVA啟發(fā)者zh-cnFri, 27 Jul 2007 15:30:51 GMTFri, 27 Jul 2007 15:30:51 GMT60jQuery中文入門指南http://www.tkk7.com/zhuyan/articles/132685.html朱巖朱巖Fri, 27 Jul 2007 01:25:00 GMThttp://www.tkk7.com/zhuyan/articles/132685.htmlhttp://www.tkk7.com/zhuyan/comments/132685.htmlhttp://www.tkk7.com/zhuyan/articles/132685.html#Feedback0http://www.tkk7.com/zhuyan/comments/commentRss/132685.htmlhttp://www.tkk7.com/zhuyan/services/trackbacks/132685.htmljQuery中文入門指南,翻譯加實例,jQuery的起點教程

中文版譯者:Keel

此文以實例為基礎一步步說明了jQuery的工作方式。現以中文翻譯(添加我的補充說明)如下。如有相關意見或建議請麻煩到我的 BLOG 寫個回復或者 EMAIL 告知。

英文原版:http://jquery.bassistance.de/jquery-getting-started.html ,感謝原文作者 Jörn Zaefferer

本文發(fā)布已征求原作者同意。

另外我認為在學習過程中,有兩個API文檔你要打開隨時查看:

以下部分為原文翻譯:


jQuery入門指南教程

這個指南是一個對jQuery庫的說明,要求讀者了解HTML(DOM)和CSS的一些常識。它包括了一個簡單的Hello World的例子,選擇器和事件基礎,AJAX、FX的用法,以及如何制作jQuery的插件。 這個指南包括了很多代碼,你可以copy它們,并試著修改它們,看看產生的效果。

內容提要

  1. 安裝
  2. Hello jQuery
  3. Find me:使用選擇器和事件
  4. Rate me:使用AJAX
  5. Animate me(讓我生動起來):使用FX
  6. Sort me(將我有序化):使用tablesorter插件(表格排序)
  7. Plug me:制作您自己的插件
  8. Next steps(下一步)

安裝

一開始,我們需要一個jQuery的庫,最新的下載可以到這里找到。這個指南提供一個基本包含實例的包供下載.

下載:jQuery Starterkit

(譯者Keel注:一定要下載這個包,光看文章不實踐肯定是不行的。)

下載后解壓縮,然后用你最喜歡的文本編輯器打開starterkit.html和custom.js這兩個文件。(譯者Keel注:這兩個就是例子文件,所有的例子都用這兩個例子作出,custom.js寫jQuery代碼,starterkit.html觀察效果.建議用editPlus打開)

現在,我們就已經做好了一切準備來進行這個著名的"Hello world"例子.

本章的相關鏈接:

Hello jQuery

在做所有事情之前,我們要讓jQuery讀取和處理文檔的DOM,必須盡可能快地在DOM載入后開始執(zhí)行事件,所以,我們用一個ready事件作為處理HTML文檔的開始.看看我們打開的custom.js這個文件,里面已經準備好了:

$(document).ready(function() {
// do stuff when DOM is ready
});

放一個簡單的alert事件在需要等DOM完成載入,所以我們把任務稍稍變復雜一點:在點擊任何一個鏈接時顯示一個alert.

$(document).ready(function() {
$("a").click(function() {
alert("Hello world!");
});
});

這樣在你點擊頁面的一個鏈接時都會觸發(fā)這個"Hello world"的提示。

(譯者Keel注:請照此代碼修改custom.js并保存,然后用瀏覽器打開starterkit.html觀察效果。)

讓我們看一下這些修改是什么含義。$("a") 是一個jQuery選擇器(selector),在這里,它選擇所有的a標簽(譯者Keel注:即<a></a>),$號是 jQuery “類”(jQuery "class")的一個別稱,因此$()構造了一個新的jQuery 對象(jQuery object)。函數 click() 是這個jQuery對象的一個方法,它綁定了一個單擊事件到所有選中的標簽(這里是所有的a標簽),并在事件觸發(fā)時執(zhí)行了它所提供的alert方法.

這里有一個擬行相似功能的代碼:

<a href="#" onclick="alert('Hello world')">Link</a>

不同之處很明顯,用jQuery不需要在每個a標簽上寫onclick事件,所以我們擁有了一個整潔的結構文檔(HTML)和一個行為文檔(JS),達到了將結構與行為分開的目的,就像我們使用CSS追求的一樣.

下面我們會更多地了解到選擇器與事件.

本章的相關鏈接:

Find me:使用選擇器和事件

jQuery提供兩種方式來選擇html的elements,第一種是用CSS和Xpath選擇器聯合起來形成一個字符串來傳送到jQuery的構造器(如:$("div > ul a"));第二種是用jQuery對象的幾個methods(方法)。這兩種方式還可以聯合起來混合使用。

為了測試一下這些選擇器,我們來試著在我們starterkit.html中選擇并修改第一個ordered list.

一開始,我們需要選擇這個list本身,這個list有一個ID叫“orderedlist”,通常的javascript寫法是document.getElementById("orderedlist").在jQuery中,我們這樣做:

$(document).ready(function() {
$("#orderedlist").addClass("red");
});

這里將starterkit中的一個CSS樣式red附加到了orderedlist上(譯者Keel注:參考測試包中的css目錄下的core.css,其中定義了red樣式)。因此,在你刷新了starterkit.html后,你將會看到第一個有序列表(ordered list )背景色變成了紅色,而第二個有序列表沒有變化.

現在,讓我們添加一些新的樣式到list的子節(jié)點.

$(document).ready(function() {
$("#orderedlist > li").addClass("blue");
});

這樣,所有orderedlist中的li都附加了樣式"blue"。

現在我們再做個復雜一點的,當把鼠標放在li對象上面和移開時進行樣式切換,但只在list的最后一個element上生效。

$(document).ready(function() {
$("#orderedlist li:last").hover(function() {
$(this).addClass("green");
}, function() {
$(this).removeClass("green");
});
});

還有大量的類似的CSSXPath例子,更多的例子和列表可以在這里找到。(譯者Keel注:入門看此文,修行在個人,要想在入門之后懂更多,所以這段話的幾個鏈接遲早是要必看的!不會又要翻譯吧...^_^!)

每一個onXXX事件都有效,如onclick,onchange,onsubmit等,都有jQuery等價表示方法(譯者Keel注:jQuery不喜歡onXXX,所以都改成了XXX,去掉了on)其他的一些事件,如ready和hover,也提供了相應的方法。

你可以在Visual jQuery找到全部的事件列表,在Events欄目下.

用這些選擇器和事件你已經可以做很多的事情了,但這里有一個更強的好東東!

$(document).ready(function() {
$("#orderedlist").find("li").each(function(i) {
$(this).html( $(this).html() + " BAM! " + i );
});
});

find() 讓你在已經選擇的element中作條件查找,因此 $("#orderedlist).find("li") 就像 $("#orderedlist li"). each()一樣迭代了所有的li,并可以在此基礎上作更多的處理。 大部分的方法,如addClass(), 都可以用它們自己的 each() 。在這個例子中, html()用來獲取每個li的html文本, 追加一些文字,并將之設置為li的html文本。(譯者Keel注:從這個例子可以看到.html()方法是獲取對象的html代碼,而.html('xxx')是設置'xxx'為對象的html代碼)

另一個經常碰到的任務是在沒有被jQuery覆蓋的DOM元素上call一些方法,想像一個在你用AJAX方式成功提交后的reset:

$(document).ready(function() {
// use this to reset a single form
$("#reset").click(function() {
$("#form")[0].reset();
});
});

(譯者Keel注:這里作者將form的id也寫成了form,源文件有<form id="form">,這是非常不好的寫法,你可以將這個ID改成form1或者testForm,然后用$("#form1")或者$("#testForm")來表示它,再進行測試。)

這個代碼選擇了所有ID為"form"的元素,并在其第一個上call了一個reset()。如果你有一個以上的form,你可以這樣做:

$(document).ready(function() {
// use this to reset several forms at once
$("#reset").click(function() {
$("form").each(function() {
this.reset();
});
});
});

(譯者Keel注:請注意一定要親自將這些代碼寫在custom.js中并在starterkit.html上測試效果才能有所體會!必要時要觀察starterkit.html的html代碼)

這樣你在點擊Reset鏈接后,就選擇了文檔中所有的form元素,并對它們都執(zhí)行了一次reset()。

還有一個你可能要面對的問題是不希望某些特定的元素被選擇。jQuery 提供了filter() 和not() 方法來解決這個問題。 filter()以過濾表達式來減少不符合的被選擇項, not()則用來取消所有符合過濾表達式的被選擇項. 考慮一個無序的list,你想要選擇所有的沒有ul子元素的li元素。

$(document).ready(function() {
$("li").not("[ul]").css("border", "1px solid black");
});

這個代碼選擇了所有的li元素,然后去除了沒有ul子元素的li元素。刷新瀏覽器后,所有的li元素都有了一個邊框,只有ul子元素的那個li元素例外。

(譯者Keel注:請注意體會方便之極的css()方法,并再次提醒請務必實際測試觀察效果,比方說換個CSS樣式呢?再加一個CSS樣式呢?像這樣:$("li").not("[ul]").css("border", "1px solid black").css("color","red");)

上面代碼中的[expression] 語法是從XPath而來,可以在子元素和屬性(elements and attributes)上用作過濾器,比如你可能想選擇所有的帶有name屬性的鏈接:

$(document).ready(function() {
$("a[@name]").background("#eee");
});

這個代碼給所有帶有name屬性的鏈接加了一個背景色。(譯者Keel注:這個顏色太不明顯了,建議寫成$("a[@name]").background("red");)

更常見的情況是以name來選擇鏈接,你可能需要選擇一個有特點href屬性的鏈接,這在不同的瀏覽器下對href的理解可能會不一致,所以我們的部分匹配("*=")的方式來代替完全匹配("="):

$(document).ready(function() {
$("a[@href*=/content/gallery]").click(function() {
// do something with all links that point somewhere to /content/gallery
});
});

到現在為止,選擇器都用來選擇子元素或者是過濾元素。另外還有一種情況是選擇上一個或者下一個元素,比如一個FAQ的頁面,答案首先會隱藏,當問題點擊時,答案顯示出來,jQuery代碼如下:

$(document).ready(function() {
$('#faq').find('dd').hide().end().find('dt').click(function() {
var answer = $(this).next();
if (answer.is(':visible')) {
answer.slideUp();
} else {
answer.slideDown();
}
});
});

這里我們用了一些鏈式表達法來減少代碼量,而且看上去更直觀更容易理解。像'#faq' 只選擇了一次,利用end()方法,第一次find()方法會結束(undone),所以我們可以接著在后面繼續(xù)find('dt'),而不需要再寫$('#faq').find('dt')。

在點擊事件中的,我們用 $(this).next() 來找到dt下面緊接的一個dd元素,這讓我們可以快速地選擇在被點擊問題下面的答案。

(譯者Keel注:這個例子真是太酷了,FAQ中的答案可以收縮!從利用next()的思路到實現這些效果都有很多地方需要我們消化,注意 if (answer.is(':visible'))用法,注意answer.slideUp();不懂的地方趕緊查我在最開始提到的兩個必看API文檔)

除了選擇同級別的元素外,你也可以選擇父級的元素。可能你想在用戶鼠標移到文章某段的某個鏈接時,它的父級元素--也就是文章的這一段突出顯示,試試這個:

$(document).ready(function() {
$("a").hover(function() {
$(this).parents("p").addClass("highlight");
}, function() {
$(this).parents("p").removeClass("highlight");
});
});

測試效果可以看到,移到文章某段的鏈接時,它所在的段全用上highlight樣式,移走之后又恢復原樣。

(譯者Keel注:highlight是core.css中定義的樣式,你也可以改變它,注意這里有第二個function()這是hover方法的特點,請在API文檔中查閱hover,上面也有例子說明)

在我們繼續(xù)之前我們先來看看這一步: jQuery會讓代碼變得更短從而更容易理解和維護,下面是$(document).ready(callback)的縮寫法:

$(function() {
// code to execute when the DOM is ready
});

應用到我們的Hello world例子中,可以這樣:

$(function() {
$("a").click(function() {
alert("Hello world!");
});
});

現在,我們手上有了這些基礎的知識,我們可以更進一步的探索其它方面的東西,就從AJAX開始!

本章的相關鏈接:

Rate me:使用AJAX

在這一部分我們寫了一個小小的AJAX應用,它能夠rate一些東西(譯Keel注:就是對某些東西投票),就像在youtube.com上面看到的一樣。

首先我們需要一些服務器端代碼,這個例子中用到了一個PHP文件,讀取rating參數然后返回rating總數和平均數。看一下rate.php代碼.

雖然這些例子也可以不使用AJAX來實現,但顯示我們不會那么做,我們用jQuery生成一個DIV容器,ID是"rating".

$(document).ready(function() {
// generate markup
var ratingMarkup = ["Please rate: "];
for(var i=1; i <= 5; i++) {
ratingMarkup[ratingMarkup.length] = "<a href='#'>" + i + "</a> ";
}
// add markup to container and applier click handlers to anchors
$("#rating").append( ratingMarkup.join('') ).find("a").click(function(e) {
e.preventDefault();
// send requests
$.post("rate.php", {rating: $(this).html()}, function(xml) {
// format result
var result = [
"Thanks for rating, current average: ",
$("average", xml).text(),
", number of votes: ",
$("count", xml).text()
];
// output result
$("#rating").html(result.join(''));
} );
});
});

這段代碼生成了5個鏈接,并將它們追加到id為"rating"容器中,當其中一個鏈接被點擊時,該鏈接標明的分數就會以rating參數形式發(fā)送到rate.php,然后,結果將以XML形式會從服務器端傳回來,添加到容器中,替代這些鏈接。

如果你沒有一個安裝過PHP的webserver,你可以看看這個在線的例子.

不使用javascript實現的例子可以訪問 softonic.de 點擊 "Kurz bewerten!"

更多的AJAX方法可以從這里 找到,或者看看API文檔 下面的AJAX filed under AJAX.

(譯者Keel注:這個在線實例從國內訪問還是比較慢的,點擊后要等一會兒才能看到結果,可以考慮對它進行修改,比如加上loading,投票后加上再投票的返回鏈接等。此外,這個例子中還是有很多需要進一步消化的地方,看不懂的地方請參考API文檔。)

一個在使用AJAX載入內容時經常發(fā)生的問題是:當載入一個事件句柄到一個HTML文檔時,還需要在載入內容上應用這些事件,你不得不在內容加載完成后應用這些事件句柄,為了防止代碼重復執(zhí)行,你可能用到如下一個function:

// lets use the shortcut
$(function() {
var addClickHandlers = function() {
$("a.clickMeToLoadContent").click(function() {
$("#target").load(this.href, addClickHandlers);
});
};
addClickHandlers();
});

現在,addClickHandlers只在DOM載入完成后執(zhí)行一次,這是在用戶每次點擊具有clickMeToLoadContent 這個樣式的鏈接并且內容加載完成后.

請注意addClickHandlers函數是作為一個局部變量定義的,而不是全局變量(如:function addClickHandlers() {...}),這樣做是為了防止與其他的全局變量或者函數相沖突.

另一個常見的問題是關于回調(callback)的參數。你可以通過一個額外的參數指定回調的方法,簡單的辦法是將這個回調方法包含在一個其它的function中:

// get some data
var foobar = ...;
// specify handler, it needs data as a paramter
var handler = function(data) {
...
};
// add click handler and pass foobar!
$('a').click( function(event) { handler(foobar); } );
// if you need the context of the original handler, use apply:
$('a').click( function(event) { handler.apply(this, [foobar]); } );

用到簡單的AJAX后,我們可以認為已經非常之“web2.0”了,但是到現在為止,我們還缺少一些酷炫的效果。下一節(jié)將會談到這些效果.

本章的相關鏈接:

Animate me(讓我生動起來):使用FX

一些動態(tài)的效果可以使用 show()hide()來表現:

$(document).ready(function() {
$("a").toggle(function() {
$(".stuff").hide('slow');
}, function() {
$(".stuff").show('fast');
});
});

你可以與 animate()聯合起來創(chuàng)建一些效果,如一個帶漸顯的滑動效果:

$(document).ready(function() {
$("a").toggle(function() {
$(".stuff").animate({
height: 'hide',
opacity: 'hide'
}, 'slow');
}, function() {
$(".stuff").animate({
height: 'show',
opacity: 'show'
}, 'slow');
});
});

很多不錯的效果可以訪問interface plugin collection. 這個站點提供了很多demos和文檔

這些效果插件是位于jQuery插件列表的前面的,當然也有很多其他的插件,比如我們下一章講到的表格排序插件。

本章的相關鏈接:

Sort me(將我有序化):使用tablesorter插件(表格排序)

這個表格排序插件能讓我們在客戶端按某一列進行排序,引入jQuery和這個插件的js文件,然后告訴插件你想要哪個表格擁有排序功能。

要測試這個例子,先在starterkit.html中加上像下面這一行的代碼:

<script src="lib/jquery.tablesorter.js" type="text/javascript"></script>

然后可以這樣調用不著:

$(document).ready(function() {
$("#large").tableSorter();
});

現在點擊表格的第一行head區(qū)域,你可以看到排序的效果,再次點擊會按倒過來的順序進行排列。

這個表格還可以加一些突出顯示的效果,我們可以做這樣一個隔行背景色(斑馬線)效果:

$(document).ready(function() {
$("#large").tableSorter({
stripingRowClass: ['odd','even'],	// Class names for striping supplyed as a array.
stripRowsOnStartUp: true		// Strip rows on tableSorter init.
});
});

關于這個插件的更多例子和文檔可以在 tablesorter首頁找到.

幾乎所有的特件都是這樣用的:先include插件的js文件,然后在某些元素上使用插件定義的方法,當然也有一些參數選項是可以配置的

經常更新的插件列表可以從jQuery官方站 on the jQuery site找到.

當你更經常地使用jQuery時,你會發(fā)現將你自己的代碼打包成插件是很有用處的,它能方便地讓你的公司或者其他人進行重用.下一章我們將談到如何構建一個自己的插件.

本章的相關鏈接:

Plug me:制作自己的插件

寫一個自己的jQuery插件是非常容易的,如果你按照下面的原則來做,可以讓其他人也容易地結合使用你的插件.

  1. 為你的插件取一個名字,在這個例子里面我們叫它"foobar".
  2. 創(chuàng)建一個像這樣的文件:jquery.[yourpluginname].js,比如我們創(chuàng)建一個jquery.foobar.js
  3. 創(chuàng)建一個或更多的插件方法,使用繼承jQuery對象的方式,如:
    jQuery.fn.foobar = function() {
        // do something
        };
  4. 可選的:創(chuàng)建一個用于幫助說明的函數,如:
    jQuery.fooBar = {
        height: 5,
        calculateBar = function() { ... },
        checkDependencies = function() { ... }
        };

    你現在可以在你的插件中使用這些幫助函數了:

    jQuery.fn.foobar = function() {
        // do something
        jQuery.foobar.checkDependencies(value);
        // do something else
        };
  5. 可選的l:創(chuàng)建一個默認的初始參數配置,這些配置也可以由用戶自行設定,如:
    jQuery.fn.foobar = function(options) {
        var settings = {
        value: 5,
        name: "pete",
        bar: 655
        };
        if(options) {
        jQuery.extend(settings, options);
        }
        };

    現在可以無需做任何配置地使用插件了,默認的參數在此時生效:

    $("...").foobar();

    或者加入這些參數定義:

    $("...").foobar({
        value: 123,
        bar: 9
        });

如果你release你的插件, 你還應該提供一些例子和文檔,大部分的插件都具備這些良好的參考文檔.

現在你應該有了寫一個插件的基礎,讓我們試著用這些知識寫一個自己的插件.

很多人試著控制所有的radio或者checkbox是否被選中,比如:

$("input[@type='checkbox']").each(function() {
this.checked = true;
// or, to uncheck
this.checked = false;
// or, to toggle
this.checked = !this.checked;
});

無論何時候,當你的代碼出現each時,你應該重寫上面的代碼來構造一個插件,很直接地:

$.fn.check = function() {
return this.each(function() {
this.checked = true;
});
};

這個插件現在可以這樣用:

$("input[@type='checkbox']").check();

現在你應該還可以寫出uncheck()和toggleCheck()了.但是先停一下,讓我們的插件接收一些參數.

$.fn.check = function(mode) {
var mode = mode || 'on'; // if mode is undefined, use 'on' as default
return this.each(function() {
switch(mode) {
case 'on':
this.checked = true;
break;
case 'off':
this.checked = false;
break;
case 'toggle':
this.checked = !this.checked;
break;
}
});
};

這里我們設置了默認的參數,所以將"on"參數省略也是可以的,當然也可以加上"on","off", 或 "toggle",如:

$("input[@type='checkbox']").check();
$("input[@type='checkbox']").check('on');
$("input[@type='checkbox']").check('off');
$("input[@type='checkbox']").check('toggle');

如果有多于一個的參數設置會稍稍有點復雜,在使用時如果只想設置第二個參數,則要在第一個參數位置寫入null.

從上一章的tablesorter插件用法我們可以看到,既可以省略所有參數來使用或者通過一個 key/value 對來重新設置每個參數.

作為一個練習,你可以試著將 第四章 的功能重寫為一個插件.這個插件的骨架應該是像這樣的:

$.fn.rateMe = function(options) {
var container = this; // instead of selecting a static container with $("#rating"), we now use the jQuery context
var settings = {
url: "rate.php"
// put more defaults here
// remember to put a comma (",") after each pair, but not after the last one!
};
if(options) { // check if options are present before extending the settings
$.extend(settings, options);
}
// ...
// rest of the code
// ...
return this; // if possible, return "this" to not break the chain
});

Next steps(下一步)

如果你想做更好的javascript開發(fā),建議你使用一個叫 FireBug的firefox插件. 它提供了斷點調試(比alert強多了)、觀察DOM變化等很多漂亮的功能

如果你還有未解決的問題,或者新的想法與建議,你可以使用jQuery的郵件列表 jQuery mailing list.

關于這個指南的任何事情,你可以寫mail給作者或者發(fā)表評論在他的日志:blog.

關于這個指南的翻譯任何事情,你可以寫mail給我或者發(fā)表評論在我的日志:blog.

還有什么...

大大感謝John Resig創(chuàng)造了這么好的library! 感謝jQuery community 為John提供了如此多的咖啡和其他的一切!

© 2006, Jörn Zaefferer - last update: 2006-09-12

中文版翻譯:Keel - 最后更新: 2006-12-13



朱巖 2007-07-27 09:25 發(fā)表評論
]]>
showModelessDialog()使用詳解http://www.tkk7.com/zhuyan/articles/125819.html朱巖朱巖Fri, 22 Jun 2007 06:04:00 GMThttp://www.tkk7.com/zhuyan/articles/125819.htmlhttp://www.tkk7.com/zhuyan/comments/125819.htmlhttp://www.tkk7.com/zhuyan/articles/125819.html#Feedback0http://www.tkk7.com/zhuyan/comments/commentRss/125819.htmlhttp://www.tkk7.com/zhuyan/services/trackbacks/125819.html    showModalDialog() (IE 4+ 支持)
   showModelessDialog() (IE 5+ 支持)

    window.showModalDialog()方法用來創(chuàng)建一個顯示HTML內容的模態(tài)對話框,由于是對話框,因此它并沒有一般用window.open()打開的窗口的所有屬性。

    window.showModelessDialog()方法用來創(chuàng)建一個顯示HTML內容的非模態(tài)對話框。

    當我們用showModelessDialog()打開窗口時,不必用window.close()去關閉它,當以非模態(tài)方式[IE5]打開時, 打開對話框的窗口仍可以進行其他的操作,即對話框不總是最上面的焦點,當打開它的窗口URL改變時,它自動關閉。而模態(tài)[IE4]方式的對話框始終有焦點(焦點不可移走,直到它關閉)。模態(tài)對話框和打開它的窗口相聯系,因此我們打開另外的窗口時,他們的鏈接關系依然保存,并且隱藏在活動窗口的下面。

使用方法如下:
    vReturnValue = window.showModalDialog(sURL [, vArguments] [, sFeatures])
    vReturnValue = window.showModelessDialog(sURL [, vArguments] [, sFeatures])

參數說明:
    sURL
   必選參數,類型:字符串。用來指定對話框要顯示的文檔的URL。
    vArguments
   可選參數,類型:變體。用來向對話框傳遞參數。傳遞的參數類型不限,包括數組等。對話框通過window.dialogArguments來取得傳遞進來的參數。
    sFeatures
   可選參數,類型:字符串。用來描述對話框的外觀等信息,可以使用以下的一個或幾個,用分號“;”隔開。
    dialogHeight 對話框高度,不小于100px,IE4中dialogHeight 和 dialogWidth 默認的單位是em,而IE5中是px,為方便其見,在定義modal方式的對話框時,用px做單位。
   dialogWidth: 對話框寬度。
   dialogLeft: 距離桌面左的距離。
   dialogTop: 離桌面上的距離。
   center: {yes | no | 1 | 0 }:窗口是否居中,默認yes,但仍可以指定高度和寬度。
   help: {yes | no | 1 | 0 }:是否顯示幫助按鈕,默認yes。
   resizable: {yes | no | 1 | 0 } [IE5+]:是否可被改變大小。默認no。
   status: {yes | no | 1 | 0 } [IE5+]:是否顯示狀態(tài)欄。默認為yes[ Modeless]或no[Modal]。
    scroll:{ yes | no | 1 | 0 | on | off }:指明對話框是否顯示滾動條。默認為yes。

還有幾個屬性是用在HTA中的,在一般的網頁中一般不使用。
    dialogHide:{ yes | no | 1 | 0 | on | off }:在打印或者打印預覽時對話框是否隱藏。默認為no。
    edge:{ sunken | raised }:指明對話框的邊框樣式。默認為raised。
    unadorned:{ yes | no | 1 | 0 | on | off }:默認為no。

傳入參數:
    要想對話框傳遞參數,是通過vArguments來進行傳遞的。類型不限制,對于字符串類型,最大為4096個字符。也可以傳遞對象,例如:

test1.htm
<script>
  var mxh1 = new Array("mxh","net_lover","孟子E章")
  var mxh2 = window.open("about:blank","window_mxh")
  // 向對話框傳遞數組
  window.showModalDialog("test2.htm",mxh1)
  // 向對話框傳遞window對象
  window.showModalDialog("test3.htm",mxh2)
</script>
test2.htm
<script>
  var a = window.dialogArguments
  alert("您傳遞的參數為:" + a)
</script>
 
test3.htm
<script>
  var a = window.dialogArguments
  alert("您傳遞的參數為window對象,名稱:" + a.name)
 </script>

 可以通過window.returnValue向打開對話框的窗口返回信息,當然也可以是對象。例如:

test4.htm
<script>
  var a = window.showModalDialog("test5.htm")
  for(i=0;i<a.length;i++) alert(a[i])
</script>
test5.htm
 <script>
 function sendTo()
 {
  var a=new Array("a","b")
  window.returnValue = a
  window.close()
 }
 </script>
 <body>
 <form>
  <input value="返回" type=button onclick="sendTo()">
 </form>

常見問題:
1,如何在模態(tài)對話框中進行提交而不新開窗口?
   如果你 的 瀏覽器是IE5.5+,可以在對話框中使用帶name屬性的iframe,提交時可以制定target為該iframe的name。對于IE4+,你可以用高度為0的frame來作。例如:

 test6.htm
<script>
  window.showModalDialog("test7.htm")
 </script>
 test7.htm
if(window.location.search) alert(window.location.search)
 <frameset rows="0,*">
  <frame src="about:blank">
  <frame src="test8.htm">
 </frameset>
 test8.htm
<form target="_self" method="get">
 <input name=txt value="test">
 <input type=submit>
 </form>
 <script>
 if(window.location.search) alert(window.location.search)
 </script>
 

2,可以通過http://servername/virtualdirname/test.htm?name=mxh方式直接向對話框傳遞參數嗎?
 答案是不能。但在frame里是可以的。


用window.showModalDialog 或者window.showModelessDialog打開一個模式窗口后,和父窗口的一些交互問題。
要進行交互操作的前提,在調用showModalDialog或者showModelessDialog方法的時候,第二個參數傳window,如:

  1. window.showModelessDialog('filename.htm',window,'dialogWidth=200px;dialogHeight=250px;')


接下來,就是取得父窗口的一些數據和方法,這是經常會用的,父窗口取子窗口的參數一般通過returnValue就可以搞定了~

  1. //取得父窗口的JS變量 var
    window.dialogArguments.var;
    //獲得父窗口的對象和屬性
    window.dialogArguments.form1.name.value ;
    //調用父窗口的方法 fun
    window.dialogArguments.fun() ;


朱巖 2007-06-22 14:04 發(fā)表評論
]]>
Javascript里延遲函數的復習 http://www.tkk7.com/zhuyan/articles/125737.html朱巖朱巖Fri, 22 Jun 2007 01:49:00 GMThttp://www.tkk7.com/zhuyan/articles/125737.htmlhttp://www.tkk7.com/zhuyan/comments/125737.htmlhttp://www.tkk7.com/zhuyan/articles/125737.html#Feedback0http://www.tkk7.com/zhuyan/comments/commentRss/125737.htmlhttp://www.tkk7.com/zhuyan/services/trackbacks/125737.html
2.handle = setTimeout(statement, microime),的作用是設定每mircotime毫秒執(zhí)行一次statement,并把返回一個句柄給handle,以便可以用clearTimeout(handle)來結束計時。 //Javascript Wait Function Demo

Demo:
 1<h3>//Javascript Wait Function Demo</h3>
 2<hr>
 3<input type="button" value="請點擊,2秒后打開一個警告" id="redhacker">
 4<input type="button" value="停止" id="dgq">
 5<script>
 6//code by douguoqiang1980@163.com
 7var handle;
 8document.getElementById("redhacker").onclick = function(){handle = setTimeout("alert('你好,紅色黑客!')",2000)};
 9document.getElementById("dgq").onclick = function(){clearTimeout(handle);};
10
</script>

說明:點擊第一個按鈕,將兩秒后彈出一個警告框。在點擊第一個按鈕后,還不到兩秒時,點“停止”按鈕,則取消等待,并警告框也不會彈出。

3.setInterval()和clearInterval()兩個函數,和以上兩個函數大同小異,區(qū)別在于前者用來定時要在將來某個時候執(zhí)行一次的函數或者表達式;而后者多用于要反復調用的函數和語句,他們之間只間隔一個固定的時間,這個時間過程中不是一個等待的過程,因為當延遲其作用時,其它的處理過程并不掛起!所以用setInterval()來制作網頁動畫要更合理一些!他們的語法格式是:

iTimerID = window.setInterval(vCode, iMilliSeconds [, sLanguage])

Demo1:

 1<h3>//Javascript Wait Function Demo</h3>
 2<hr>
 3<input type="button" value="10" id="redhacker" style="width:50">
 4<input type="button" value="停止" id="dgq" style="width:50">
 5<script>
 6//code by douguoqiang1980@163.com
 7//直接調用函數的示例
 8var alertFun = function(){
 9    var n = document.getElementById("redhacker").value;
10    document.getElementById("redhacker").value = n-1;
11  }

12handle = setInterval(alertFun,1000);
13document.getElementById("dgq").onclick = function(){clearInterval(handle);alert("倒記時已停止")}
14
</script>

Domo2:

 1<h3>//Javascript Wait Function Demo</h3>
 2<hr>
 3<input type="button" value="10" id="redhacker" style="width:50">
 4<input type="button" value="停止" id="dgq" style="width:50">
 5<script>
 6//code by douguoqiang1980@163.com
 7//調用對象自定義方法,并復習如何給一個內置對象添加一個方法
 8var alertFun = function(){
 9    var n = document.getElementById("redhacker").value;
10    document.getElementById("redhacker").value = n-1;
11  }

12Object.prototype.aMethod = alertFun;
13var o = new Object();
14var handle = setInterval(o.aMethod,1000);
15document.getElementById("dgq").onclick = function(){clearInterval(handle);alert("倒記時已停止")}
16
</script>

Demo3:

 1<h3>//Javascript Wait Function Demo</h3>
 2<hr>
 3<input type="button" value="10" id="redhacker" style="width:50">
 4<input type="button" value="停止" id="dgq" style="width:50">
 5<script>
 6//code by douguoqiang1980@163.com
 7//自定義對象,并為對象添加一個自定義方法,調用改方法
 8var alertFun = function(){
 9    var n = document.getElementById("redhacker").value;
10    document.getElementById("redhacker").value = n-1;
11  }

12function myObject(){
13}

14myObject.prototype.aMethod = alertFun;
15var o = new myObject();
16var handle = setInterval(o.aMethod,1000);
17document.getElementById("dgq").onclick = function(){clearInterval(handle);alert("倒記時已停止")}
18
</script>

補充:這四個函數確切的說,是window對象的方法,window 是DOM中的一個頂級對象。只是如果不寫對象名,就默認是window,就像alert()等用于window.alert()一樣!




朱巖 2007-06-22 09:49 發(fā)表評論
]]>
automation服務器不能創(chuàng)建對象”的問題的解決方案大全 http://www.tkk7.com/zhuyan/articles/125524.html朱巖朱巖Thu, 21 Jun 2007 04:35:00 GMThttp://www.tkk7.com/zhuyan/articles/125524.htmlhttp://www.tkk7.com/zhuyan/comments/125524.htmlhttp://www.tkk7.com/zhuyan/articles/125524.html#Feedback0http://www.tkk7.com/zhuyan/comments/commentRss/125524.htmlhttp://www.tkk7.com/zhuyan/services/trackbacks/125524.html
想、千嘗萬試,終于將其搞定,現將相關方案與大家共享。
1、如果是Scripting.FileSystemObject (FSO 文本文件讀寫)被關閉了,開啟FSO功能即可,在“運行”中執(zhí)行regsvr32 scrrun.dll即可

2、安全模式設置成“中”,如果javascript腳本中報這個錯誤,還應將IE的安全設置“不允許運行未標記為安全的activeX控件”啟用即可。

注意如果您將相應的網站設成“受信任的站點”,必須對“受信任的站點”進行相應的IE安全設置,此時如果對“Internet”IE設置將是徒勞

的。

3、有些腳本需要微軟的 MSXML 控件才能進入。當使用 IE 5 以上版本的缺省安全模式時,會提示是否接受 MSXML 控件,如果接受,MSXML 將

自動安裝到您的機器上(得等上幾分鐘)。如果自動安裝不成功,可以自行下載和安裝 MSXML 3.0 SP7。有時是由于msxml 3服務被關掉了,使用

regsvr32 msxml3.dll即可

4、用上面方法基本上能決問題。如果是在安裝某個軟件后出現這種問題,可嘗度卸載該軟件或重裝一下!


朱巖 2007-06-21 12:35 發(fā)表評論
]]>
深入認識JavaScript中的函數http://www.tkk7.com/zhuyan/articles/119901.html朱巖朱巖Fri, 25 May 2007 02:04:00 GMThttp://www.tkk7.com/zhuyan/articles/119901.htmlhttp://www.tkk7.com/zhuyan/comments/119901.htmlhttp://www.tkk7.com/zhuyan/articles/119901.html#Feedback0http://www.tkk7.com/zhuyan/comments/commentRss/119901.htmlhttp://www.tkk7.com/zhuyan/services/trackbacks/119901.html一、概述
函數是進行模塊化程序設計的基礎,編寫復雜的Ajax應用程序,必須對函數有更深入的了解。JavaScript中的函數不同于其他的語言,每個函數都是作為一個對象被維護和運行的。通過函數對象的性質,可以很方便的將一個函數賦值給一個變量或者將函數作為參數傳遞。在繼續(xù)講述之前,先看一下函數的使用語法:
function func1(…){…}
var func2=function(…){…};
var func3=function func4(…){…};
var func5=new Function();
這些都是聲明函數的正確語法。它們和其他語言中常見的函數或之前介紹的函數定義方式有著很大的區(qū)別。那么在JavaScript中為什么能這么寫?它所遵循的語法是什么呢?下面將介紹這些內容。

二、  認識函數對象(Function Object)
可以用function關鍵字定義一個函數,并為每個函數指定一個函數名,通過函數名來進行調用。在JavaScript解釋執(zhí)行時,函數都是被維護為一個對象,這就是要介紹的函數對象(Function Object)。
函數對象與其他用戶所定義的對象有著本質的區(qū)別,這一類對象被稱之為內部對象,例如日期對象(Date)、數組對象(Array)、字符串對象(String)都屬于內部對象。這些內置對象的構造器是由JavaScript本身所定義的:通過執(zhí)行new Array()這樣的語句返回一個對象,JavaScript內部有一套機制來初始化返回的對象,而不是由用戶來指定對象的構造方式。
在JavaScript 中,函數對象對應的類型是Function,正如數組對象對應的類型是Array,日期對象對應的類型是Date一樣,可以通過new Function()來創(chuàng)建一個函數對象,也可以通過function關鍵字來創(chuàng)建一個對象。為了便于理解,我們比較函數對象的創(chuàng)建和數組對象的創(chuàng)建。先看數組對象:下面兩行代碼都是創(chuàng)建一個數組對象myArray:
var myArray=[];
//等價于
var myArray=new Array();
同樣,下面的兩段代碼也都是創(chuàng)建一個函數myFunction:
function myFunction(a,b){
      return a+b;
}
//等價于
var myFunction=new Function("a","b","return a+b");
通過和構造數組對象語句的比較,可以清楚的看到函數對象本質,前面介紹的函數聲明是上述代碼的第一種方式,而在解釋器內部,當遇到這種語法時,就會自動構造一個Function對象,將函數作為一個內部的對象來存儲和運行。從這里也可以看到,一個函數對象名稱(函數變量)和一個普通變量名稱具有同樣的規(guī)范,都可以通過變量名來引用這個變量,但是函數變量名后面可以跟上括號和參數列表來進行函數調用。
用new Function()的形式來創(chuàng)建一個函數不常見,因為一個函數體通常會有多條語句,如果將它們以一個字符串的形式作為參數傳遞,代碼的可讀性差。下面介紹一下其使用語法:
var funcName=new Function(p1,p2,...,pn,body);
參數的類型都是字符串,p1到pn表示所創(chuàng)建函數的參數名稱列表,body表示所創(chuàng)建函數的函數體語句,funcName就是所創(chuàng)建函數的名稱。可以不指定任何參數創(chuàng)建一個空函數,不指定funcName創(chuàng)建一個無名函數,當然那樣的函數沒有任何意義。
需要注意的是,p1到pn是參數名稱的列表,即p1不僅能代表一個參數,它也可以是一個逗號隔開的參數列表,例如下面的定義是等價的:
new Function("a", "b", "c", "return a+b+c")
new Function("a, b, c", "return a+b+c")
new Function("a,b", "c", "return a+b+c")
JavaScript引入Function類型并提供new Function()這樣的語法是因為函數對象添加屬性和方法就必須借助于Function這個類型。
函數的本質是一個內部對象,由JavaScript解釋器決定其運行方式。通過上述代碼創(chuàng)建的函數,在程序中可以使用函數名進行調用。本節(jié)開頭列出的函數定義問題也得到了解釋。注意可直接在函數聲明后面加上括號就表示創(chuàng)建完成后立即進行函數調用,例如:
var i=function (a,b){
       return a+b;
}(1,2);
alert(i);
這段代碼會顯示變量i的值等于3。i是表示返回的值,而不是創(chuàng)建的函數,因為括號“(”比等號“=”有更高的優(yōu)先級。這樣的代碼可能并不常用,但當用戶想在很長的代碼段中進行模塊化設計或者想避免命名沖突,這是一個不錯的解決辦法。
需要注意的是,盡管下面兩種創(chuàng)建函數的方法是等價的:
function funcName(){
       //函數體
}
//等價于
var funcName=function(){
       //函數體
}
但前面一種方式創(chuàng)建的是有名函數,而后面是創(chuàng)建了一個無名函數,只是讓一個變量指向了這個無名函數。在使用上僅有一點區(qū)別,就是:對于有名函數,它可以出現在調用之后再定義;而對于無名函數,它必須是在調用之前就已經定義。例如:
<script language="JavaScript" type="text/javascript">
<!--
func();
var func=function(){
       alert(1)
}
//-->
</script>
這段語句將產生func未定義的錯誤,而:
<script language="JavaScript" type="text/javascript">
<!--
func();
function func(){
      alert(1)
}
//-->
</script>
則能夠正確執(zhí)行,下面的語句也能正確執(zhí)行:
<script language="JavaScript" type="text/javascript">
<!--
func();
var someFunc=function func(){
      alert(1)
}
//-->
</script>
由此可見,盡管JavaScript是一門解釋型的語言,但它會在函數調用時,檢查整個代碼中是否存在相應的函數定義,這個函數名只有是通過function funcName()形式定義的才會有效,而不能是匿名函數。

三、  函數對象和其他內部對象的關系
除了函數對象,還有很多內部對象,比如:Object、Array、Date、RegExp、Math、Error。這些名稱實際上表示一個類型,可以通過 new操作符返回一個對象。然而函數對象和其他對象不同,當用typeof得到一個函數對象的類型時,它仍然會返回字符串“function”,而 typeof一個數組對象或其他的對象時,它會返回字符串“object”。下面的代碼示例了typeof不同類型的情況:
alert(typeof(Function)));
alert(typeof(new Function()));
alert(typeof(Array));
alert(typeof(Object));
alert(typeof(new Array()));
alert(typeof(new Date()));
alert(typeof(new Object()));
運行這段代碼可以發(fā)現:前面4條語句都會顯示“function”,而后面3條語句則顯示“object”,可見new一個function實際上是返回一個函數。這與其他的對象有很大的不同。其他的類型Array、Object等都會通過new操作符返回一個普通對象。盡管函數本身也是一個對象,但它與普通的對象還是有區(qū)別的,因為它同時也是對象構造器,也就是說,可以new一個函數來返回一個對象,這在前面已經介紹。所有typeof返回 “function”的對象都是函數對象。也稱這樣的對象為構造器(constructor),因而,所有的構造器都是對象,但不是所有的對象都是構造器。
既然函數本身也是一個對象,它們的類型是function,聯想到C++、Java等面向對象語言的類定義,可以猜測到Function類型的作用所在,那就是可以給函數對象本身定義一些方法和屬性,借助于函數的prototype對象,可以很方便地修改和擴充Function類型的定義,例如下面擴展了函數類型Function,為其增加了method1方法,作用是彈出對話框顯示"function":
Function.prototype.method1=function(){
      alert("function");
}
function func1(a,b,c){
      return a+b+c;
}
func1.method1();
func1.method1.method1();
注意最后一個語句:func1.method1.mehotd1(),它調用了method1這個函數對象的method1方法。雖然看上去有點容易混淆,但仔細觀察一下語法還是很明確的:這是一個遞歸的定義。因為method1本身也是一個函數,所以它同樣具有函數對象的屬性和方法,所有對 Function類型的方法擴充都具有這樣的遞歸性質。
Function是所有函數對象的基礎,而Object則是所有對象(包括函數對象)的基礎。在JavaScript中,任何一個對象都是Object的實例,因此,可以修改Object這個類型來讓所有的對象具有一些通用的屬性和方法,修改 Object類型是通過prototype來完成的:
Object.prototype.getType=function(){
       return typeof(this);
}
var array1=new Array();
function func1(a,b){
      return a+b;
}
alert(array1.getType());
alert(func1.getType());
上面的代碼為所有的對象添加了getType方法,作用是返回該對象的類型。兩條alert語句分別會顯示“object”和“function”。

四、  將函數作為參數傳遞
在前面已經介紹了函數對象本質,每個函數都被表示為一個特殊的對象,可以方便的將其賦值給一個變量,再通過這個變量名進行函數調用。作為一個變量,它可以以參數的形式傳遞給另一個函數,這在前面介紹JavaScript事件處理機制中已經看到過這樣的用法,例如下面的程序將func1作為參數傳遞給 func2:
function func1(theFunc){
      theFunc();
}
function func2(){
      alert("ok");
}
func1(func2);
在最后一條語句中,func2作為一個對象傳遞給了func1的形參theFunc,再由func1內部進行theFunc的調用。事實上,將函數作為參數傳遞,或者是將函數賦值給其他變量是所有事件機制的基礎。
例如,如果需要在頁面載入時進行一些初始化工作,可以先定義一個init的初始化函數,再通過window.onload=init;語句將其綁定到頁面載入完成的事件。這里的init就是一個函數對象,它可以加入window的onload事件列表。

五、  傳遞給函數的隱含參數:arguments
當進行函數調用時,除了指定的參數外,還創(chuàng)建一個隱含的對象——arguments。arguments是一個類似數組但不是數組的對象,說它類似是因為它具有數組一樣的訪問性質,可以用arguments[index]這樣的語法取值,擁有數組長度屬性length。arguments對象存儲的是實際傳遞給函數的參數,而不局限于函數聲明所定義的參數列表,例如:
function func(a,b){
     alert(a);
     alert(b);
     for(var i=0;i<arguments.length;i++){
           alert(arguments[i]);
     }
}
func(1,2,3);
代碼運行時會依次顯示:1,2,1,2,3。因此,在定義函數的時候,即使不指定參數列表,仍然可以通過arguments引用到所獲得的參數,這給編程帶來了很大的靈活性。arguments對象的另一個屬性是callee,它表示對函數對象本身的引用,這有利于實現無名函數的遞歸或者保證函數的封裝性,例如使用遞歸來計算1到n的自然數之和:
var sum=function(n){
      if(1==n)return 1;
      else return n+sum(n-1);
}
alert(sum(100));
其中函數內部包含了對sum自身的調用,然而對于JavaScript來說,函數名僅僅是一個變量名,在函數內部調用sum即相當于調用一個全局變量,不能很好的體現出是調用自身,所以使用arguments.callee屬性會是一個較好的辦法:
var sum=function(n){
      if(1==n)return 1;
      else return n+arguments.callee(n-1);
}
alert(sum(100));
callee屬性并不是arguments不同于數組對象的惟一特征,下面的代碼說明了arguments不是由Array類型創(chuàng)建:
Array.prototype.p1=1;
alert(new Array().p1);
function func(){
       alert(arguments.p1);
}
func();
運行代碼可以發(fā)現,第一個alert語句顯示為1,即表示數組對象擁有屬性p1,而func調用則顯示為“undefined”,即p1不是arguments的屬性,由此可見,arguments并不是一個數組對象。

六、  函數的apply、call方法和length屬性
JavaScript為函數對象定義了兩個方法:apply和call,它們的作用都是將函數綁定到另外一個對象上去運行,兩者僅在定義參數的方式有所區(qū)別:
Function.prototype.apply(thisArg,argArray);
Function.prototype.call(thisArg[,arg1[,arg2…]]);
從函數原型可以看到,第一個參數都被取名為thisArg,即所有函數內部的this指針都會被賦值為thisArg,這就實現了將函數作為另外一個對象的方法運行的目的。兩個方法除了thisArg參數,都是為Function對象傳遞的參數。下面的代碼說明了apply和call方法的工作方式:
//定義一個函數func1,具有屬性p和方法A
function func1(){
      this.p="func1-";
      this.A=function(arg){
            alert(this.p+arg);
      }
}
//定義一個函數func2,具有屬性p和方法B
function func2(){
      this.p="func2-";
      this.B=function(arg){
             alert(this.p+arg);
      }
}
var obj1=new func1();
var obj2=new func2();
obj1.A("byA");    //顯示func1-byA
obj2.B("byB");    //顯示func2-byB
obj1.A.apply(obj2,["byA"]); //顯示func2-byA,其中[“byA”]是僅有一個元素的數組,下同
obj2.B.apply(obj1,["byB"]); //顯示func1-byB
obj1.A.call(obj2,"byA");  //顯示func2-byA
obj2.B.call(obj1,"byB");  //顯示func1-byB
可以看出,obj1的方法A被綁定到obj2運行后,整個函數A的運行環(huán)境就轉移到了obj2,即this指針指向了obj2。同樣obj2的函數B也可以綁定到obj1對象去運行。代碼的最后4行顯示了apply和call函數參數形式的區(qū)別。
與arguments的length屬性不同,函數對象還有一個屬性length,它表示函數定義時所指定參數的個數,而非調用時實際傳遞的參數個數。例如下面的代碼將顯示2:
function sum(a,b){
      return a+b;
}
alert(sum.length);

七、  深入認識JavaScript中的this指針
this指針是面向對象程序設計中的一項重要概念,它表示當前運行的對象。在實現對象的方法時,可以使用this指針來獲得該對象自身的引用。
和其他面向對象的語言不同,JavaScript中的this指針是一個動態(tài)的變量,一個方法內的this指針并不是始終指向定義該方法的對象的,在上一節(jié)講函數的apply和call方法時已經有過這樣的例子。為了方便理解,再來看下面的例子:
<script language="JavaScript" type="text/javascript">
<!--
//創(chuàng)建兩個空對象
var obj1=new Object();
var obj2=new Object();
//給兩個對象都添加屬性p,并分別等于1和2
obj1.p=1;
obj2.p=2;
//給obj1添加方法,用于顯示p的值
obj1.getP=function(){
      alert(this.p); //表面上this指針指向的是obj1
}
//調用obj1的getP方法
obj1.getP();
//使obj2的getP方法等于obj1的getP方法
obj2.getP=obj1.getP;
//調用obj2的getP方法
obj2.getP();
//-->
</script>
從代碼的執(zhí)行結果看,分別彈出對話框顯示1和2。由此可見,getP函數僅定義了一次,在不同的場合運行,顯示了不同的運行結果,這是有this指針的變化所決定的。在obj1的getP方法中,this就指向了obj1對象,而在obj2的getP方法中,this就指向了obj2對象,并通過this指針引用到了兩個對象都具有的屬性p。
由此可見,JavaScript中的this指針是一個動態(tài)變化的變量,它表明了當前運行該函數的對象。由 this指針的性質,也可以更好的理解JavaScript中對象的本質:一個對象就是由一個或多個屬性(方法)組成的集合。每個集合元素不是僅能屬于一個集合,而是可以動態(tài)的屬于多個集合。這樣,一個方法(集合元素)由誰調用,this指針就指向誰。實際上,前面介紹的apply方法和call方法都是通過強制改變this指針的值來實現的,使this指針指向參數所指定的對象,從而達到將一個對象的方法作為另一個對象的方法運行。
每個對象集合的元素(即屬性或方法)也是一個獨立的部分,全局函數和作為一個對象方法定義的函數之間沒有任何區(qū)別,因為可以把全局函數和變量看作為window對象的方法和屬性。也可以使用new操作符來操作一個對象的方法來返回一個對象,這樣一個對象的方法也就可以定義為類的形式,其中的this指針則會指向新創(chuàng)建的對象。在后面可以看到,這時對象名可以起到一個命名空間的作用,這是使用JavaScript進行面向對象程序設計的一個技巧。例如:
var namespace1=new Object();
namespace1.class1=function(){
     //初始化對象的代碼
}
var obj1=new namespace1.class1();
這里就可以把namespace1看成一個命名空間。
由于對象屬性(方法)的動態(tài)變化特性,一個對象的兩個屬性(方法)之間的互相引用,必須要通過this指針,而其他語言中,this關鍵字是可以省略的。如上面的例子中:
obj1.getP=function(){
      alert(this.p); //表面上this指針指向的是obj1
}
這里的this關鍵字是不可省略的,即不能寫成alert(p)的形式。這將使得getP函數去引用上下文環(huán)境中的p變量,而不是obj1的屬性。


朱巖 2007-05-25 10:04 發(fā)表評論
]]>
用層模擬的小窗口(可拖動展合)http://www.tkk7.com/zhuyan/articles/119363.html朱巖朱巖Wed, 23 May 2007 03:55:00 GMThttp://www.tkk7.com/zhuyan/articles/119363.htmlhttp://www.tkk7.com/zhuyan/comments/119363.htmlhttp://www.tkk7.com/zhuyan/articles/119363.html#Feedback0http://www.tkk7.com/zhuyan/comments/commentRss/119363.htmlhttp://www.tkk7.com/zhuyan/services/trackbacks/119363.html閱讀全文

朱巖 2007-05-23 11:55 發(fā)表評論
]]>
Javascript----文件操作http://www.tkk7.com/zhuyan/articles/119153.html朱巖朱巖Tue, 22 May 2007 08:28:00 GMThttp://www.tkk7.com/zhuyan/articles/119153.htmlhttp://www.tkk7.com/zhuyan/comments/119153.htmlhttp://www.tkk7.com/zhuyan/articles/119153.html#Feedback0http://www.tkk7.com/zhuyan/comments/commentRss/119153.htmlhttp://www.tkk7.com/zhuyan/services/trackbacks/119153.html一、功能實現核心:FileSystemObject 對象 
    要在javascript中實現文件操作功能,主要就是依靠FileSystemobject對象。
二、FileSystemObject編程 
使用FileSystemObject 對象進行編程很簡單,一般要經過如下的步驟: 創(chuàng)建FileSystemObject對象、應用相關方法、訪問對象相關屬性 。 
(一)創(chuàng)建FileSystemObject對象 
創(chuàng)建FileSystemObject對象的代碼只要1行: 
var fso = new ActiveXObject("Scripting.FileSystemObject"); 
上述代碼執(zhí)行后,fso就成為一個FileSystemObject對象實例。 
(二)應用相關方法 
創(chuàng)建對象實例后,就可以使用對象的相關方法了。比如,使用CreateTextFile方法創(chuàng)建一個文本文件: 
var fso = new ActiveXObject("Scripting.FileSystemObject"); 
var f1 = fso.createtextfile("c:\\myjstest.txt",true"); 
(三)訪問對象相關屬性 
要訪問對象的相關屬性,首先要建立指向對象的句柄,這就要通過get系列方法實現:GetDrive負責獲取驅動器信息,GetFolder負責獲取文件夾信息,GetFile負責獲取文件信息。比如,指向下面的代碼后,f1就成為指向文件c:\test.txt的句柄: 
var fso = new ActiveXObject("Scripting.FileSystemObject"); 
var f1 = fso.GetFile("c:\\myjstest.txt"); 
然后,使用f1訪問對象的相關屬性。比如: 
var fso = new ActiveXObject("Scripting.FileSystemObject"); 
var f1 = fso.GetFile("c:\\myjstest.txt"); 
alert("File last modified: " + f1.DateLastModified); 
執(zhí)行上面最后一句后,將顯示c:\myjstest.txt的最后修改日期屬性值。 
但有一點請注意:對于使用create方法建立的對象,就不必再使用get方法獲取對象句柄了,這時直接使用create方法建立的句柄名稱就可以: 
var fso = new ActiveXObject("Scripting.FileSystemObject"); 
var f1 = fso.createtextfile("c:\\myjstest.txt",true"); 
alert("File last modified: " + f1.DateLastModified); 
三、操作驅動器(Drives) 
使用FileSystemObject對象來編程操作驅動器(Drives)和文件夾(Folders)很容易,這就象在Windows文件瀏覽器中對文件進行交互操作一樣,比如:拷貝、移動文件夾,獲取文件夾的屬性。 
(一)Drives對象屬性 
Drive對象負責收集系統(tǒng)中的物理或邏輯驅動器資源內容,它具有如下屬性: 
l TotalSize:以字節(jié)(byte)為單位計算的驅動器大小。 
l AvailableSpace或FreeSpace:以字節(jié)(byte)為單位計算的驅動器可用空間。 
l DriveLetter:驅動器字母。 
l DriveType:驅動器類型,取值為:removable(移動介質)、fixed(固定介質)、network(網絡資源)、CD-ROM或者RAM盤。 
l SerialNumber:驅動器的系列碼。 
l FileSystem:所在驅動器的文件系統(tǒng)類型,取值為FAT、FAT32和NTFS。 
l IsReady:驅動器是否可用。 
l ShareName:共享名稱。 
l VolumeName:卷標名稱。 
l Path和RootFolder:驅動器的路徑或者根目錄名稱。 
(二)Drive對象操作例程 
下面的例程顯示驅動器C的卷標、總容量和可用空間等信息: 
var fso, drv, s =""; 
fso = new ActiveXObject("Scripting.FileSystemObject"); 
drv = fso.GetDrive(fso.GetDriveName("c:\\")); 
s += "Drive C:" + " - "; 
s += drv.VolumeName + "\n"; 
s += "Total Space: " + drv.TotalSize / 1024; 
s += " Kb" + "\n"; 
s += "Free Space: " + drv.FreeSpace / 1024; 
s += " Kb" + "\n"; 
alert(s); 
四、操作文件夾(Folders) 
涉及到文件夾的操作包括創(chuàng)建、移動、刪除以及獲取相關屬性。 
Folder對象操作例程 :
下面的例程將練習獲取父文件夾名稱、創(chuàng)建文件夾、刪除文件夾、判斷是否為根目錄等操作: 
var fso, fldr, s = ""; 
// 創(chuàng)建FileSystemObject對象實例 
fso = new ActiveXObject("Scripting.FileSystemObject"); 
// 獲取Drive 對象 
fldr = fso.GetFolder("c:\\"); 
// 顯示父目錄名稱 
alert("Parent folder name is: " + fldr + "\n"); 
// 顯示所在drive名稱 
alert("Contained on drive " + fldr.Drive + "\n"); 
// 判斷是否為根目錄 
if (fldr.IsRootFolder) 
alert("This is the root folder."); 
else 
alert("This folder isn't a root folder."); 
alert("\n\n"); 
// 創(chuàng)建新文件夾 
fso.CreateFolder ("C:\\Bogus"); 
alert("Created folder C:\\Bogus" + "\n"); 
// 顯示文件夾基礎名稱,不包含路徑名 
alert("Basename = " + fso.GetBaseName("c:\\bogus") + "\n"); 
// 刪除創(chuàng)建的文件夾 
fso.DeleteFolder ("C:\\Bogus"); 
alert("Deleted folder C:\\Bogus" + "\n"); 
五、操作文件(Files) 
對文件進行的操作要比以上介紹的驅動器(Drive)和文件夾(Folder)操作復雜些,基本上分為以下兩個類別:對文件的創(chuàng)建、拷貝、移動、刪除操作和對文件內容的創(chuàng)建、添加、刪除和讀取操作。下面分別詳細介紹。 
(一)創(chuàng)建文件 
一共有3種方法可用于創(chuàng)建一個空文本文件,這種文件有時候也叫做文本流(text stream)。 
第一種是使用CreateTextFile方法。代碼如下: 
var fso, f1; 
fso = new ActiveXObject("Scripting.FileSystemObject"); 
f1 = fso.CreateTextFile("c:\\testfile.txt", true); 
第二種是使用OpenTextFile方法,并添加上ForWriting屬性,ForWriting的值為2。代碼如下: 
var fso, ts; 
var ForWriting= 2; 
fso = new ActiveXObject("Scripting.FileSystemObject"); 
ts = fso.OpenTextFile("c:\\test.txt", ForWriting, true); 
第三種是使用OpenAsTextStream方法,同樣要設置好ForWriting屬性。代碼如下: 
var fso, f1, ts; 
var ForWriting = 2; 
fso = new ActiveXObject("Scripting.FileSystemObject"); 
fso.CreateTextFile ("c:\\test1.txt"); 
f1 = fso.GetFile("c:\\test1.txt"); 
ts = f1.OpenAsTextStream(ForWriting, true); 
(二)添加數據到文件 
當文件被創(chuàng)建后,一般要按照“打開文件->填寫數據->關閉文件”的步驟實現添加數據到文件的目的。 
打開文件可使用FileSystemObject對象的OpenTextFile方法,或者使用File對象的OpenAsTextStream方法。 
填寫數據要使用到TextStream對象的Write、WriteLine或者WriteBlankLines方法。在同是實現寫入數據的功能下,這3者的區(qū)別在于:Write方法不在寫入數據末尾添加新換行符,WriteLine方法要在最后添加一個新換行符,而WriteBlankLines則增加一個或者多個空行。 
關閉文件可使用TextStream對象的Close方法。 
(三)創(chuàng)建文件及添加數據例程 
下面的代碼將創(chuàng)建文件、添加數據、關閉文件幾個步驟結合起來進行應用: 
var fso, tf; 
fso = new ActiveXObject("Scripting.FileSystemObject"); 
// 創(chuàng)建新文件 
tf = fso.CreateTextFile("c:\\testfile.txt", true); 
// 填寫數據,并增加換行符 
tf.WriteLine("Testing 1, 2, 3.") ; 
// 增加3個空行 
tf.WriteBlankLines(3) ; 
// 填寫一行,不帶換行符 
tf.Write ("This is a test."); 
// 關閉文件 
tf.Close(); 
(四)讀取文件內容 
從文本文件中讀取數據要使用TextStream對象的Read、ReadLine或ReadAll 方法。Read方法用于讀取文件中指定數量的字符; ReadLine方法讀取一整行,但不包括換行符;ReadAll方法則讀取文本文件的整個內容。讀取的內容存放于字符串變量中,用于顯示、分析。

 

方法或者屬性 描述
BuildPath()
 生成一個文件路徑
CopyFile()  復制文件
CopyFolder() 復制目錄
CreateFolder()  創(chuàng)建新目錄
CreateTextFile()  生成一個文件
DeleteFile()  刪除一個文件
DeleteFolder()  刪除一個目錄
DriveExists()  檢驗盤符是否存在
Drives 返回盤符的集合
FileExists()  檢驗文件是否存在
FolderExists 檢驗一個目錄是否存在
GetAbsolutePathName()  取得一個文件的絕對路徑
GetBaseName()  取得文件名
GetDrive()  取得盤符名
GetDriveName()  取得盤符名
GetExtensionName()  取得文件的后綴
GetFile()  生成文件對象
GetFileName()  取得文件名
GetFolder()  取得目錄對象
GetParentFolderName 取得文件或目錄的父目錄名
GetSpecialFolder()  取得特殊的目錄名
GetTempName()  生成一個臨時文件對象
MoveFile()  移動文件
MoveFolder()  移動目錄
OpenTextFile()  打開一個文件流


f.Files //目錄下所有文件集合
f.attributes //文件屬性
  Case 0 Str="普通文件。沒有設置任何屬性。 "
  Case 1 Str="只讀文件。可讀寫。 "
  Case 2 Str="隱藏文件。可讀寫。 "
  Case 4 Str="系統(tǒng)文件。可讀寫。 "
  Case 16 Str="文件夾或目錄。只讀。 "
  Case 32 Str="上次備份后已更改的文件。可讀寫。 "
  Case 1024 Str="鏈接或快捷方式。只讀。 "
  Case 2048 Str=" 壓縮文件。只讀。"
f.Datecreated // 創(chuàng)建時間
f.DateLastAccessed //上次訪問時間
f.DateLastModified // 上次修改時間
f.Path //文件路徑
f.Name //文件名稱
f.Type //文件類型
f.Size // 文件大小(單位:字節(jié))
f.ParentFolder //父目錄
f.RootFolder // 根目錄

 實例說明

BuildPath(路徑,文件名) //這個方法會對給定的路徑加上文件,并自動加上分界符
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
var newpath = fso.BuildPath("c:\\tmp", "51js.txt"); //生成 c:\tmp\51js.txt的路徑
alert(newpath);
-->
</SCRIPT>

CopyFile(源文件, 目標文件, 覆蓋) //復制源文件到目標文件,當覆蓋值為true時,如果目標文件存在會把文件覆蓋
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
var newpath = fso.CopyFile("c:\\autoexec.bat", "d:\\autoexec.bak");
-->
</SCRIPT>

CopyFolder(對象目錄,目標目錄 ,覆蓋) //復制對象目錄到目標目錄,當覆蓋為true時,如果目標目錄存在會把文件覆蓋
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
fso.CopyFolder("c:\\WINDOWS\\Desktop", "d:\\"); //把C盤的Desktop目錄復制到D盤的根目錄
-->
</SCRIPT>

CreateFolder(目錄名) //創(chuàng)建一個新的目錄
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
var newFolderName = fso.CreateFolder("c:\\51JS"); //在C盤上創(chuàng)建一個51JS的目錄
-->
</SCRIPT>

CreateTextFile(文件名, 覆蓋) //創(chuàng)建一個新的文件,如果此文件已經存在,你需要把覆蓋值定為true
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
var newFileObject = fso.CreateTextFile("c:\\autoexec51JS.bat", true); //腳本將在C盤創(chuàng)建一個叫 autoexec51JS.bat的文件
-->
</SCRIPT>

DeleteFile(文件名, 只讀?) //刪除一個文件,如果文件的屬性是只讀的話,你需要把只讀值設為true
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject"); //為了安全我先把要刪除的autoexec.bat備份到你的D盤
var newpath = fso.CopyFile("c:\\autoexec.bat", "d:\\autoexec.bat"); //把C盤的autoexec.bat文件刪除掉
fso.DeleteFile("c:\\autoexec.bat", true);
-->
</SCRIPT>

DeleteFolder(文件名, 只讀?)//刪除一個目錄,如果目錄的屬性是只讀的話,你需要把只讀值設為true
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
fso.CopyFolder("c:\\WINDOWS\\Desktop", "d:\\"); //為了安全我先把你C盤的Desktop目錄復制到你D盤的根目錄
fso.DeleteFolder("c:\\WINDOWS\\Desktop", true); //把你的Desktop目錄刪除,但因為desktop是系統(tǒng)的東西,所以不能全部刪除,但.........
-->
</SCRIPT>

DriveExists(盤符) //檢查一個盤是否存在,如果存在就返會真,不存在就返回.......
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
hasDriveD = fso.DriveExists("d"); //檢查系統(tǒng)是否有D盤存在
hasDriveZ = fso.DriveExists("z"); //檢查系統(tǒng)是否有Z盤存在
if (hasDriveD) alert("你的系統(tǒng)內有一個D盤");
if (!hasDriveZ) alert("你的系統(tǒng)內沒有Z盤");
-->
</SCRIPT>

FileExists(文件名) //檢查一個文件是否存在,如果存在就返會真,不存在就返回.......
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
fileName = fso.FileExists("c:\\autoexec.bat");
if (fileName) alert("你在C盤中有autoexec.bat文件,按下確定后這個文件將被刪除!"); //開個玩笑:)
-->
</SCRIPT>

FolderExists(目錄名) //檢查一個目錄是否存在,如果存在就返會真,不存在就返回.......
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
folderName = fso.FolderExists("c:\\WINDOWS\\Fonts");
if (folderName) alert("按下確定后系統(tǒng)的字庫將被刪除!"); //開個玩笑:)
-->
</SCRIPT>

GetAbsolutePathName(文件對象) //返回文件對象在系統(tǒng)的絕對路徑
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
pathName = fso.GetAbsolutePathName("c:\\autoexec.bat");
alert(pathName);
-->
</SCRIPT>

GetBaseName(文件對象) //返回文件對象的文件名
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
baseName = fso.GetBaseName("c:\\autoexec.bat"); //取得autoexec.bat的文件名autoexec
alert(baseName);
-->
</SCRIPT>

GetExtensionName(文件對象) //文件的后綴
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
exName = fso.GetExtensionName("c:\\autoexec.bat"); //取得autoexec.bat后綴bat
alert(exName);
-->
</SCRIPT>

GetParentFolderName(文件對象) //取得父級的目錄名
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
parentName = fso.GetParentFolderName("c:\\autoexec.bat"); //取得autoexec.bat的父級目錄C盤
alert(parentName);
-->
</SCRIPT>

GetSpecialFolder(目錄代碼) //取得系統(tǒng)中一些特別的目錄的路徑,目錄代碼有3個分別是 0:安裝Window的目錄 1:系統(tǒng)文件目錄 2:臨時文件目錄
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
tmpFolder = fso.GetSpecialFolder(2); //取得系統(tǒng)臨時文件目錄的路徑 如我的是 C:\windows\temp
alert(tmpFolder);
-->
</SCRIPT>

GetTempName() //生成一個隨機的臨時文件對象,會以rad帶頭后面跟著些隨機數,就好象一些軟件在安裝時會生成*.tmp
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
tmpName = fso.GetTempName(); //我在測試時就生成了radDB70E.tmp
alert(tmpName);
-->
</SCRIPT>

MoveFile(源文件, 目標文件) //把源文件移到目標文件的位置
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
var newpath = fso.MoveFile("c:\\autoexec.bat", "d:\\autoexec.bat"); //把C盤的autoexec.bat文件移移動到D盤
-->
</SCRIPT>



朱巖 2007-05-22 16:28 發(fā)表評論
]]>
JS腳本加密方法http://www.tkk7.com/zhuyan/articles/109209.html朱巖朱巖Sun, 08 Apr 2007 02:58:00 GMThttp://www.tkk7.com/zhuyan/articles/109209.htmlhttp://www.tkk7.com/zhuyan/comments/109209.htmlhttp://www.tkk7.com/zhuyan/articles/109209.html#Feedback0http://www.tkk7.com/zhuyan/comments/commentRss/109209.htmlhttp://www.tkk7.com/zhuyan/services/trackbacks/109209.html本文一共介紹了七種方法:
一:最簡單的加密解密
二:轉義字符"\"的妙用
三:使用Microsoft出品的腳本編碼器Script Encoder來進行編碼 (自創(chuàng)簡單解碼)
四:任意添加NUL空字符(十六進制00H) (自創(chuàng))
五:無用內容混亂以及換行空格TAB大法
六:自寫解密函數法
七:錯誤的利用 (自創(chuàng))


  在做網頁時(其實是網頁木馬呵呵),最讓人煩惱的是自己辛辛苦苦寫出來的客戶端IE運行的JAVASCRIPT代碼常常被別人輕易的拷貝,實在讓自己的心里有點不是滋味,要知道自己寫點東西也挺累的......^*^

  但我們也應該清楚地認識到因為JAVASCRIPT代碼是在IE中解釋執(zhí)行,要想絕對的保密是不可能的,我們要做的就是盡可能的增大拷貝者復制的難度,讓他知難而退(但愿~!~),下面我結合自己這幾年來的實踐,及個人研究的心得,和大家一起來探討一下網頁中JAVASCRIPT代碼的加密解密技術

  以加密下面的JAVASCRIPT代碼為例:
<SCRIPT LANGUAGE="JavaScript">
alert("《黑客防線》");
</SCRIPT>

  一:最簡單的加密解密

  大家對于JAVASCRIPT函數escape()和unescape()想必是比較了解啦(很多網頁加密在用它們),分別是編碼和解碼字符串,比如例子代碼用escape()函數加密后變?yōu)槿缦赂袷剑?br>alert%28%22%u9ED1%u5BA2%u9632%u7EBF%22%29%3B
 

如何?還看的懂嗎?當然其中的ASCII字符"alert"并沒有被加密,如果愿意我們可以寫點JAVASCRIPT代碼重新把它加密如下:
%61%6C%65%72%74%28%22%u9ED1%u5BA2%u9632%u7EBF%22%29%3B
 

呵呵!如何?這次是完全都加密了!

當然,這樣加密后的代碼是不能直接運行的,幸好還有eval(codeString)可用,這個函數的作用就是檢查JavaScript代碼并執(zhí)行,必選項 codeString 參數是包含有效 JavaScript 代碼的字符串值,加上上面的解碼unescape(),加密后的結果如下:
<SCRIPT LANGUAGE="JavaScript">
var code=unescape("%61%6C%65%72%74%28%22%u9ED1%u5BA2%u9632%u7EBF%22%29%3B");
eval(code)
</SCRIPT>
 

是不是很簡單?不要高興,解密也就同樣的簡單,解密代碼都擺給別人啦(unescape())!呵呵

  二:轉義字符"\"的妙用

  大家可能對轉義字符"\"不太熟悉,但對于JavaScript提供了一些特殊字符如:\n (換行)、 \r (回車)、\' (單引號 )等應該是有所了解的吧?其實"\"后面還可以跟八進制或十六進制的數字,如字符"a"則可以表示為:"\141"或"\x61"(注意是小寫字符"x"),至于雙字節(jié)字符如漢字"黑"則僅能用十六進制表示為"\u9ED1"(注意是小寫字符"u"),其中字符"u"表示是雙字節(jié)字符,根據這個原理例子代碼則可以表示為:

八進制轉義字符串如下:
<SCRIPT LANGUAGE="JavaScript">
eval("\141\154\145\162\164\50\42\u9ED1\u5BA2\u9632\u7EBF\42\51\73")
</SCRIPT>
 

十六進制轉義字符串如下:
<SCRIPT LANGUAGE="JavaScript">
eval("\x61\x6C\x65\x72\x74\x28\x22\u9ED1\u5BA2\u9632\u7EBF\x22\x29\x3B")
</SCRIPT>
 

  這次沒有了解碼函數,因為JavaScript執(zhí)行時會自行轉換,同樣解碼也是很簡單如下:
<SCRIPT LANGUAGE="JavaScript">
alert("\x61\x6C\x65\x72\x74\x28\x22\u9ED1\u5BA2\u9632\u7EBF\x22\x29\x3B")
</SCRIPT>
 
就會彈出對話框告訴你解密后的結果!三:使用Microsoft出品的腳本編碼器Script Encoder來進行編碼

  工具的使用就不多介紹啦!我是直接使用JavaScript調用控件Scripting.Encoder完成的編碼!代碼如下:
<SCRIPT LANGUAGE="JavaScript">
var Senc=new ActiveXObject("Scripting.Encoder");
var code='<SCRIPT LANGUAGE="JavaScript">\r\nalert("《黑客防線》");\r\n<\/SCRIPT>';
var Encode=Senc.EncodeScriptFile(".htm",code,0,"");
alert(Encode);
</SCRIPT>
 
編碼后的結果如下:
<SCRIPT LANGUAGE="JScript.Encode">#@~^FgAAAA==@#@&ls DD`J黑客防線r#p@#@&FgMAAA==^#~@</SCRIPT>
 
夠難看懂得吧?但相應的解密工具早已出來,而且連解密網頁都有!因為其解密網頁代碼過多,我就不多說拉!給大家介紹一下我獨創(chuàng)的解密代碼,如下:
<SCRIPT LANGUAGE="JScript.Encode">
function decode(){
#@~^FgAAAA==@#@&ls DD`J黑客防線r#p@#@&FgMAAA==^#~@
}
alert(decode.toString());
</SCRIPT>
 
咋樣?夠簡單吧?它是原理是:編碼后的代碼運行前IE會先對其進行解碼,如果我們先把加密的代碼放入一個自定義函數如上面的decode()中,然后對自定義函數decode調用toString()方法,得到的將是解碼后的代碼!

如果你覺得這樣編碼得到的代碼LANGUAGE屬性是JScript.Encode,很容易讓人識破,那么還有一個幾乎不為人知的window對象的方法execScript(),其原形為:
window.execScript( sExpression, sLanguage ) 
 

參數:
sExpression:  必選項。字符串(String)。要被執(zhí)行的代碼。
sLanguage :  必選項。字符串(String)。指定執(zhí)行的代碼的語言。默認值為 Microsoft JScript

使用時,前面的"window"可以省略不寫!

利用它我們可以很好的運行編碼后的JavaScript代碼,如下:
<SCRIPT LANGUAGE="JavaScript">
execScript("#@~^FgAAAA==@#@&ls DD`J黑客防線r#p@#@&FgMAAA==^#~@","JScript.Encode")
</SCRIPT>
 

你可以利用方法二對其中的""號內的字符串再進行編碼,使得"JScript.Encode"以及編碼特征碼"#@~^"不出現,效果會更好!
四:任意添加NUL空字符(十六進制00H)

  一次偶然的實驗,使我發(fā)現在HTML網頁中任意位置添加任意個數的"空字符",IE照樣會正常顯示其中的內容,并正常執(zhí)行其中的JavaScript 代碼,而添加的"空字符"我們在用一般的編輯器查看時,會顯示形如空格或黑塊,使得原碼很難看懂,如用記事本查看則"空字符"會變成"空格",利用這個原理加密結果如下:(其中顯示的"空格"代表"空字符")
<S C RI P T L ANG U A G E =" J a v a S c r i p t "> 

a l er t (" 黑 客 防 線") ; 

< / SC R I P T>
 

如何?是不是顯得亂七八糟的?如果不知道方法的人很難想到要去掉里面的"空字符"(00H)的!

  五:無用內容混亂以及換行空格TAB大法

  在JAVASCRIPT代碼中我們可以加入大量的無用字符串或數字,以及無用代碼和注釋內容等等,使真正的有用代碼埋沒在其中,并把有用的代碼中能加入換行、空格、TAB的地方加入大量換行、空格、TAB,并可以把正常的字符串用"\"來進行換行,這樣就會使得代碼難以看懂!如我加密后的形式如下:
<SCRIPT LANGUAGE="JavaScript">
"xajgxsadffgds";1234567890
625623216;var $=0;alert//@$%%&*()(&(^%^
//cctv function//
(//hhsaasajx xc
/*
asjgdsgu*/
"黑\
\
客\
防線"http://ashjgfgf
/*
@#%$^&%$96667r45fggbhytjty
*/
//window
)
;"#@$#%@#432hu";212351436
</SCRIPT>
至少如果我看到這樣的代碼是不會有心思去分析它的,你哪?

  六:自寫解密函數法

  這個方法和一、二差不多,只不過是自己寫個函數對代碼進行解密,很多VBS病毒使用這種方法對自身進行加密,來防止特征碼掃描!下面是我寫的一個簡單的加密解密函數,

加密代碼如下(詳細參照文件"加密.htm"):
<SCRIPT LANGUAGE="JavaScript">
function compile(code)

var c=String.fromCharCode(code.charCodeAt(0)+code.length);
for(var i=1;i<code.length;i++){
c+=String.fromCharCode(code.charCodeAt(i)+code.charCodeAt(i-1));
}
alert(escape(c));
}
compile('alert("《黑客防線》");')
</SCRIPT>
 
運行得到加密結果為:
o%CD%D1%D7%E6%9CJ%u9EF3%uFA73%uF1D4%u14F1%u7EE1Kd
 
相應的加密后解密的代碼如下:
<SCRIPT LANGUAGE="JavaScript">
function uncompile(code)
{
code=unescape(code);
var c=String.fromCharCode(code.charCodeAt(0)-code.length);
for(var i=1;i<code.length;i++){
c+=String.fromCharCode(code.charCodeAt(i)-c.charCodeAt(i-1));
}
return c;
}
eval(uncompile("o%CD%D1%D7%E6%9CJ%u9EF3%uFA73%uF1D4%u14F1%u7EE1Kd"));
</SCRIPT>
 

  七:錯誤的利用

  利用try{}catch(e){}結構對代碼進行測試解密,雖然這個想法很好(呵呵,夸夸自己),因為實用性不大,我僅給個例子
<SCRIPT LANGUAGE="JavaScript">

var a='alert("《黑客防線》");';
var c="";
for(var i=0;i<a.length;i++){
c+=String.fromCharCode(a.charCodeAt(i)^61);}

alert(c);

//上面的是加密代碼,當然如果真正使用這個方法時,不會把加密寫上的
//現在變量c就是加密后的代碼

//下面的函數t()先假設初始密碼為0,解密執(zhí)行,
//遇到錯誤則把密碼加1,然后接著解密執(zhí)行,直到正確運行

var d=c; //保存加密后的代碼
var b=0; //假定初始密碼為0
t();

function t(){
try{eval(c);}catch(e){
c="";
for(var i=0;i<d.length;i++){
c+=String.fromCharCode(d.charCodeAt(i)^b);}
b+=1;
t();
//setTimeout("t()",0);
}
}
</SCRIPT>


朱巖 2007-04-08 10:58 發(fā)表評論
]]>
js小技巧http://www.tkk7.com/zhuyan/articles/108897.html朱巖朱巖Fri, 06 Apr 2007 04:46:00 GMThttp://www.tkk7.com/zhuyan/articles/108897.htmlhttp://www.tkk7.com/zhuyan/comments/108897.htmlhttp://www.tkk7.com/zhuyan/articles/108897.html#Feedback0http://www.tkk7.com/zhuyan/comments/commentRss/108897.htmlhttp://www.tkk7.com/zhuyan/services/trackbacks/108897.html js小技巧
1.document.write(""); 輸出語句
2.JS中的注釋為//
3.傳統(tǒng)的HTML文檔順序是:document->html->(head,body)
4.一個瀏覽器窗口中的DOM順序是:window->(navigator,screen,history,location,document)
5.得到表單中元素的名稱和值:document.getElementById("表單中元素的ID號").name(或value)
6.一個小寫轉大寫的JS: document.getElementById("output").value = document.getElementById("input").value.toUpperCase();
7.JS中的值類型:String,Number,Boolean,Null,Object,Function
8.JS中的字符型轉換成數值型:parseInt(),parseFloat()
9.JS中的數字轉換成字符型:(""+變量)
10.JS中的取字符串長度是:(length)
11.JS中的字符與字符相連接使用+號.
12.JS中的比較操作符有:==等于,!=不等于,>,>=,<.<=
13.JS中聲明變量使用:var來進行聲明
14.JS中的判斷語句結構:if(condition){}else{}
15.JS中的循環(huán)結構:for([initial expression];[condition];[upadte expression]) {inside loop}
16.循環(huán)中止的命令是:break
17.JS中的函數定義:function functionName([parameter],...){statement[s]}
18.當文件中出現多個form表單時.可以用document.forms[0],document.forms[1]來代替.
19.窗口:打開窗口window.open(), 關閉一個窗口:window.close(), 窗口本身:self
20.狀態(tài)欄的設置:window.status="字符";
21.彈出提示信息:window.alert("字符");
22.彈出確認框:window.confirm();
23.彈出輸入提示框:window.prompt();
24.指定當前顯示鏈接的位置:window.location.href="URL"
25.取出窗體中的所有表單的數量:document.forms.length
26.關閉文檔的輸出流:document.close();
27.字符串追加連接符:+=
28.創(chuàng)建一個文檔元素:document.createElement(),document.createTextNode()
29.得到元素的方法:document.getElementById()
30.設置表單中所有文本型的成員的值為空:
var form = window.document.forms[0]
for (var i = 0; i<form.elements.length;i++){
if (form.elements[i].type == "text"){
form.elements[i].value = "";
}
}
31.復選按鈕在JS中判斷是否選中:document.forms[0].checkThis.checked (checked屬性代表為是否選中返回TRUE或FALSE)
32.單選按鈕組(單選按鈕的名稱必須相同):取單選按鈕組的長度document.forms[0].groupName.length
33.單選按鈕組判斷是否被選中也是用checked.
34.下拉列表框的值:document.forms[0].selectName.options[n].value (n有時用下拉列表框名稱加上.selectedIndex來確定被選中的值)
35.字符串的定義:var myString = new String("This is lightsword");
36.字符串轉成大寫:string.toUpperCase(); 字符串轉成小寫:string.toLowerCase();
37.返回字符串2在字符串1中出現的位置:String1.indexOf("String2")!=-1則說明沒找到.
38.取字符串中指定位置的一個字符:StringA.charAt(9);
39.取出字符串中指定起點和終點的子字符串:stringA.substring(2,6);
40.數學函數:Math.PI(返回圓周率),Math.SQRT2(返回開方),Math.max(value1,value2)返回兩個數中的最在值,Math.pow(value1,10)返回value1的十次方,Math.round(value1)四舍五入函數,Math.floor(Math.random()*(n+1))返回隨機數
41.定義日期型變量:var today = new Date();
42.日期函數列表:dateObj.getTime()得到時間,dateObj.getYear()得到年份,dateObj.getFullYear()得到四位的年份,dateObj.getMonth()得到月份,dateObj.getDate()得到日,dateObj.getDay()得到日期幾,dateObj.getHours()得到小時,dateObj.getMinutes()得到分,dateObj.getSeconds()得到秒,dateObj.setTime(value)設置時間,dateObj.setYear(val)設置年,dateObj.setMonth(val)設置月,dateObj.setDate(val)設置日,dateObj.setDay(val)設置星期幾,dateObj.setHours設置小時,dateObj.setMinutes(val)設置分,dateObj.setSeconds(val)設置秒 [注意:此日期時間從0開始計]
43.FRAME的表示方式: [window.]frames[n].ObjFuncVarName,frames["frameName"].ObjFuncVarName,frameName.ObjFuncVarName
44.parent代表父親對象,top代表最頂端對象
45.打開子窗口的父窗口為:opener
46.表示當前所屬的位置:this
47.當在超鏈接中調用JS函數時用:(javascript :)來開頭后面加函數名
48.在老的瀏覽器中不執(zhí)行此JS:<!-- //-->
49.引用一個文件式的JS:<script type="text/javascript" src="aaa.js"></script>
50.指定在不支持腳本的瀏覽器顯示的HTML:<noscript></noscript>
51.當超鏈和ONCLICK事件都有時,則老版本的瀏覽器轉向a.html,否則轉向b.html.例:<a href="a.html" onclick="location.href='b.html';return false">dfsadf</a>
52.JS的內建對象有:Array,Boolean,Date,Error,EvalError,Function,Math,Number,Object,RangeError,ReferenceError,RegExp,String,SyntaxError,TypeError,URIError
53.JS中的換行:\n
54.窗口全屏大小:<script>function fullScreen(){ this.moveTo(0,0);this.outerWidth=screen.availWidth;this.outerHeight=screen.availHeight;}window.maximize=fullScreen;</script>
55.JS中的all代表其下層的全部元素
56.JS中的焦點順序:document.getElementByid("表單元素").tabIndex = 1
57.innerHTML的值是表單元素的值:如<p id="para">"how are <em>you</em>"</p>,則innerHTML的值就是:how are <em>you</em>
58.innerTEXT的值和上面的一樣,只不過不會把<em>這種標記顯示出來.
59.contentEditable可設置元素是否可被修改,isContentEditable返回是否可修改的狀態(tài).
60.isDisabled判斷是否為禁止狀態(tài).disabled設置禁止狀態(tài)
61.length取得長度,返回整型數值
62.addBehavior()是一種JS調用的外部函數文件其擴展名為.htc
63.window.focus()使當前的窗口在所有窗口之前.
64.blur()指失去焦點.與FOCUS()相反.
65.select()指元素為選中狀態(tài).
66.防止用戶對文本框中輸入文本:onfocus="this.blur()"
67.取出該元素在頁面中出現的數量:document.all.tags("div(或其它HTML標記符)").length
68.JS中分為兩種窗體輸出:模態(tài)和非模態(tài).window.showModaldialog(),window.showModeless()
69.狀態(tài)欄文字的設置:window.status='文字',默認的狀態(tài)欄文字設置:window.defaultStatus = '文字.';
70.添加到收藏夾:external.AddFavorite("http://www.dannyg.com","jaskdlf");
71.JS中遇到腳本錯誤時不做任何操作:window.onerror = doNothing; 指定錯誤句柄的語法為:window.onerror = handleError;
72.JS中指定當前打開窗口的父窗口:window.opener,支持opener.opener...的多重繼續(xù).
73.JS中的self指的是當前的窗口
74.JS中狀態(tài)欄顯示內容:window.status="內容"
75.JS中的top指的是框架集中最頂層的框架
76.JS中關閉當前的窗口:window.close();
77.JS中提出是否確認的框:if(confirm("Are you sure?")){alert("ok");}else{alert("Not Ok");}
78.JS中的窗口重定向:window.navigate("http://www.sina.com.cn");
79.JS中的打印:window.print()
80.JS中的提示輸入框:window.prompt("message","defaultReply");
81.JS中的窗口滾動條:window.scroll(x,y)
82.JS中的窗口滾動到位置:window.scrollby
83.JS中設置時間間隔:setInterval("expr",msecDelay)或setInterval(funcRef,msecDelay)或setTimeout
84.JS中的模態(tài)顯示在IE4+行,在NN中不行:showModalDialog("URL"[,arguments][,features]);
85.JS中的退出之前使用的句柄:function verifyClose(){event.returnValue="we really like you and hope you will stay longer.";}} window.onbeforeunload=verifyClose;
86.當窗體第一次調用時使用的文件句柄:onload()
87.當窗體關閉時調用的文件句柄:onunload()
88.window.location的屬性: protocol(http:),hostname(www.example.com),port(80),host(www.example.com:80),pathname("/a/a.html"),hash("#giantGizmo",指跳轉到相應的錨記),href(全部的信息)
89.window.location.reload()刷新當前頁面.
90.window.history.back()返回上一頁,window.history.forward()返回下一頁,window.history.go(返回第幾頁,也可以使用訪問過的URL)
91.document.write()不換行的輸出,document.writeln()換行輸出
92.document.body.noWrap=true;防止鏈接文字折行.
93.變量名.charAt(第幾位),取該變量的第幾位的字符.
94."abc".charCodeAt(第幾個),返回第幾個字符的ASCii碼值.
95.字符串連接:string.concat(string2),或用+=進行連接
96.變量.indexOf("字符",起始位置),返回第一個出現的位置(從0開始計算)
97.string.lastIndexOf(searchString[,startIndex])最后一次出現的位置.
98.string.match(regExpression),判斷字符是否匹配.
99.string.replace(regExpression,replaceString)替換現有字符串.
100.string.split(分隔符)返回一個數組存儲值.
101.string.substr(start[,length])取從第幾位到指定長度的字符串.
102.string.toLowerCase()使字符串全部變?yōu)樾?
103.string.toUpperCase()使全部字符變?yōu)榇髮?
104.parseInt(string[,radix(代表進制)])強制轉換成整型.
105.parseFloat(string[,radix])強制轉換成浮點型.
106.isNaN(變量):測試是否為數值型.
107.定義常量的關鍵字:const,定義變量的關鍵字:var 


朱巖 2007-04-06 12:46 發(fā)表評論
]]>
JavaScript使用cookiehttp://www.tkk7.com/zhuyan/articles/108881.html朱巖朱巖Fri, 06 Apr 2007 03:36:00 GMThttp://www.tkk7.com/zhuyan/articles/108881.htmlhttp://www.tkk7.com/zhuyan/comments/108881.htmlhttp://www.tkk7.com/zhuyan/articles/108881.html#Feedback0http://www.tkk7.com/zhuyan/comments/commentRss/108881.htmlhttp://www.tkk7.com/zhuyan/services/trackbacks/108881.htmlcookie概述
在上一節(jié),曾經利用一個不變的框架來存儲購物欄數據,而商品顯示頁面是不斷變化的,盡管這樣能達到一個模擬全局變量的功能,但并不嚴謹。例如在導航框架頁面內右擊,單擊快捷菜單中的【刷新】命令,則所有的JavaScript變量都會丟失。因此,要實現嚴格的跨頁面全局變量,這種方式是不行的,JavaScript中的另一個機制:cookie,則可以達到真正全局變量的要求。
cookie是瀏覽器提供的一種機制,它將document對象的cookie屬性提供給JavaScript。可以由JavaScript對其進行控制,而并不是JavaScript本身的性質。cookie是存于用戶硬盤的一個文件,這個文件通常對應于一個域名,當瀏覽器再次訪問這個域名時,便使這個cookie可用。因此,cookie可以跨越一個域名下的多個網頁,但不能跨越多個域名使用。
不同的瀏覽器對cookie的實現也不一樣,但其性質是相同的。例如在Windows 2000以及Windows xp中,cookie文件存儲于documents and settings\userName\cookie\文件夾下。通常的命名格式為:
userName@domain.txt
cookie機制將信息存儲于用戶硬盤,因此可以作為全局變量,這是它最大的一個優(yōu)點。它可以用于以下幾種場合。
? 保存用戶登錄狀態(tài)。例如將用戶id存儲于一個cookie內,這樣當用戶下次訪問該頁面時就不需要重新登錄了,現在很多論壇和社區(qū)都提供這樣的功能。cookie還可以設置過期時間,當超過時間期限后,cookie就會自動消失。因此,系統(tǒng)往往可以提示用戶保持登錄狀態(tài)的時間:常見選項有一個月、三個月、一年等。
? 跟蹤用戶行為。例如一個天氣預報網站,能夠根據用戶選擇的地區(qū)顯示當地的天氣情況。如果每次都需要選擇所在地是煩瑣的,當利用了cookie后就會顯得很人性化了,系統(tǒng)能夠記住上一次訪問的地區(qū),當下次再打開該頁面時,它就會自動顯示上次用戶所在地區(qū)的天氣情況。因為一切都是在后臺完成,所以這樣的頁面就像為某個用戶所定制的一樣,使用起來非常方便。
? 定制頁面。如果網站提供了換膚或更換布局的功能,那么可以使用cookie來記錄用戶的選項,例如:背景色、分辨率等。當用戶下次訪問時,仍然可以保存上一次訪問的界面風格。
? 創(chuàng)建購物車。正如在前面的例子中使用cookie來記錄用戶需要購買的商品一樣,在結賬的時候可以統(tǒng)一提交。例如淘寶網就使用cookie記錄了用戶曾經瀏覽過的商品,方便隨時進行比較。
當然,上述應用僅僅是cookie能完成的部分應用,還有更多的功能需要全局變量。cookie的缺點主要集中于安全性和隱私保護。主要包括以下幾種:
? cookie可能被禁用。當用戶非常注重個人隱私保護時,他很可能禁用瀏覽器的cookie功能;
? cookie是與瀏覽器相關的。這意味著即使訪問的是同一個頁面,不同瀏覽器之間所保存的cookie也是不能互相訪問的;
? cookie可能被刪除。因為每個cookie都是硬盤上的一個文件,因此很有可能被用戶刪除;
? cookie安全性不夠高。所有的cookie都是以純文本的形式記錄于文件中,因此如果要保存用戶名密碼等信息時,最好事先經過加密處理。
設置cookie
每個cookie都是一個名/值對,可以把下面這樣一個字符串賦值給document.cookie:
document.cookie="userId=828";
如果要一次存儲多個名/值對,可以使用分號加空格(; )隔開,例如:
document.cookie="userId=828; userName=hulk";
在cookie的名或值中不能使用分號(;)、逗號(,)、等號(=)以及空格。在cookie的名中做到這點很容易,但要保存的值是不確定的。如何來存儲這些值呢?方法是用escape()函數進行編碼,它能將一些特殊符號使用十六進制表示,例如空格將會編碼為“20%”,從而可以存儲于cookie值中,而且使用此種方案還可以避免中文亂碼的出現。例如:
document.cookie="str="+escape("I love ajax");
相當于:
document.cookie="str=I%20love%20ajax";
當使用escape()編碼后,在取出值以后需要使用unescape()進行解碼才能得到原來的cookie值,這在前面已經介紹過。
盡管document.cookie看上去就像一個屬性,可以賦不同的值。但它和一般的屬性不一樣,改變它的賦值并不意味著丟失原來的值,例如連續(xù)執(zhí)行下面兩條語句:
document.cookie="userId=828";
document.cookie="userName=hulk";
這時瀏覽器將維護兩個cookie,分別是userId和userName,因此給document.cookie賦值更像執(zhí)行類似這樣的語句:
document.addCookie("userId=828");
document.addCookie("userName=hulk");
事實上,瀏覽器就是按照這樣的方式來設置cookie的,如果要改變一個cookie的值,只需重新賦值,例如:
document.cookie="userId=929";
這樣就將名為userId的cookie值設置為了929。

獲取cookie的值
下面介紹如何獲取cookie的值。cookie的值可以由document.cookie直接獲得:
var strCookie=document.cookie;
這將獲得以分號隔開的多個名/值對所組成的字符串,這些名/值對包括了該域名下的所有cookie。例如:
<script language="JavaScript" type="text/javascript">
<!--
document.cookie="userId=828";
document.cookie="userName=hulk";
var strCookie=document.cookie;
alert(strCookie);
//-->
</script>
圖7.1顯示了輸出的cookie值。由此可見,只能夠一次獲取所有的cookie值,而不能指定cookie名稱來獲得指定的值,這正是處理cookie值最麻煩的一部分。用戶必須自己分析這個字符串,來獲取指定的cookie值,例如,要獲取userId的值,可以這樣實現:
<script language="JavaScript" type="text/javascript">
<!--
//設置兩個cookie
document.cookie="userId=828";
document.cookie="userName=hulk";
//獲取cookie字符串
var strCookie=document.cookie;
//將多cookie切割為多個名/值對
var arrCookie=strCookie.split("; ");
var userId;
//遍歷cookie數組,處理每個cookie對
for(var i=0;i<arrCookie.length;i++){
      var arr=arrCookie[i].split("=");
      //找到名稱為userId的cookie,并返回它的值
      if("userId"==arr[0]){
             userId=arr[1];
             break;
      }
}
alert(userId);
//-->
</script>
這樣就得到了單個cookie的值

用類似的方法,可以獲取一個或多個cookie的值,其主要的技巧仍然是字符串和數組的相關操作。

給cookie設置終止日期
到現在為止,所有的cookie都是單會話cookie,即瀏覽器關閉后這些cookie將會丟失,事實上這些cookie僅僅是存儲在內存中,而沒有建立相應的硬盤文件。
在實際開發(fā)中,cookie常常需要長期保存,例如保存用戶登錄的狀態(tài)。這可以用下面的選項來實現:
document.cookie="userId=828; expires=GMT_String";
其中GMT_String是以GMT格式表示的時間字符串,這條語句就是將userId這個cookie設置為GMT_String表示的過期時間,超過這個時間,cookie將消失,不可訪問。例如:如果要將cookie設置為10天后過期,可以這樣實現:
<script language="JavaScript" type="text/javascript">
<!--
//獲取當前時間
var date=new Date();
var expireDays=10;
//將date設置為10天以后的時間
date.setTime(date.getTime()+expireDays*24*3600*1000);
//將userId和userName兩個cookie設置為10天后過期
document.cookie="userId=828; userName=hulk; expire="+date.toGMTString();
//-->
</script>

刪除cookie
為了刪除一個cookie,可以將其過期時間設定為一個過去的時間,例如:
<script language="JavaScript" type="text/javascript">
<!--
//獲取當前時間
var date=new Date();
//將date設置為過去的時間
date.setTime(date.getTime()-10000);
//將userId這個cookie刪除
document.cookie="userId=828; expire="+date.toGMTString();
//-->
</script>
指定可訪問cookie的路徑
默認情況下,如果在某個頁面創(chuàng)建了一個cookie,那么該頁面所在目錄中的其他頁面也可以訪問該cookie。如果這個目錄下還有子目錄,則在子目錄中也可以訪問。例如在www.xxxx.com/html/a.html中所創(chuàng)建的cookie,可以被www.xxxx.com/html/b.htmlwww.xxx.com/ html/ some/c.html所訪問,但不能被www.xxxx.com/d.html訪問。
為了控制cookie可以訪問的目錄,需要使用path參數設置cookie,語法如下:
document.cookie="name=value; path=cookieDir";
其中cookieDir表示可訪問cookie的目錄。例如:
document.cookie="userId=320; path=/shop";
就表示當前cookie僅能在shop目錄下使用。
如果要使cookie在整個網站下可用,可以將cookie_dir指定為根目錄,例如:
document.cookie="userId=320; path=/";

指定可訪問cookie的主機名
和路徑類似,主機名是指同一個域下的不同主機,例如:www.google.com和gmail.google.com就是兩個不同的主機名。默認情況下,一個主機中創(chuàng)建的cookie在另一個主機下是不能被訪問的,但可以通過domain參數來實現對其的控制,其語法格式為:
document.cookie="name=value; domain=cookieDomain";
以google為例,要實現跨主機訪問,可以寫為:
document.cookie="name=value;domain=.google.com";
這樣,所有google.com下的主機都可以訪問該cookie。

綜合示例:構造通用的cookie處理函數
cookie的處理過程比較復雜,并具有一定的相似性。因此可以定義幾個函數來完成cookie的通用操作,從而實現代碼的復用。下面列出了常用的cookie操作及其函數實現。
1.添加一個cookie:addCookie(name,value,expireHours)
該函數接收3個參數:cookie名稱,cookie值,以及在多少小時后過期。這里約定expireHours為0時不設定過期時間,即當瀏覽器關閉時cookie自動消失。該函數實現如下:
<script language="JavaScript" type="text/javascript">
<!--
function addCookie(name,value,expireHours){
      var cookieString=name+"="+escape(value);
      //判斷是否設置過期時間
      if(expireHours>0){
             var date=new Date();
             date.setTime(date.getTime+expireHours*3600*1000);
             cookieString=cookieString+"; expire="+date.toGMTString();
      }
      document.cookie=cookieString;
}
//-->
</script>
2.獲取指定名稱的cookie值:getCookie(name)
該函數返回名稱為name的cookie值,如果不存在則返回空,其實現如下:
<script language="JavaScript" type="text/javascript">
<!--
function getCookie(name){
      var strCookie=document.cookie;
      var arrCookie=strCookie.split("; ");
      for(var i=0;i<arrCookie.length;i++){
            var arr=arrCookie[i].split("=");
            if(arr[0]==name)return arr[1];
      }
      return "";
}
//-->
</script>
3.刪除指定名稱的cookie:deleteCookie(name)
該函數可以刪除指定名稱的cookie,其實現如下:
<script language="JavaScript" type="text/javascript">
<!--
function deleteCookie(name){
       var date=new Date();
       date.setTime(date.getTime()-10000);
       document.cookie=name+"=v; expire="+date.toGMTString();
}
//-->
</script>



朱巖 2007-04-06 11:36 發(fā)表評論
]]>
Rico入門http://www.tkk7.com/zhuyan/articles/107135.html朱巖朱巖Thu, 29 Mar 2007 02:09:00 GMThttp://www.tkk7.com/zhuyan/articles/107135.htmlhttp://www.tkk7.com/zhuyan/comments/107135.htmlhttp://www.tkk7.com/zhuyan/articles/107135.html#Feedback0http://www.tkk7.com/zhuyan/comments/commentRss/107135.htmlhttp://www.tkk7.com/zhuyan/services/trackbacks/107135.html 0. 簡介。
一個支援 AJAX的 javascript library,夠簡單吧。

1. 下載 Rico的 js file。
http://openrico.org/ 下載 prototype.js 和 rico.js。

2. include js file。
網頁裡加上下面兩個設定(假設步驟一下載的檔案放在scripts目錄)。
1
2
<script src="scripts/prototype.js"></script>
<script src="scripts/rico.js"></script>


3. 在網頁裡設定 request。
一個網頁可以設定多個request,而且這個最好設定成全域變數,
這樣就可以共用這個 request URL,requestName只是識別用,所以可以任意命名。
1
2
3
ajaxEngine.registerRequest("requestName","requestURL");
//例如
ajaxEngine.registerRequest("getPersonInfo","getPersonInfo.do");


4. 設定回傳時要對應的物件。
設定回傳時要對應的物件的目的,是要指定回傳資料內容,對應到網頁那個物件,或交由誰處理。
Rico的回傳物件有兩種,一種是element一種是object,
差別在於element是任意格式,但只能對應單一網頁物件,object可以多筆,可以寫自己的回傳事件。
另外設定的時間點也要注意,就是說如果網頁物件還沒產生,就先設定,那麼會不 work。

4-1 設定回傳後會變更網頁的那個 element。
registerAjaxElement如果只給一個參數,則自動對應同名ID的網頁物件,
回傳時直接用回傳內容修改對應網頁物件的innerHTML,所以沒有可自己處裡的事件。
1
2
3
4
//對應到同名的 elementId
ajaxEngine.registerAjaxElement("elementId");
//回傳的 fromElementId內容,會變更 toElementId物件
ajaxEngine.registerAjaxElement("fromElementId",$("toElementId"));


4-2 設定回傳後要由哪個 object處理。
Rico會將回傳資料當參數,傳給對應 object的 ajaxUpdate,所以自己寫的object必須有這個method。
也就自己處理回傳後事件的起點。
1
ajaxEngine.registerAjaxObject("objectId",new UserObject());


4-3 回傳的XML格式。
回傳值必須是下面格式的XML,所以回傳內容的 contentType必須是 application/xml,
還有中文在UTF8格式時可以正常顯示,其他編碼都會看到亂碼。
1
2
3
4
5
6
7
8
9
10
11
12
13
<ajax-response> 
<response type="element|object" id="elementId">
  response可以有一或多個,也可以element object混用
</response>
</ajax-response> 
//例如
<ajax-response> 
<response type="object" id="objectId">
  <returnObject name="Hello" age="1" />
  <returnObject name="World" age="99" />
</response>
<response type="element" id="elementId">Hello World</response>
</ajax-response> 


5. 網頁事件。
當網頁事件發(fā)生時,要做的就是送出request,此時會根據對應的 requestName,
找到對應的URL來傳送資料,
只要再把要傳遞的參數傳給 sendRequest就可以了。
1
2
3
ajaxEngine.sendRequest("getPersonInfo", 
                        "firstName=" + firstName, 
                        "lastName=" + lastName ); 


5-1 post
如果要用poet的方式傳送資料,就比較麻煩,要用這種方式。
1
2
3
var params="rName="+document.getElementById("userName").value+"&rAge="+document.getElementById("age").value;
//post要小寫。
ajaxEngine.sendRequest("hello",{method:"post",parameters:params});


6. 範例
最後來個矬矬的範例吧,把下面三個程式放在一起就可以測試了,當然,別忘了下載 Rico的js file。

6-1 主網頁
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<html>
<head>
<script src="js/prototype.js" type="text/javascript"></script>
<script src="js/rico.js" type="text/javascript"></script>
<script language="javascript">
  ajaxEngine.registerRequest("getElement", "returnElement.jsp");
  ajaxEngine.registerRequest("getObject", "returnObject.jsp");
  
function runMe1() {
  ajaxEngine.registerAjaxElement("helloId");
  ajaxEngine.registerAjaxElement("sayHello");
  ajaxEngine.registerAjaxElement("fromElementId",$("toElementId"));      
?
  var pramas = "Name="+document.getElementById("userName").value;
  ajaxEngine.sendRequest("getElement",pramas);
}
?
  ajaxEngine.registerAjaxObject("objectId",new UserObject());
  
function runMe2(){
ajaxEngine.sendRequest("getObject",
                       "rName="+document.getElementById("uName").value,
                       "rAge="+document.getElementById("age").value);
//這是post的方法//var params="rName="+document.getElementById("userName").value+//   "&rAge="+document.getElementById("age").value;//ajaxEngine.sendRequest("hello",{method:"post",parameters:params});}
function UserObject(){
this.ajaxUpdate=function(ajaxResponse){//alert(ajaxResponse);
   var objs = ajaxResponse.getElementsByTagName('returnObject');
   var tabStr="<table border='1'><tr><td>姓名</td><td>年齡</td></tr>"for(var i=0;i<objs.length;i++){
       tabStr+="<tr><td>";
??   tabStr+=objs[i].getAttribute("name")+"</td><td>"+objs[i].getAttribute("age");
       tabStr+="</td></tr>";??   
   }
   tabStr+="</table>";
?
   this.setValue(tabStr);
}
this.setValue=function(str){
   document.getElementById("result").innerHTML=str;
}}
</script>
</head>
<body>
<h3>Element Test</h3>
Your Name:<input type="text" id="userName" name="userName">
<input type="button" name="BT" value="click me" onclick="runMe1()">
<table><tr><td><div id="helloId"></div></td><td><div id="toElementId"></div></td></tr></table>
<div id="sayHello"></div>
<hr>
<h3>Object Test</h3>
Your Name:<input type="text" id="uName" name="uName">
Your Age:<input type="text" id="age" name="age">
<input type="button" value="Click Me" onclick="runMe2()">
<div id="result"></div>
</body>
</html>


6-2 returnElement.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
response.setContentType("application/xml");
%>    
<ajax-response> 
<response type="element" id="helloId"><span style="color:#008000">Hello</span></response> 
<response type="element" id="fromElementId"><%=request.getParameter("Name")%></response>
<response type="element" id="sayHello">
<script language="javascript">
alert("Hello "+<%=request.getParameter("Name")%>);
</script>
</response>
</ajax-response> 


6-3 returnObject.jsp
1
2
3
4
5
6
7
8
9
10
11
12
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
response.setContentType("application/xml");
%>    
<ajax-response> 
<response type="object" id="objectId">
<returnObject name="<%=request.getParameter("rName")%>-1" age="<%=request.getParameter("rAge")%>" />
<returnObject name="<%=request.getParameter("rName")%>-2" age="<%=request.getParameter("rAge")%>" />
<returnObject name="<%=request.getParameter("rName")%>-3" age="<%=request.getParameter("rAge")%>" />
</response> 
</ajax-response> 


朱巖 2007-03-29 10:09 發(fā)表評論
]]>
prototype.js開發(fā)筆記 (轉)http://www.tkk7.com/zhuyan/articles/105759.html朱巖朱巖Fri, 23 Mar 2007 02:46:00 GMThttp://www.tkk7.com/zhuyan/articles/105759.htmlhttp://www.tkk7.com/zhuyan/comments/105759.htmlhttp://www.tkk7.com/zhuyan/articles/105759.html#Feedback0http://www.tkk7.com/zhuyan/comments/commentRss/105759.htmlhttp://www.tkk7.com/zhuyan/services/trackbacks/105759.html閱讀全文

朱巖 2007-03-23 10:46 發(fā)表評論
]]>
主站蜘蛛池模板: 人妻无码久久一区二区三区免费 | 美女被免费视频网站| 亚洲伊人久久大香线蕉影院| 亚洲AV无码久久精品蜜桃| 亚洲中文字幕久久精品无码APP | 中国国产高清免费av片| 添bbb免费观看高清视频| 国产精品亚洲色图| 免费很黄无遮挡的视频毛片| 麻豆va在线精品免费播放| 污污的视频在线免费观看| 日韩在线观看视频免费| 两个人的视频www免费| 久久美女网站免费| 亚洲免费人成视频观看| 国产福利在线免费| 成人免费无码大片A毛片抽搐色欲| 成人毛片免费观看视频在线 | j8又粗又长又硬又爽免费视频| 人妻仑乱A级毛片免费看| 精品无码国产污污污免费网站国产| 狠狠躁狠狠爱免费视频无码| 国产色无码精品视频免费| 全部免费毛片在线播放| 91手机看片国产永久免费| 成人黄页网站免费观看大全| www国产亚洲精品久久久| 国产午夜亚洲精品理论片不卡| 午夜亚洲AV日韩AV无码大全| 亚洲日韩国产精品无码av| 伊人久久五月丁香综合中文亚洲| 爱爱帝国亚洲一区二区三区| 成人一级免费视频| 无码精品一区二区三区免费视频| 麻豆视频免费播放| 四虎永久在线精品免费影视| 亚洲精品一品区二品区三品区| 亚洲精品乱码久久久久久下载 | 国产精品亚洲视频| 久久久久亚洲AV无码麻豆| 亚洲乱码无人区卡1卡2卡3|