• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    asp.net客戶端回調功能的實現機制

    發布: 2007-9-07 19:42 | 作者: admin | 來源: 博客網
    在body快結束的時候還有一段這樣的代碼:
    WebForm_InitCallback();好,這些應該就是asp.net為了實現客戶端回調所作的補充工作了吧,咱們來研究吧。
    首先看js資源文件(20多K,汗一個...)。先在資源文件里面找到這個方法,WebForm_InitCallback();
    方法如下:
    1function WebForm_InitCallback() {
    2 var count = theForm.elements.length;
    3 var element;
    4 for (var i = 0; i < count; i++) {
    5 element = theForm.elements[i];
    6 var tagName = element.tagName.toLowerCase();
    7 if (tagName == "input") {
    8 var type = element.type;
    9 if ((type == "text"    type == "hidden"    type == "password"   
    10 ((type == "checkbox"    type == "radio") & element.checked)) &&
    11 (element.id != "__EVENTVALIDATION")) {
    12 WebForm_InitCallbackAddField(element.name, element.value);
    13 }
    14 }
    15 else if (tagName == "select") {
    16 var selectCount = element.options.length;
    17 for (var j = 0; j < selectCount; j++) {
    18 var selectChild = element.options[j];
    19 if (selectChild.selected == true) {
    20 WebForm_InitCallbackAddField(element.name, element.value);
    21 }
    22 }
    23 }
    24 else if (tagName == "textarea") {
    25 WebForm_InitCallbackAddField(element.name, element.value);
    26 }
    27 }
    28}這個方法就是把表單里面所有的值全部裝載到一個鍵值對里面去。
    附WebForm_InitCallbackAddField(element.name, element.value);方法實現:
    function WebForm_InitCallbackAddField(name, value) {
    var nameValue = new Object();
    nameValue.name = name;
    nameValue.value = value;
    __theFormPostCollection[__theFormPostCollection.length] = nameValue;
    __theFormPostData += name + "=" + WebForm_EncodeCallback(value) + "&";
    }
    function WebForm_EncodeCallback(parameter) {
    if (encodeURIComponent) {
    return encodeURIComponent(parameter);
    }
    else {
    return escape(parameter);
    }
    }
    那么就是asp.net在初始化客戶端回調功能的時候,其實就是將表單里面的所有鍵值對全部裝載到一個全局的鍵值對里面去了。

    然后,咱們來看看unction CallServer(arg, context){ WebForm_DoCallback('__Page',arg,ReceiveServerData,context,null,false);}所作的工作。
    在示例中,點擊按鈕,就觸發了CallServer方法,

    function LookUpStock()
    {
    var lb = document.getElementById("ListBox1");
    var product = lb.options[lb.selectedIndex].text;
    CallServer(product, "");
    }
    在資源文件中找到WebForm_DoCallback方法,由于方法太長太大,只有分段解析:
    unction WebForm_DoCallback(eventTarget, eventArgument, eventCallback, context, errorCallback, useAsync) {
    var postData = __theFormPostData +
    "__CALLBACKID=" + WebForm_EncodeCallback(eventTarget) +
    "&__CALLBACKPARAM=" + WebForm_EncodeCallback(eventArgument);
    if (theForm["__EVENTVALIDATION"]) {
    postData += "&__EVENTVALIDATION=" + WebForm_EncodeCallback(theForm["__EVENTVALIDATION"].value);
    }
    var xmlRequest,e;
    try {
    xmlRequest = new XMLHttpRequest();
    }
    catch(e) {
    try {
    xmlRequest = new ActiveXObject("Microsoft.XMLHTTP");
    }
    catch(e) {
    }
    }這段代碼是將一些參數附加上去到postData變量上。并創建xmlRequest對象。不過這個創建異步對象方法似乎有點不妥,他是先看是否是非IE的瀏覽器,然后被cacth住了才創建ActiveX對象,也就是說在IE大行其道的時候不得不多次catch,為什么不把創建ActiveX對象放在前面節省資源呢?不管這么多,接下來看:
    var setRequestHeaderMethodExists = true;
    try {
    setRequestHeaderMethodExists = (xmlRequest && xmlRequest.setRequestHeader);
    }
    catch(e) {}
    var callback = new Object();
    callback.eventCallback = eventCallback;
    callback.context = context;
    callback.errorCallback = errorCallback;
    callback.async = useAsync;
    var callbackIndex = WebForm_FillFirstAvailableSlot(__pendingCallbacks, callback);
    if (!useAsync) {
    if (__synchronousCallBackIndex != -1) {
    __pendingCallbacks[__synchronousCallBackIndex] = null;
    }
    __synchronousCallBackIndex = callbackIndex;
    }
    if (setRequestHeaderMethodExists) {
    xmlRequest.onreadystatechange = WebForm_CallbackComplete;
    callback.xmlRequest = xmlRequest;
    xmlRequest.open("POST", theForm.action, true);
    xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xmlRequest.send(postData);
    return;
    }這幾段語句最重要的是將異步回調方法賦值為:WebForm_CallbackComplete。

    不過俺們還忽略了一些細節,讓我們從頭再來。上面有一段代碼
    if (setRequestHeaderMethodExists)
    也就是說在setRequestHeaderMethodExists這個變量不為null的時候才能夠發送異步對象,那么這個變量是怎么定義的呢??
    var setRequestHeaderMethodExists = true;
    try {
    setRequestHeaderMethodExists = (xmlRequest && xmlRequest.setRequestHeader);
    }也就是說只有當正確的創建了xmlRequest對象后才能夠使用ajax,那么如果不能夠正確創建ajax對象怎么辦呢?接著看代碼!

    callback.xmlRequest = new Object();
    var callbackFrameID = "__CALLBACKFRAME" + callbackIndex;
    var xmlRequestFrame = document.frames[callbackFrameID];
    if (!xmlRequestFrame) {
    xmlRequestFrame = document.createElement("IFRAME");
    xmlRequestFrame.width = "1";
    xmlRequestFrame.height = "1";
    xmlRequestFrame.frameBorder = "0";
    xmlRequestFrame.id = callbackFrameID;
    xmlRequestFrame.name = callbackFrameID;
    xmlRequestFrame.style.position = "absolute";
    xmlRequestFrame.style.top = "-100px"
    xmlRequestFrame.style.left = "-100px";
    try {
    if (callBackFrameUrl) {
    xmlRequestFrame.src = callBackFrameUrl;
    }
    }
    catch(e) {}
    document.body.appendChild(xmlRequestFrame);
    }接下來原來是創建一個iframe!呵呵,原來是保證所有的瀏覽器都能使用ajax才出的這招。
    再下來應該就是給這個iframe里面加載一些變量了,并且提交這個iframe了:
    var interval = window.setInterval(function() {
    xmlRequestFrame = document.frames[callbackFrameID];
    if (xmlRequestFrame && xmlRequestFrame.document) {
    window.clearInterval(interval);
    xmlRequestFrame.document.write("");
    xmlRequestFrame.document.close();
    xmlRequestFrame.document.write('

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • ');
    xmlRequestFrame.document.close();
    xmlRequestFrame.document.forms[0].action = theForm.action;
    var count = __theFormPostCollection.length;
    var element;
    for (var i = 0; i < count; i++) {
    element = __theFormPostCollection[i];
    if (element) {
    var fieldElement = xmlRequestFrame.document.createElement("INPUT");
    fieldElement.type = "hidden";
    fieldElement.name = element.name;
    fieldElement.value = element.value;
    xmlRequestFrame.document.forms[0].appendChild(fieldElement);
    }
    }
    var callbackIdFieldElement = xmlRequestFrame.document.createElement("INPUT");
    callbackIdFieldElement.type = "hidden";
    callbackIdFieldElement.name = "__CALLBACKID";
    callbackIdFieldElement.value = eventTarget;
    xmlRequestFrame.document.forms[0].appendChild(callbackIdFieldElement);
    var callbackParamFieldElement = xmlRequestFrame.document.createElement("INPUT");
    callbackParamFieldElement.type = "hidden";
    callbackParamFieldElement.name = "__CALLBACKPARAM";
    callbackParamFieldElement.value = eventArgument;
    xmlRequestFrame.document.forms[0].appendChild(callbackParamFieldElement);
    if (theForm["__EVENTVALIDATION"]) {
    var callbackValidationFieldElement = xmlRequestFrame.document.createElement("INPUT");
    callbackValidationFieldElement.type = "hidden";
    callbackValidationFieldElement.name = "__EVENTVALIDATION";
    callbackValidationFieldElement.value = theForm["__EVENTVALIDATION"].value;
    xmlRequestFrame.document.forms[0].appendChild(callbackValidationFieldElement);
    }
    var callbackIndexFieldElement = xmlRequestFrame.document.createElement("INPUT");
    callbackIndexFieldElement.type = "hidden";
    callbackIndexFieldElement.name = "__CALLBACKINDEX";
    callbackIndexFieldElement.value = callbackIndex;
    xmlRequestFrame.document.forms[0].appendChild(callbackIndexFieldElement);
    xmlRequestFrame.document.forms[0].submit();
    }
    }, 10);
    }
    原來在最開始初始化客戶端回調的方法就是為了在不能夠正確創建ajax對象的時候,將表單的值全部初始化到另外的iframe里面去的。
    好了,整個asp.net客戶端回調的請求發送部分分析完了,看來回調部分要下次了。

    如果有分析不對的地方還請大俠指正!
    熱門推薦 最能提升工作效率的200個熱鍵 細數Windows操作系統的20條雞肋


    【責任編輯 彭凡】

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網