taconite-client.js
上传用户:shen332233
上传日期:2021-09-03
资源大小:7478k
文件大小:10k
源码类别:

Ajax

开发平台:

Java

  1. /**
  2.     @fileoverview
  3.     This JavaScript file represents the core browser-side functionality
  4.     supplied by Taconite. In general, the tools in this file wrap an instance
  5.     of XMLHttpRequest object and provide utility methods for gather data from
  6.     form elements to be sent to the server as par of an Ajax request.
  7. */
  8. /**
  9.     Constructor for the AjaxRequest class. 
  10.     <br><br>
  11.     Example:
  12.     <br><br>
  13.     var ajaxRequest = new AjaxRequest("YOUR_URL");
  14.     @class The AjaxRequest object wraps an instance of XMLHttpRequest and provides 
  15.     facilities for setting functions that are called before a request is made
  16.     and after a request returns. By default, AjaxRequest handles the server
  17.     response by simply calling eval(), passing to it the responseText from 
  18.     the XMLHttpRequestObject, of course assuming that the response was 
  19.     generated by Taconite on the server side and that running eval() will 
  20.     update the web page.<br><br>Example Usage:<br><br>var ajaxRequest = new AjaxRequest("YOUR_URL");
  21.     <br>ajaxRequest.addFormElements("form_element_id_attribute_value");
  22.     <br>ajaxRequest.sendRequest();
  23.     @constructor
  24.     @param {String} a String repesenting the URL to which the Ajax request
  25.     will be sent.
  26. */
  27. function AjaxRequest(url) {
  28.     /** @private */
  29.     var self = this;
  30.     /** @private */
  31.     var xmlHttp = createXMLHttpRequest();
  32.     
  33.     /** @private */
  34.     var queryString = "";
  35.     /** @private */
  36.     var requestURL = url;
  37.     /** @private */
  38.     var method = "GET";
  39.     /** @private */
  40.     var preRequest = null;
  41.     /** @private */
  42.     var postRequest = null;
  43.     /**
  44.         Return the instance of the XMLHttpRequest object wrapped by this object.
  45.         @return XMLHttpRequest
  46.     */
  47.     this.getXMLHttpRequestObject = function() {
  48.         return xmlHttp;
  49.     }
  50.     /**
  51.         Set the pre-request function. This function will be called prior to 
  52.         sending the Ajax request. The pre-request function is passed a reference
  53.         to this object.
  54.         @param {Function} The function to be called prior to sending the Ajax
  55.         request. The function is passed a refernce of this object.
  56.     */
  57.     this.setPreRequest = function(func) {
  58.         preRequest = func;
  59.     }
  60.     /**
  61.         Set the post-request function. This function will be called after the
  62.         response has been received and after eval() has been called using the 
  63.         XMLHttpRequest object's responseText. The post-request function is passed 
  64.         a reference to this object.
  65.         @param {Function} The function to be called after receiving the Ajax
  66.         response. The function is passed a refernce of this object.
  67.     */
  68.     this.setPostRequest = function(func) {
  69.         postRequest = func;
  70.     }
  71.     /**
  72.         Send the Ajax request using the POST method. Use with caution -- some
  73.         browsers do not support the POST method with the XMLHttpRequest object.
  74.     */
  75.     this.setUsePOST = function() {
  76.         method = "POST";
  77.     }
  78.     /**
  79.         Send the Ajax request using the GET method, where parameters are sent
  80.         as a query string appended to the URL. This is the default behavior.
  81.     */
  82.     this.setUseGET = function() {
  83.         method = "GET";
  84.     }
  85.     /**
  86.         Add all of the form elements under the specified form to the query
  87.         string to be sent to the server as part of the Ajax request. The values
  88.         are automatically encoded.
  89.         @param {String} formID, the value of the id attribute of the form from
  90.         which you wish to accumulate the form values.
  91.     */
  92.     this.addFormElements = function(formID) {
  93.         var formElements = document.getElementById(formID).elements;
  94.         var values = toQueryString(formElements);
  95.         accumulateQueryString(values);
  96.     }
  97.     /** @private */
  98.     function accumulateQueryString(newValues) {
  99.         if(queryString == "") {
  100.             queryString = newValues; 
  101.         }
  102.         else {
  103.             queryString = this.queryString + "&" +  newValues;
  104.         }
  105.     }
  106.     /**
  107.         Add the values of the named form elements to the query string to be
  108.         sent to the server as part of the Ajax request. This method takes any 
  109.         number of Strings representing the form elements for wish you wish to 
  110.         accumulate the values. The Strings must be the value of the element's 
  111.         name attribute.<br><br>For example, these are all valid uses:<br>
  112.         <br>ajaxRequest.addNamedFormElements("element-name-1");
  113.         <br>ajaxRequest.addNamedFormElements("element-name-1", "element-name-2", "element-name-3");
  114.     */
  115.     this.addNamedFormElements = function() {
  116.         var elementName = "";
  117.         var namedElements = null;
  118.         for(var i = 0; i < arguments.length; i++) {
  119.             elementName = arguments[i];
  120.             namedElements = document.getElementsByName(elementName);
  121.             elementValues = toQueryString(namedElements);
  122.             accumulateQueryString(elementValues);
  123.         }
  124.     }
  125.     /**
  126.         Add the values of the id'd form elements to the query string to be
  127.         sent to the server as part of the Ajax request. This method takes any 
  128.         number of Strings representing the ids of the form elements for wish you wish to 
  129.         accumulate the values. The Strings must be the value of the element's 
  130.         name attribute.<br><br>For example, these are all valid uses:<br>
  131.         <br>ajaxRequest.addFormElementsById("element-id-1");
  132.         <br>ajaxRequest.addFormElementsById("element-id-1", "element-id-2", "element-id-3");
  133.     */
  134.     this.addFormElementsById = function() {
  135.         var id = "";
  136.         var element = null;
  137.         var elements = new Array();
  138.         for(var h = 0; h < arguments.length; h++) {
  139.             element = document.getElementById(arguments[h]);
  140.             if(element != null) {
  141.                 elements[h] = element;
  142.             }
  143.         }
  144.         elementValues = toQueryString(elements);
  145.         accumulateQueryString(elementValues);
  146.     }
  147.     /**
  148.         Send the Ajax request.
  149.     */
  150.     this.sendRequest = function() {
  151.         if(preRequest) {
  152.             preRequest(self);
  153.         }
  154.         var obj = this;
  155.         xmlHttp.onreadystatechange = function () { handleStateChange(self) };
  156.         requestURL = requestURL + "?ts=" + new Date().getTime();
  157.         if(method == "GET") {
  158.             requestURL = requestURL + "&" + queryString;
  159.             xmlHttp.open(method, requestURL, true);
  160.             xmlHttp.send(null);
  161.         }
  162.         else {
  163.             xmlHttp.open(method, requestURL, true);
  164.             xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
  165.             xmlHttp.send(queryString);
  166.         }
  167.     }
  168.     handleStateChange = function(ajaxRequest) {
  169.         if(ajaxRequest.getXMLHttpRequestObject().readyState != 4) {
  170.             return;
  171.         }
  172.         if(ajaxRequest.getXMLHttpRequestObject().status == 200) {
  173.             var nodes = ajaxRequest.getXMLHttpRequestObject().responseXML.documentElement.childNodes;
  174.             var parser = null;
  175.             var parseInBrowser = "";
  176.             for(var i = 0; i < nodes.length; i++) {
  177.                 if(nodes[i].nodeType != 1) {
  178.                     continue;
  179.                 }
  180.                 parseInBrowser = nodes[i].getAttribute("parseInBrowser");
  181.                 if(parseInBrowser == "true") {
  182.                     parser = new XhtmlToDOMParser(nodes[i]);
  183.                     parser.startParsing();
  184.                     var js = parser.getJavaScript();
  185.                     eval(parser.getJavaScript());
  186.                 }
  187.                 else {
  188.                     eval(nodes[i].firstChild.nodeValue);
  189.                 }
  190.             }
  191.             if(postRequest) {
  192.                 postRequest(ajaxRequest);
  193.             }
  194.         
  195.         }
  196.     }
  197.     /** @private */
  198.     function toQueryString(elements) {
  199.         var node = null;
  200.         var qs = "";
  201.         var name = "";
  202.         var tempString = "";
  203.         for(var i = 0; i < elements.length; i++) {
  204.             tempString = "";
  205.             node = elements[i];
  206.             name = node.getAttribute("name");
  207.             if(node.tagName.toLowerCase() == "input") {
  208.                 if(node.type.toLowerCase() == "radio" || node.type.toLowerCase() == "checkbox") {
  209.                     if(node.checked) {
  210.                         tempString = name + "=" + node.value;
  211.                     }
  212.                 }
  213.                 if(node.type.toLowerCase() == "text" || node.type.toLowerCase() == "hidden") {
  214.                     tempString = name + "=" + encodeURIComponent(node.value);
  215.                 }
  216.             }
  217.             else if(node.tagName.toLowerCase() == "select") {
  218.                 tempString = getSelectedOptions(node);
  219.             }
  220.             else if(node.tagName.toLowerCase() == "textarea") {
  221.                 tempString = name + "=" + encodeURIComponent(node.value);
  222.             }
  223.             if(tempString != "") {
  224.                 if(qs == "") {
  225.                     qs = tempString;
  226.                 }
  227.                 else {
  228.                     qs = qs + "&" + tempString;
  229.                 }
  230.             }
  231.         }
  232.         return qs;
  233.     }
  234.     /** @private */
  235.     function getSelectedOptions(select) {
  236.         var options = select.options;
  237.         var option = null;
  238.         var qs = "";
  239.         var tempString = "";
  240.         for(var x = 0; x < options.length; x++) {
  241.             tempString = "";
  242.             option = options[x];
  243.             if(option.selected) {
  244.                 tempString = select.name + "=" + option.value;
  245.             }
  246.             if(tempString != "") {
  247.                 if(qs == "") {
  248.                     qs = tempString;
  249.                 }
  250.                 else {
  251.                     qs = qs + "&" + tempString;
  252.                 }
  253.             }
  254.         }
  255.         return qs;
  256.     }
  257. }
  258. /**
  259.     Create an instance of the XMLHttpRequest object, using the appropriate
  260.     method for the type of browser in which this script is running. For Internet
  261.     Explorer, it's an ActiveX object, for all others it's a native JavaScript
  262.     object.
  263.     @return an instance of the XMLHttpRequest object.
  264. */
  265. function createXMLHttpRequest() {
  266.     if (window.ActiveXObject) {
  267.         return new ActiveXObject("Microsoft.XMLHTTP");
  268.     }
  269.     else if (window.XMLHttpRequest) {
  270.         return new XMLHttpRequest();
  271.     }
  272. }