关于JavaScript中获取和设置Url参数的说明

在Web编程时,一般我们都只是在服务端获取请求的Url参数,但是在前端交互过程中我们也有可能希望通过JavaScript获取Url中的参数。
我们可以通过以下JavaScript方式获取和设置Url中的参数信息:

一、定义Url参数操作方法:

// 定义获取和设置Url参数的方法
(function (window, undefined) {
    // 定义获取Url参数方法
    if (typeof (window.getUrlParam) != "function") {
        /**
        * url:要获取参数的Url
        * key:要获取参数的键
        * return:返回获取到的参数值
        */
        window.getUrlParam = function (url, key) {
            // 定义默认值
            var value = "";
            // 定位到Url参数部分
            var index = url.indexOf("?");
            if (index >= 0) {
                // 获取Url中参数集合
                var params = url.substr(index + 1);
                params = params.split("&");
                // 遍历查询对应键值的参数
                for (var param in params) {
                    param = params[param];
                    index = param.indexOf("=");
                    // 获取对应键值的参数值
                    if (index >= 0 && key == param.substring(0, index)) {
                        value = param.substr(index + 1);
                    }
                }
            }
            // 返回获取到的参数值
            return value;
        };
    }
    // 定义设置Url参数方法
    if (typeof (window.setUrlParam) != "function") {
        /**
        * url:要设置参数的Url
        * key:要设置参数的键
        * value:要设置参数值
        * return:返回设置了参数的新Url
        */
        window.setUrlParam = function (url, key, value) {
            // 定位到Url参数部分
            var index = url.indexOf("?");
            if (index >= 0) {
                // 获取Url中参数集合
                var baseUrl = url.substring(0, index);
                var hasKey = false;
                var newParams = new Array();
                var oldParams = url.substr(index + 1);
                oldParams = oldParams.split("&");
                // 遍历Url中所有的参数
                for (var oldParam in oldParams) {
                    oldParam = oldParams[oldParam];
                    index = oldParam.indexOf("=");
                    if (index >= 0 && key == oldParam.substring(0, index)) {
                        // 将需要设置的参数重新赋值
                        newParams.push(key + "=" + value);
                        hasKey = true;
                    } else {
                        // 记录不需要设置的参数信息
                        newParams.push(oldParam);
                    }
                }
                // 没有找到参数的话添加新的参数
                if (!hasKey) {
                    newParams.push(key + "=" + value);
                }
                // 重构设置了参数的Url
                newParams = newParams.join("&");
                url = baseUrl + "?" + newParams;
            } else {
                // 重构设置了参数的Url
                url += "?" + key + "=" + value;
            }
            // 返回设置了参数的新Url
            return url;
        };
    }
})(window);

二、调用实例:

getUrlParam("index.php?a=1", "a"); // 结果:1
setUrlParam("index.php?a=1", "a", 2); // 结果:index.php?a=2

关于JavaScript中判断终端类型的说明

一、定义浏览器终端类型对象:

// 定义终端浏览器对象
(function (window, undefined) {
    // 获取userAgent对象
    var u = navigator.userAgent;
    // 获取终端浏览器对象
    var browser = window.browser || {};
    // 获取终端浏览器版本信息
    var versions = browser.versions || {
        // IE内核
        trident: u.indexOf("Trident") > -1,
        // Opera内核
        presto: u.indexOf("Presto") > -1,
        // 苹果、谷歌内核
        webKit: u.indexOf("AppleWebKit") > -1,
        // 火狐内核
        gecko: u.indexOf("Gecko") > -1 && u.indexOf("KHTML") == -1,
        // 是否为移动终端
        mobile: !!u.match(/AppleWebKit.*Mobile.*/),
        // IOS终端
        ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/),
        // Android终端或者UC浏览器
        android: u.indexOf("Android") > -1 || u.indexOf("Linux") > -1,
        // 是否为iPhone或者QQHD浏览器
        iPhone: u.indexOf("iPhone") > -1,
        // 是否iPad
        iPad: u.indexOf("iPad") > -1,
        // 是否Web应该程序,没有头部与底部
        webApp: u.indexOf("Safari") == -1,
        // 语言
        language: (u.browserLanguage || u.language).toLowerCase()
    };
    // 重新赋值终端浏览器版本信息
    browser.versions = versions;
    // 重新赋值终端浏览器对象
    window.browser = browser;
})(window);

可以通过以上定义的browser.versions对象判断是否为对应的终端。

二、判断是否为移动终端:

return browser.versions.mobile || browser.versions.ios || browser.versions.android || browser.versions.iPhone || browser.versions.iPad;

关于64位IIS中启用32位或64位应用程序的说明

64位的IIS中默认启用的是64位应用程序模式。
在IIS7及以上版本里我们可以通过应用程序池里各个应用程序的高级设置来管理应用程序运行的.NET Framework版本、是否启用32位应用程序和托管管道模式等设置:
iis-32bit-64bit-mode-1

但是在IIS6及以下版本里还没有这样的高级设置功能,因此我们只能通过IIS服务自带的基于命令行下的IIS管理脚本Adsutil.vbs来进行设置:

一、开启32位应用程序模式:

cscript %systemdrive%/inetpub/adminscripts/adsutil.vbs set w3svc/appPools/enable32bitapponwin64 1

二、关闭32位应用程序模式(启用默认的64位模式):

cscript %systemdrive%/inetpub/adminscripts/adsutil.vbs set w3svc/appPools/enable32bitapponwin64 0

三、注册32位ASP.NET版本:

C:/WINDOWS/Microsoft.NET/Framework/{version}/aspnet_regiis -i

其中{version}为ASP.NET版本目录,如:

C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/aspnet_regiis -i
C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/aspnet_regiis -i

四、注册64位ASP.NET版本:

C:/WINDOWS/Microsoft.NET/Framework64/{version}/aspnet_regiis -i

其中{version}为ASP.NET版本目录,如:

C:/WINDOWS/Microsoft.NET/Framework64/v2.0.50727/aspnet_regiis -i
C:/WINDOWS/Microsoft.NET/Framework64/v4.0.30319/aspnet_regiis -i

五、在Web服务扩展里允许或禁用对应的ASP.NET扩展:
iis-32bit-64bit-mode-2

更多信息请参阅:Using the Adsutil.vbs Administration Script (IIS 6.0)

关于JavaScript中判断滚动条到底部的说明

判断滚动条到底部,需要用到DOM的三个属性值,即scrollTop(滚动条在Y轴上的滚动距离)、clientHeight(内容可视区域的高度)、scrollHeight(容可视区域的高度加上溢出滚动的距离)。从这个三个属性可以看出来,滚动条到底部的条件即为:

scrollTop + clientHeight == scrollHeight

一、使用标准DOM方法:

// 定义滚动条判断方法
(function (window, undefined) {
    if (typeof (window.getScrollTop) != "function") {
        // 获取滚动条在Y轴上的滚动距离  
        window.getScrollTop = function () {
            var scrollTop = 0, bodyScrollTop = 0, documentScrollTop = 0;
            if (document.body) {
                bodyScrollTop = document.body.scrollTop;
            }
            if (document.documentElement) {
                documentScrollTop = document.documentElement.scrollTop;
            }
            scrollTop = (bodyScrollTop - documentScrollTop > 0) ? bodyScrollTop : documentScrollTop;
            return scrollTop;
        };
    }
    if (typeof (window.getScrollHeight) != "function") {
        // 获取文档的总高度 
        window.getScrollHeight = function () {
            var scrollHeight = 0, bodyScrollHeight = 0, documentScrollHeight = 0;
            if (document.body) {
                bodyScrollHeight = document.body.scrollHeight;
            }
            if (document.documentElement) {
                documentScrollHeight = document.documentElement.scrollHeight;
            }
            scrollHeight = (bodyScrollHeight - documentScrollHeight > 0) ? bodyScrollHeight : documentScrollHeight;
            return scrollHeight;
        };
    }
    if (typeof (window.getWindowHeight) != "function") {
        // 获取浏览器视口的高度 
        window.getWindowHeight = function () {
            var windowHeight = 0;
            if (document.compatMode == "CSS1Compat") {
                windowHeight = document.documentElement.clientHeight;
            } else {
                windowHeight = document.body.clientHeight;
            }
            return windowHeight;
        };
    }
})(window);

// 添加滚动事件
window.onscroll = function () {
    // 判断是否滚动条是否在底部
    if (getScrollTop() + getWindowHeight() == getScrollHeight()) {
        alert("滚动条在底部");
    }
};

二、使用jQuery框架方法:

// 定义jQuery对象
var $window = jQuery(window);
var $document = jQuery(document);
// 添加滚动事件
$window.scroll(function () {
    // 获取滚动条在Y轴上的滚动距离
    var scrollTop = $window.scrollTop();
    // 获取文档的总高度 
    var scrollHeight = $document.height();
    // 获取浏览器视口的高度 
    var windowHeight = $window.height();
    // 判断是否滚动条是否在底部
    if (scrollTop + windowHeight == scrollHeight) {
        alert("滚动条在底部");
    }
});

关于JavaScript中实现form和iframe异步文件上传的说明

在Web编程中,我们常常需要使用文件的上传功能。默认的普通文件上传功能是随form表单提交时执行上传的,表单提交的进程将伴随着文件上传进程。当需要上传的文件太大时,表单提交的时间将会大大增加,但是在表单提交期间我们又无法进行其他操作,因此异步文件上传就变成了Web编程中经常需要解决的问题。
下面介绍如何使用form结合ifame的方式实现简单的异步文件上传功能,其中关于HTML元素的操作使用了jQuery框架,当然有需要的也可以将这部分代码改写成标准DOM方式实现:

一、定义异步文件上传方法:

// 定义异步文件上传构造器
(function (window, jQuery, undefined) {
    // 判断异步文件上传构造器是否已经定义
    if (typeof (window.asyncUpload) == "function") {
        return;
    }
    /**
    * options:异步文件上传数据参数设置
    */
    window.asyncUpload = function (options) {
        if (!options) {
            options = {};
        }
        // 构造隐藏的form和iframe
        var name = new Date().getTime();
        var iframeName = "iframe_" + name;
        var formName = "form_" + name;
        var $div = jQuery("<div style='display: none'></div>").appendTo("body");
        var $iframe = jQuery("<iframe name='" + iframeName + "'></iframe>").appendTo($div);
        var $form = jQuery("<form name='" + formName + "' method='post' enctype='multipart/form-data' encoding='multipart/form-data'></form>");
        // 设置form提交到iframe中
        $form.attr("target", iframeName).attr("action", options.url).appendTo($div);
        // 剪切文件上传input到form中,并克隆新的文件上传input到原始位置
        if (options.files) {
            for (var key in options.files) {
                var $file = jQuery(options.files[key]);
                $file.clone(true).insertBefore($file);
                $file.appendTo($form).removeAttr("id");
            }
        }
        // 通过在form中创建隐藏的input来提交其他需要提交的数据
        if (options.params) {
            for (var key in options.params) {
                jQuery("<input type='hidden' name='" + key + "' />").appendTo($form).val(options.params[key]);
            }
        }
        // 绑定iframe的load事件
        $iframe.load(function () {
            // 触发上传完成响应事件
            if (typeof (options.callback) == "function") {
                var iframe = this;
                // 定义上传结果对象
                var data = {
                    responseText: "",
                    responseXML: ""
                };
                // 获取上传结果
                if (iframe.contentWindow) {
                    data.responseText = iframe.contentWindow.document.body ? iframe.contentWindow.document.body.innerHTML : null;
                    data.responseXML = iframe.contentWindow.document.XMLDocument ? iframe.contentWindow.document.XMLDocument : iframe.contentWindow.document;
                } else if (iframe.contentDocument) {
                    data.responseText = iframe.contentDocument.document.body ? iframe.contentDocument.document.body.innerHTML : null;
                    data.responseXML = iframe.contentDocument.document.XMLDocument ? iframe.contentDocument.document.XMLDocument : iframe.contentDocument.document;
                }
                // 根据数据类型构造上传完成响应事件参数
                var args = null;
                var dataType = jQuery.trim(options.dataType);
                if (dataType == "json") {
                    // 将json字符串构造成JavaScript对象
                    eval("args = " + data.responseText + ";");
                    args = [args];
                } else if (dataType == "xml") {
                    args = [data.responseXML];
                } else {
                    args = [data.responseText, data.responseXML];
                }
                // 回调上传完成响应事件
                options.callback.apply(iframe, args);
            }
            // 移除并释放临时数据
            $div.remove();
        });
        // 提交表单
        $form.submit();
    };
})(window, jQuery);

二、参数说明:
该异步文件上传方法需要options对象参数,其中包括:

url:string,必填,上传提交地址

files:array,必填,上传的文件数组,支持DOM对象、jQuery对象、jQuery选择器

params:object,可选,其他需要提交的数据

dataType:string,可选,上传完成后响应的结果数据类型,可选值有xml、json、html,默认为html

callback:function,可选,上传完成后响应事件,事件参数为响应结果,参数类型以options.dataType定义为准

三、调用示例:
定义需要进行文件上传的input元素,该元素可以在HTML文档中body元素下任意位置:

<input id="file" name="file" type="file" />

在JavaScript中调用异步文件上传方法:

// 绑定文件上传input的change事件,使用户选择文件后自动触发上传
jQuery("#file").change(function () {
    // 开始异步文件上传
    asyncUpload({
        // 上传提交地址
        url: "upload.php",
        // 上传的文件数组
        files: [jQuery("#file")],
        // 其他需要提交的数据
        params: {
            text: "file"
        },
        // 上传完成后响应的结果数据类型
        dataType: "html",
        // 上传完成后响应事件
        callback: function (html, xml) {
            alert(html);
        }
    });
});

上传文件提交地址的服务端可以使用基本的获取上传文件方法对上传上来的文件进行操作,最后返回相应的响应数据即可。