亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > AJAX > 正文

Ajax標簽導航實例詳解-Javascript技巧篇

2024-09-01 08:26:25
字體:
來源:轉載
供稿:網友

Javascript技巧篇(arguments對象的運用技巧)

好了,我們現在已經把CSS樣式寫好了,現在就開始用腳本來控制了。通過剛才講解標簽樣式的時候,其實我們也基本把腳本控制的邏輯流程分析了下:

  1. 選中當前標簽的背景要區別顯示;
  2. 選中標簽和其前一個標簽的分隔線要隱藏;

不過在改變標簽樣式這個步驟開始之前我們要給我們的標簽菜單(ul)來設置onclick事件(功能函數),從而觸發改變當前選中項的樣式的事件。到我們的主題了,呵呵!快來看看代碼吧:

/* ===========================================================
* 函數名稱:tabsEvent()
* 參數說明:要設置事件的DOM節點ID
* 函數功能:為導航TAB菜單(li)設置onclick處理方法(函數),
* 屏蔽掉a標簽默認的處理(打開新鏈接)事件
* 返 回 值:false - 屏蔽掉a標簽默認的處理(打開新鏈接)事件
* 使用方法:tabsEvent("news","sports");
============================================================ */
function tabsEvent(){
for(var i=0;i<arguments.length;i++){
var tabs = (arguments[i]);
// DOM節點(tabs)不存在或者瀏覽器不支持getElementsByTagName()方法
// 函數不執行
if(!tabs || !document.getElementsByTagName) return false;

var theList = tabs.getElementsByTagName("li"); // 搜尋導航標簽(ID為tabs)里的所有li標簽
var theLink = tabs.getElementsByTagName("a"); // 搜尋導航標簽(ID為tabs)里的所有a標簽

for(var j=0;j<theList.length;j++){
var theTab = theList[j];
if(theTab.parentNode!=tabs) continue;

var theA = theLink[j];
// 屏蔽掉a標簽默認的處理(打開新鏈接)事件
theA.onclick = function(){
return false;
}

// 為導航TAB菜單(li)設置onclick處理方法(函數)
theTab.onclick = function(){
var theClass = this.className;
if(theClass!="current" && theClass!="first"){
var objId = this.getAttribute("id").split("-")[1]; // 當前選中標簽(li)在菜單(ul)中的索引值
var tarObj = this.getAttribute("id").split("-")[0]; // 要顯示信息的目標DOM節點ID值
var theURL = tarObj + "/" + tarObj + objId + ".htm"; // 要異步加載的URL地址
ajaxInject((tarObj),objId,tarObj,theURL);
return false;
}
}
}
}
}

上面這段腳本,我們使用了(i)函數獲取DOM節點,方法就是("DOMId"),這里就不多說了。這里要花些時間講的是arguments對象,恩,...,恩,開始講arguments對象了,注意聽講(不是在賣弄哦,這個我們經常要用到的,也很重要的一個知識點):

Arguments是進行函數調用時,除了指定的參數外,還另外創建的一個隱藏對象。Arguments是一個類似數組但不是數組的對象,說它類似數組是因為其具有數組一樣的訪問性質及方式,可以由arguments[n]來訪問對應的單個參數的值,并擁有數組長度屬性length。還有就是arguments對象存儲的是實際傳遞給函數的參數,而不局限于函數聲明所定義的參數列表,而且不能顯式創建 arguments 對象。arguments 對象只有函數開始時才可用。

”隱藏對象“,怎么個隱藏法呢?看看我們函數的寫法吧:

function tabsEvent(){
...
}

而我在調用這個函數是確是這么寫的:

<script language="javascript" type="text/javascript">
<!--
tabsEvent("news","sports");
//-->
</script>

“tabsEvent("news","sports");”, 我使用了參數,而我定義tabsEvent時,卻沒有使用形參(形參個數為零),就是這么個隱藏法。

它像數組,而又不是數組,怎么解釋了?還是看個說明arguments不是數組(Array類)的代碼:


Array.prototype.selfvalue = 1;
alert(new Array().selfvalue);

function testAguments(){
alert(arguments.selfvalue);
}

 

運行代碼你會發現第一個alert顯示1,這表示數組對象擁有selfvalue屬性,值為1。而當你調用函數testAguments時,你會發現顯示的是“undefined”,說明了selfvalue不是arguments的屬性,即arguments并不是一個數組對象。

呵呵,又說了這么多,要將就講徹底些:caller、callee、apply、call都講講吧,^-^!

caller - 返回一個對函數的引用,該函數調用了當前函數。

對于函數來說,caller 屬性只有在函數執行時才有定義。如果函數是由頂層調用的,那么 caller 包含的就是 null 。如果在字符串上下文中使用 caller 屬性,那么結果和 functionName.toString 一樣,也就是說,顯示的是函數的反編譯文本。 下面的例子說明了 caller 屬性的用法:

 

function callerDemo() {
if (callerDemo.caller) {
var a = callerDemo.caller.toString();
alert(a);
}
else {
alert("this is a top function");
}
}

function handleCaller() {
callerDemo();
}

handleCaller();
callerDemo();

我們通過handleCaller();調用執行callerDemo();時callerDemo.caller才定義,可以看到一個警告框,顯示的反編譯的handleCaller()的文本。而直接使用callerDemo();時,我們callerDemo函數的caller是沒有定義的,所以你會看到”this is a top function“提示字符。

callee - 返回正被執行的 Function 對象,也就是所指定的 Function 對象的正文。 用法[function.]arguments.callee,可選項 function 參數是當前正在執行的 Function 對象的名稱。

callee 屬性是 arguments 對象的一個成員,它表示對函數對象本身的引用,這有利于匿名函數的遞歸或者保證函數的封裝性,例如下邊示例的遞歸計算1到n的自然數之和。而該屬性僅當相關函數正在執行時才可用。還有需要注意的是callee擁有length屬性,這個屬性有時候用于驗證還是比較好的。arguments.length是實參長度,arguments.callee.length是形參長度,由此可以判斷調用時形參長度是否和實參長度一致。

 

//callee可以打印其本身
function calleeDemo() {
alert(arguments.callee);
}

//用于驗證參數
function calleeLengthDemo(arg1, arg2) {
if (arguments.length==arguments.callee.length) {
alert("驗證形參和實參長度一致!");
return;
}
else {
alert("實參長度:" +arguments.length);
alert("形參長度: " +arguments.callee.length);
}
}

//遞歸計算
var sum = function(n){
if (n <= 0) {
return 1;
}
else{
return n + arguments.callee(n - 1);
}
}

 

調用alert(sum(9));時,其中函數內部包含了對sum自身的引用,函數名僅僅是一個變量名,在函數內部調用sum即相當于調用一個全局變量,不能很好的體現出是調用自身,這時使用callee會是一個比較好的方法。

apply 和 call 它們的作用都是將函數綁定到另外一個對象上去運行,兩者僅在定義參數方式時有所區別:

 

apply(thisArg,argArray);

call(thisArg[,arg1,arg2…] ]);

即所有函數內部的this指針都會被賦值為thisArg,這可實現將函數作為另外一個對象的方法運行的目的

apply的說明:如果 argArray 不是一個有效的數組或者不是 arguments 對象,那么將導致一個 TypeError。如果沒有提供 argArray 和 thisArg 任何一個參數,那么 Global 對象將被用作 thisArg,并且無法被傳遞任何參數。

call的說明:call 方法可將一個函數的對象上下文從初始的上下文改變為由 thisArg 指定的新對象。 如果沒有提供 thisArg 參數,那么 Global 對象被用作 thisArg。

應用call和apply還有一個技巧在里面,就是用call和apply應用另一個函數(類)以后,當前的函數(類)就具備了另一個函數(類)的方法或者是屬性,這也可以稱之為“繼承”??聪旅媸纠?

 

// 繼承的演示
function base() {
this.member = "dnnsun_Member";
this.method = function() {
alert(this.member);
}
}

function extend() {
base.call(this);
alert(member);
alert(this.method);
}

上面的例子可以看出,通過call之后,extend可以繼承到base的方法和屬性。

呵呵,你可能發現了,在javascript框架prototype里就使用apply來創建一個定義類的模式,其實現代碼如下:

var Class = {
create: function() {
return function() {
this.initialize.apply(this, arguments);
}
}
}

從代碼看,該對象僅包含一個方法:Create,其返回一個函數,即類。但這也同時是類的構造函數,其中調用initialize,而這個方法是在類創建時定義的初始化函數。通過如此途徑,就可以實現prototype中的類創建模式,示例代碼:

 

var vehicle=Class.create();

vehicle.prototype={
initialize:function(type){
this.type=type;
}

showSelf:function(){
alert("this vehicle is "+ this.type);
}
}

var moto=new vehicle("Moto");
moto.showSelf();

呵呵,越扯越多了,現在清楚了arguments對象的用法了吧!哈哈,還是有些收獲的吧?^-^!!! 不過該回到我們的主題了,怎么實現點擊標簽(li)觸發更改樣式的事件。還是接著看我們的ajaxtab.js的代碼吧:

for(var i=0;i<arguments.length;i++){
var tabs = (arguments[i]);
}

看看上面講的arguments的用法,呵呵,這里我們就獲取了全部的標簽導航菜單了。arguments.length = ?等于2,arguments[i]是什么,就是我們傳的參數本身(tabsEvent("news","sports");),那么(arguments[i])就是我們的標簽菜單,具體點就是("news")和("sports")了

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国语对白做受69| 欧美人与性动交a欧美精品| 欧美怡红院视频一区二区三区| 欧美第一黄网免费网站| 成人乱色短篇合集| 国产免费一区二区三区在线观看| 国产精品老女人精品视频| 97国产精品视频人人做人人爱| 欧美性猛交xxxx富婆| 欧美一区二区三区……| 国外成人免费在线播放| 久久国产精品久久久久久久久久| 欧美最猛性xxxxx(亚洲精品)| 欧美一级淫片播放口| 国产亚洲视频在线观看| 欧美日韩亚洲视频一区| 中文字幕日韩av| 久久久久久久久久av| 欧美午夜宅男影院在线观看| 午夜精品三级视频福利| 午夜精品久久久久久久久久久久| 欧美极品少妇xxxxx| 亚洲色图50p| 成人网在线免费观看| 亚洲欧美日韩网| 久久精品国产亚洲一区二区| 亚洲自拍欧美另类| 1769国产精品| 91精品国产高清久久久久久| 久久人体大胆视频| 国产91免费观看| 91高清视频免费观看| 欧美一级大片在线免费观看| 亚洲国产精品高清久久久| 日韩一区在线视频| www.日韩.com| 久久久久久伊人| 在线观看不卡av| 伦伦影院午夜日韩欧美限制| 国产一区二区三区在线播放免费观看| 永久免费毛片在线播放不卡| 亚洲伊人成综合成人网| 亚洲精品短视频| 精品久久在线播放| 亚洲欧美激情四射在线日| 亚洲国产精品va在线看黑人动漫| 欧美性69xxxx肥| 欧美成人亚洲成人日韩成人| 亚洲人午夜精品| 亚洲人成网站999久久久综合| 成人免费视频xnxx.com| 国自在线精品视频| 精品自在线视频| 欧美xxxx综合视频| 国产精品爱久久久久久久| 精品国偷自产在线| 国内精品一区二区三区| 亚洲va国产va天堂va久久| 日韩欧美精品中文字幕| 国产精品一区二区久久国产| 最近日韩中文字幕中文| 欧美超级乱淫片喷水| 亚洲精品乱码久久久久久按摩观| 欧美激情视频一区| 欧美国产日韩免费| 成人黄色免费在线观看| 成人综合国产精品| www.欧美三级电影.com| 久久网福利资源网站| 主播福利视频一区| 日韩精品免费观看| 国产精品第七十二页| 日本一区二区在线播放| 国产在线精品自拍| 亚洲一区二区三区成人在线视频精品| 91精品国产成人| 日韩免费不卡av| 国产成人综合精品在线| 在线观看久久久久久| 欧美在线www| 久久免费在线观看| 久久影院资源网| 欧美激情视频一区二区三区不卡| 神马久久久久久| 亚洲精品电影久久久| 精品国产一区二区三区在线观看| 国产精品尤物福利片在线观看| 欧美成人黄色小视频| 777午夜精品福利在线观看| 精品视频久久久久久久| 日韩精品免费综合视频在线播放| 另类色图亚洲色图| 亚洲成人1234| 日本a级片电影一区二区| 91影院在线免费观看视频| 成人国产精品日本在线| 97精品在线视频| 丁香五六月婷婷久久激情| 欧美裸身视频免费观看| 粉嫩老牛aⅴ一区二区三区| 日韩中文字幕在线播放| 久久久久久一区二区三区| 性色av一区二区三区在线观看| 国产精品久久久久一区二区| 久久韩剧网电视剧| 亚洲视频自拍偷拍| 波霸ol色综合久久| 欧美韩国理论所午夜片917电影| 亚洲免费视频观看| 午夜精品久久久久久久99热浪潮| 欧美日韩在线第一页| 国产一区二区精品丝袜| 国产日韩精品综合网站| 欧美极品第一页| 久久99青青精品免费观看| 国产亚洲精品一区二区| 国产精品免费看久久久香蕉| 日韩精品免费在线播放| 亚洲日本成人网| 精品亚洲男同gayvideo网站| 日韩精品高清视频| 国产日韩在线视频| 精品久久香蕉国产线看观看亚洲| 欧美电影免费观看高清完整| 日韩欧美视频一区二区三区| 久久精品亚洲94久久精品| 亚洲欧美色婷婷| 久久资源免费视频| 91免费版网站入口| 国产精品露脸av在线| 欧美性做爰毛片| 欧美xxxx做受欧美| 爽爽爽爽爽爽爽成人免费观看| 色偷偷av亚洲男人的天堂| 青青久久av北条麻妃海外网| 精品久久久久久中文字幕一区奶水| 国产精品偷伦免费视频观看的| 欧美日韩国产成人在线| 久久久综合免费视频| 久久久成人精品视频| 伦伦影院午夜日韩欧美限制| 国产ts一区二区| 欧美日韩xxx| 成人黄色片网站| 91理论片午午论夜理片久久| 国产欧美精品va在线观看| 成人在线小视频| 亚洲精品一区二区久| 欧美日韩免费在线观看| 高潮白浆女日韩av免费看| 亚洲欧美精品一区二区| 欧美裸体男粗大视频在线观看| 久热在线中文字幕色999舞| 国产热re99久久6国产精品| 精品伊人久久97| 成人午夜小视频| 亚洲亚裔videos黑人hd| 黑人精品xxx一区| 91免费精品视频| 亚洲美女又黄又爽在线观看| 久久影视电视剧免费网站| 午夜精品久久久久久久久久久久| 亚洲天堂成人在线| 亚洲国产精彩中文乱码av在线播放|