jQuery A
jax 全解析

http://www.cnblogs.com/qleelulu/archive/2008/04/21/1163021.html
jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯。

废话少说,直接进入正题,我们先来看一些简单的方法,这些方法都是对jQuery.ajax()进行封装以方便我们使用的方法,当然,如果要处理复杂的逻辑,还是需要用到jQuery.ajax()的(这个后面会说到).

1. load( url, [data], [callback] ) :载入远程 HTML 文件代码并插入至 DOM 中。

url (String) : 请求的HTML页的URL地址。

data (Map) : (可选参数) 发送至服务器的 key/value 数据。

callback (Callback) : (可选参数) 请求完成时(不需要是success的)的回调函数。

这个方法默认使用 GET 方式来传递的,如果[data]参数有传递数据进去,就会自动转换为POST方式的。jQuery 1.2 中,可以指定选择符,来筛选载入的 HTML 文档,DOM 中将仅插入筛选出的 HTML 代码。语法形如 “url #some > selector”。

这个方法可以很方便的动态加载一些HTML文件,例如表单。

示例代码:

这里将显示结果。

注:不知道为什么URL写绝对路径在FF下会出错,知道的麻烦告诉下。下面的get()和post()示例使用的是绝对路径,所以在FF下你将会出错并不会看到返回结果。还有get()和post()示例都是跨域调用的,发现传上来后没办法获取结果,所以把运行按钮去掉了。

2. jQuery.get( url, [data], [callback] ):使用GET方式来进行异步请求

参数:

url (String) : 发送请求的URL地址.

data (Map) : (可选) 要发送给服务器的数据,以 Key/value 的键值对形式表示,会做为QueryString附加到请求URL中。

callback (Function) : (可选) 载入成功时回调函数(只有当Response的返回状态是success才是调用该方法)。

这是一个简单的 GET 请求功能以取代复杂 $.ajax 。请求成功时可调用回调函数。如果需要在出错时执行函数,请使用 $.ajax。示例代码:

点击发送请求:

jQuery.get()回调函数里面的 this ,指向的是Ajax请求的选项配置信息:

3. jQuery.post( url, [data], [callback], [type] ) :使用POST方式来进行异步请求

参数:

url (String) : 发送请求的URL地址.

data (Map) : (可选) 要发送给服务器的数据,以 Key/value 的键值对形式表示。

callback (Function) : (可选) 载入成功时回调函数(只有当Response的返回状态是success才是调用该方法)。

type (String) : (可选)官方的说明是:Type of data to be sent。其实应该为客户端请求的类型(JSON,XML,等等)

这是一个简单的 POST 请求功能以取代复杂 $.ajax 。请求成功时可调用回调函数。如果需要在出错时执行函数,请使用 $.ajax。示例代码:

Ajax.aspx:

Response.ContentType = “application/json”;
Response.Write(“{result: ‘” + Request[“Name”] + “,你好!(这消息来自服务器)’}”);
jQuery 代码:
$.post(“Ajax.aspx”, { Action: “post”, Name: “lulu” },
function (data, textStatus){
// data 可以是 xmlDoc, jsonObj, html, text, 等等.
//this; // 这个Ajax请求的选项配置信息,请参考jQuery.get()说到的this
alert(data.result);
}, “json”);
点击提交:

这里设置了请求的格式为”json”:

image

如果你设置了请求的格式为”json”,此时你没有设置Response回来的ContentType 为:Response.ContentType = “application/json”; 那么你将无法捕捉到返回的数据。

注意一下,alert(data.result); 由于设置了Accept报头为“json”,这里返回的data就是一个对象,并不需要用eval()来转换为对象。

4. jQuery.getScript( url, [callback] ) : 通过 GET 方式请求载入并执行一个 JavaScript 文件。

参数
url (String) : 待载入 JS 文件地址。

callback (Function) : (可选) 成功载入后回调函数。

jQuery 1.2 版本之前,getScript 只能调用同域 JS 文件。 1.2中,您可以跨域调用 JavaScript 文件。注意:Safari 2 或更早的版本不能在全局作用域中同步执行脚本。如果通过 getScript 加入脚本,请加入延时函数。

这个方法可以用在例如当只有编辑器focus()的时候才去加载编辑器需要的JS文件.下面看一些示例代码:

加载并执行 test.js。
jQuery 代码:

$.getScript(“test.js”);

加载并执行 AjaxEvent.js ,成功后显示信息。

jQuery 代码:

$.getScript(“AjaxEvent.js”, function(){
alert(“AjaxEvent.js 加载完成并执行完成.你再点击上面的Get或Post按钮看看有什么不同?”);
});

加载完后请重新点击一下上面的 Load 请求看看有什么不同。

jQuery Ajax 事件

Ajax请求会产生若干不同的事件,我们可以订阅这些事件并在其中处理我们的逻辑。在jQuery这里有两种Ajax事件:局部事件 和 全局事件。

局部事件就是在每次的Ajax请求时在方法内定义的,例如:

$.ajax({
beforeSend: function(){
// Handle the beforeSend event
},
complete: function(){
// Handle the complete event
}
// …
});
全局事件是每次的Ajax请求都会触发的,它会向DOM中的所有元素广播,在上面 getScript() 示例中加载的脚本就是全局Ajax事件。全局事件可以如下定义:

$(“#loading”).bind(“ajaxSend”, function(){
$(this).show();
}).bind(“ajaxComplete”, function(){
$(this).hide();
});
或者:

$(“#loading”).ajaxStart(function(){
$(this).show();
});
我们可以在特定的请求将全局事件禁用,只要设置下 global 选项就可以了:

$.ajax({
url: “test.html”,
global: false,// 禁用全局Ajax事件.
// …
});
下面是jQuery官方给出的完整的Ajax事件列表:

ajaxStart (Global Event)
This event is broadcast if an Ajax request is started and no other Ajax requests are currently running.
beforeSend (Local Event)
This event, which is triggered before an Ajax request is started, allows you to modify the XMLHttpRequest object (setting additional headers, if need be.)
ajaxSend (Global Event)
This global event is also triggered before the request is run.
success (Local Event)
This event is only called if the request was successful (no errors from the server, no errors with the data).
ajaxSuccess (Global Event)
This event is also only called if the request was successful.
error (Local Event)
This event is only called if an error occurred with the request (you can never have both an error and a success callback with a request).
ajaxError (Global Event)
This global event behaves the same as the local error event.
complete (Local Event)
This event is called regardless of if the request was successful, or not. You will always receive a complete callback, even for synchronous requests.
ajaxComplete (Global Event)
This event behaves the same as the complete event and will be triggered every time an Ajax request finishes.
ajaxStop (Global Event)
This global event is triggered if there are no more Ajax requests being processed.
具体的全局事件请参考API文档。
好了,下面开始说jQuery里面功能最强的Ajax请求方法 $.ajax();

jQuery.ajax( options ) : 通过 HTTP 请求加载远程数据

这个是jQuery 的底层 AJAX 实现。简单易用的高层实现见 $.get, $.post 等。

$.ajax() 返回其创建的 XMLHttpRequest 对象。大多数情况下你无需直接操作该对象,但特殊情况下可用于手动终止请求。

注意: 如果你指定了 dataType 选项,请确保服务器返回正确的 MIME 信息,(如 xml 返回 “text/xml”)。错误的 MIME 类型可能导致不可预知的错误。见 Specifying the Data Type for AJAX Requests 。
当设置 datatype 类型为 ‘script’ 的时候,所有的远程(不在同一个域中)POST请求都回转换为GET方式。

$.ajax() 只有一个参数:参数 key/value 对象,包含各配置及回调函数信息。详细参数选项见下。

jQuery 1.2 中,您可以跨域加载 JSON 数据,使用时需将数据类型设置为 JSONP。使用 JSONP 形式调用函数时,如 “myurl?callback=?” jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。数据类型设置为 “jsonp” 时,jQuery 将自动调用回调函数。(这个我不是很懂)

参数列表:

参数名 类型 描述
url String (默认: 当前页地址) 发送请求的地址。
type String (默认: “GET”) 请求方式 (“POST” 或 “GET”), 默认为 “GET”。注意:其它 HTTP 请求方法,如 PUT 和 DELETE 也可以使用,但仅部分浏览器支持。
timeout Number 设置请求超时时间(毫秒)。此设置将覆盖全局设置。
async Boolean (默认: true) 默认设置下,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false。注意,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。
beforeSend Function 发送请求前可修改 XMLHttpRequest 对象的函数,如添加自定义 HTTP 头。XMLHttpRequest 对象是唯一的参数。
function (XMLHttpRequest) {
this; // the options for this ajax request
}
cache Boolean (默认: true) jQuery 1.2 新功能,设置为 false 将不会从浏览器缓存中加载请求信息。
complete Function 请求完成后回调函数 (请求成功或失败时均调用)。参数: XMLHttpRequest 对象,成功信息字符串。
function (XMLHttpRequest, textStatus) {
this; // the options for this ajax request
}
contentType String (默认: “application/x-www-form-urlencoded”) 发送信息至服务器时内容编码类型。默认值适合大多数应用场合。
data Object,
String 发送到服务器的数据。将自动转换为请求字符串格式。GET 请求中将附加在 URL 后。查看 processData 选项说明以禁止此自动转换。必须为 Key/Value 格式。如果为数组,jQuery 将自动为不同值对应同一个名称。如 {foo:[“bar1”, “bar2”]} 转换为 ‘&foo=bar1&foo=bar2’。
dataType String
预期服务器返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息返回 responseXML 或 responseText,并作为回调函数参数传递,可用值:

“xml”: 返回 XML 文档,可用 jQuery 处理。

“html”: 返回纯文本 HTML 信息;包含 script 元素。

“script”: 返回纯文本 JavaScript 代码。不会自动缓存结果。

“json”: 返回 JSON 数据 。

“jsonp”: JSONP 格式。使用 JSONP 形式调用函数时,如 “myurl?callback=?” jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。

error Function (默认: 自动判断 (xml 或 html)) 请求失败时将调用此方法。这个方法有三个参数:XMLHttpRequest 对象,错误信息,(可能)捕获的错误对象。
function (XMLHttpRequest, textStatus, errorThrown) {
// 通常情况下textStatus和errorThown只有其中一个有值
this; // the options for this ajax request
}
global Boolean (默认: true) 是否触发全局 AJAX 事件。设置为 false 将不会触发全局 AJAX 事件,如 ajaxStart 或 ajaxStop 。可用于控制不同的Ajax事件
ifModified Boolean (默认: false) 仅在服务器数据改变时获取新数据。使用 HTTP 包 Last-Modified 头信息判断。
processData Boolean (默认: true) 默认情况下,发送的数据将被转换为对象(技术上讲并非字符串) 以配合默认内容类型 “application/x-www-form-urlencoded”。如果要发送 DOM 树信息或其它不希望转换的信息,请设置为 false。
success Function 请求成功后回调函数。这个方法有两个参数:服务器返回数据,返回状态
function (data, textStatus) {
// data could be xmlDoc, jsonObj, html, text, etc…
this; // the options for this ajax request
}
这里有几个Ajax事件参数:beforeSend ,success ,complete ,error 。我们可以定义这些事件来很好的处理我们的每一次的Ajax请求。注意一下,这些Ajax事件里面的 this 都是指向Ajax请求的选项信息的(请参考说 get() 方法时的this的图片)。
请认真阅读上面的参数列表,如果你要用jQuery来进行Ajax开发,那么这些参数你都必需熟知的。

示例代码,获取博客园首页的文章题目:
$.ajax({
type: “get”,
url: “http://www.cnblogs.com/rss”,
beforeSend: function(XMLHttpRequest){
//ShowLoading();
},
success: function(data, textStatus){
$(“.ajax.ajaxResult”).html(“”);
$(“item”,data).each(function(i, domEle){
$(“.ajax.ajaxResult”).append(“

  • “+$(domEle).children(“title”).text()+”
  • “);
    });
    },
    complete: function(XMLHttpRequest, textStatus){
    //HideLoading();
    },
    error: function(){
    //请求出错处理
    }
    });

    这里将显示首页文章列表。

    其他

    jQuery.ajaxSetup( options ) : 设置全局 AJAX 默认选项。

    设置 AJAX 请求默认地址为 “/xmlhttp/”,禁止触发全局 AJAX 事件,用 POST 代替默认 GET 方法。其后的 AJAX 请求不再设置任何选项参数。

    jQuery 代码:

    $.ajaxSetup({
    url: “/xmlhttp/”,
    global: false,
    type: “POST”
    });
    $.ajax({ data: myData });

    serialize() 与 serializeArray()

    serialize() : 序列表表格内容为字符串。

    serializeArray() : 序列化表格元素 (类似 ‘.serialize()’ 方法) 返回 JSON 数据结构数据。

    示例:

    HTML代码:

    Results:



    check1
    check2
    radio1
    radio2

    image

    serializeArray() 结果为:

    一些资源

    一个jQuery的Ajax Form表单插件:http://www.malsup.com/jquery/form/

    一个专门生成Loading图片的站点:http://ajaxload.info/ 大家觉得那些Loading比较炫的可以在这里跟帖晒一下,方便大家取用,嘎嘎
    Python MySQLdb 查询返回字典结构

    MySQLdb默认查询结果都是返回tuple,输出时候不是很方便,必须按照0,1这样读取,无意中在网上找到简单的修改方法,就是传递一个cursors.DictCursor就行。

    默认程序:

    import MySQLdb
    db = MySQLdb.connect(host=’localhost’, user=’root’, passwd=’123456′, db=’test’)
    cur = db.cursor()
    cur.execute(‘select * from user’)
    rs = cur.fetchall()
    print rs
    # 返回类似如下
    # ((1000L, 0L), (2000L, 0L), (3000L, 0L))
    修改后:

    import MySQLdb
    import MySQLdb.cursors
    db = MySQLdb.connect(host=’localhost’, user=’root’, passwd=’123456′, db=’test’,
    cursorclass=MySQLdb.cursors.DictCursor)
    cur = db.cursor()
    cur.execute(‘select * from user’)
    rs = cur.fetchall()
    print rs
    # 返回类似如下
    # ({‘age’: 0L, ‘num’: 1000L}, {‘age’: 0L, ‘num’: 2000L}, {‘age’: 0L, ‘num’: 3000L})
    或者也可以用下面替换connect和cursor部分

    db = MySQLdb.connect(host=’localhost’, user=’root’, passwd=’123456′, db=’test’)
    cur = db.cursor(cursorclass=MySQLdb.cursors.DictCursor)

    Jquery基本用法总结(出处: http://www.skygq.com/2011/01/01/jquery%E5%9F%BA%E6%9C%AC%E7%94%A8%E6%B3%95%E6%80%BB%E7%BB%93/)
    发表于 2011 年 01 月 01 日 由 梦三秋
    这篇文章目的是为了让初学Jquery的或者接触过Jquery但是研究还不是很深的朋友能对Jquery的基本用法有个大致的了解。
    如果大家看了这篇文章,还能时常打开这篇文章,查找Jquery的一些基本用法,那这篇文章就算是写的成功了。

    好了,我们言归正传,下面教大家一些Jquery的一些基础用法。

    始终记住首先必需引入Jquery的主文件
    在写这篇文章的时候,Jquery的版本已经到了1.4.4了,相信Jquery肯定会越来越强大的。我们就期待着她的功能越发地健全吧。
    告诉大家一个东西,Jquery的主文件,不需要放在你的服务器上的,我们可以调用谷歌的在线Jquery文件,因为从google直接加载(调用)是一个很方便的办法,
    而且据传有缩短延迟,提高并行加载速度等好处。


    想要学习Jquery,API文档那是必须的:
    jQuery API 1.4.4中文版chm下载

    关于页面元素的引用
    “jQuery”之所以叫做“jQuery”,是因为她是“javascript query”的缩写,也就是因为她的强大的选择器。
    “$()”可引用的元素包括id、class、元素名、元素的层级关系、xpath条件或者dom对象,返回的对象为jquery对象(注意:这里的jQuery对象是集合对象,不能直接调用dom定义的方法。)
    Jquery对象和DOM对象之间的转换
    还记得有好长一段时间,我在想有没有把DOM对象转变成Jquery对象的方法(一直都是看jquery的API手册,在手册中未看到过关于DOM转jQuery对象的方法),如果有那简直太方便了。后来终于在某篇文章里发现了实现的方法。
    原来DOM转Jquery对象是如此之简单呀:
    $(DOM对象)这样就可以将DOM对象转变成Jquery对象了。举个例子:
    ?
    1
    2
    $(document.getElementById(‘test’))
    上面的代码相当于$(‘#test’);
    既然DOM对象转成Jquery对象如此之简单,那么jquery对象想转变成DOM对象的话,也应该困难不到哪里去吧~呵呵~~您猜对了。一样很简单。
    由于jquery对象本身是一个集合,所以jquery对象要转成DOM对象的话,那就必须取出其中的某一项。那么如何取出jquery对象中的某一项呢。下面来看代码:
    HTML代码:

    我是一个DIV
    我是DIV中的第一个span
    我是DIV中的第二个span
    我是class为‘demo’的span
    我同样也是class为‘demo’的span

    $(function(){
    $(“#test”)[0];//取得DIV的DOM对象
    $(“div”)[0];//同样是取得了DIV的DOM对象
    $(“span”).get(1);//取得了第二个span的DOM对象
    $(“.demo”).get(0);//取得了class为‘demo’的第一个span
    //上面的这些都是DOM对象了,不能再对其使用Jquery的方法了。
    })
    Jquery中的一些同时可以实现set和get的函数
    估计大家最熟悉的应该是“css”这个函数吧。jquery中有好多这样的函数

    $(“#test”).css(“color”);//返回id为test的元素节点的文字颜色值
    $(“#test”).css(“color”,”#ff0000″);//将id为test的元素节点的文字颜色值设定为红色
    $(“#test”).html();//返回id为test的元素节点的html内容。
    $(“#test”).html(“new content“);//将“new content” 作为html串写入id为test的元素节点内容中,页面显示粗体的new content
    $(“#test”).text();//返回id为test的元素节点的文本内容。
    $(“#test”).text(“new content“);//将“new content” 作为普通文本串写入id为test的元素节点内容中,页面显示new content
    $(“#test”).height();//返回id为test的元素的高度
    $(“#test”).height(“300”);//将id为test的元素的高度设为300
    $(“#test”).width();//返回id为test的元素的宽度
    $(“#test”).width(“300”);//将id为test的元素的宽度设为300
    $(“input”).val();//返回表单输入框的value值
    $(“input”).val(“test”);//将表单输入框的value值设为test
    $(“#test”).click();//触发id为test的元素的单击事件
    $(“#test”).click(fn);//为id为test的元素单击事件添加函数
    //…..这里还没列全,还有好多这样的,大家可以多看看jquery的API手册
    获取Jquery对象集合中的某一项
    Jquery提供了eq和get函数来获取集合中的某一项。需要注意的是,这两个方法都是通过索引号来取得的(索引是从0开始的)。这两个函数有个区别是eq返回的是jquery对象,而get返回的是DOM对象
    不同的对象调用不同的方法,jquery对象只能调用jquery的方法,DOM对象只能调用DOM的方法:

    $(“div”).eq(2).html();//调用jquery对象的方法
    $(“div”).get(2).innerHTML;//调用dom的方法属性
    关于jquery中的each的用法
    $().each(callback)
    以每一个匹配的元素作为上下文来执行一个函数。
    意味着,每次执行传递进来的函数时,函数中的this关键字都指向一个不同的DOM元素(每次都是一个不同的匹配元素)。而且,在每次执行函数时,都会给函数传递一个表示作为执行环境的元素在匹配的元素集合中所处位置的数字值作为参数(从零开始的整型)。 返回 ‘false’ 将停止循环 (就像在普通的循环中使用 ‘break’)。返回 ‘true’ 跳至下一个循环(就像在普通的循环中使用’continue’)。
    上面是API文档的解释。
    没理解的话给例子,呵呵:
    HTML代码:

    Jquery学习
    Jquery教程
    Jquery插件

    Jquery代码:

    $(function(){
    $(“div”).each(function(i){//这里的i是索引,从0开始的
    alert(“第”+i+”个DIV的内容是==>”+this.innerHTML);//这里的this是DOM对象哦
    $(this).css(“color”,”#ff0000″);
    })
    })
    $.each(obj, fn)
    通用例遍方法,可用于例遍对象和数组。
    不同于例遍 jQuery 对象的 $().each() 方法,此方法可用于例遍任何对象。回调函数拥有两个参数:第一个为对象的成员或数组的索引,第二个为对应变量或内容。如果需要退出 each 循环可使回调函数返回 false,其它返回值将被忽略。
    遍历一个数组:

    $(function(){
    $.each( [1,2,3], function(i, n){
    alert( “Item #” + i + “: ” + n );
    });
    })
    //结果为 Item #0: 1/Item #1: 2/Item #2: 3
    遍历一个对象,同时使用成员名称和变量内容。

    $(function(){
    $.each( { ch_name: “Jquery学习”, en_name: “Jquery Study” }, function(k, v){
    alert( “Name: ” + k + “, Value: ” + v );
    });
    })
    //结果为 Name: ch_name, Value: Jquery学习/Name: en_name, Value: Jquery Study
    扩展我们需要的功能

    $.extend({
    min: function(a, b){return a < b?a:b; }, max: function(a, b){return a > b?a:b; }
    });//为在jquery的命名空间中扩展了min,max两个方法
    //可以像下面这样使用
    var a = 10,b=20;
    var max = $.max(a,b);//20
    var min = $.min(a.b);//10
    Jquery支持链式写法
    这就是为什么Jquery的代码是如此的优雅的原因了。
    所谓链式写法,也就是可以一个Jquery对象连续使用不同的方法
    HTML代码:

    Jquery学习
    Jquery教程
    Jquery插件

    Jquery代码:

    $(function(){
    $(“div”).click(function(){alert($(this).html())})
    .mouseover(function(){alert(‘mouse over event’)})
    .each(function(i){this.style.color=[‘#f00′,’#0f0′,’#00f’][i]});
    });
    上面这段代码实现这样的功能,首先给每个div绑定了一个click事件,然后又绑定了一个鼠标移开的时候触发的事件,最后给每个div设定了不同的颜色

    关于插件内的this所指的对象

    ;(function($){
    $.fn.colortip = function(option){
    alert(this.html());//这里的this是jquery对象
    }
    })(jQuery);
    解决自定义方法或其他类库与jQuery的冲突
    有时候,我们在使用了其他的js类库如prototype等,其中也定义了$方法,
    如果同时把这些内容放在一起就会引起变量方法定义冲突,Jquery对此专门提供了方法用于解决此问题。
    使用jquery中的jQuery.noConflict();方法即可把变量$的控制权让渡给第一个实现它的那个库或之前自定义的$方法。之后应用Jquery的时候只要将所有的$换成jQuery即可,
    如原来引用对象方法$(“#test”)改为jQuery(“#test”)。
    如:

    jQuery.noConflict();
    // 开始使用jQuery
    jQuery(“div span”).hide();
    // 使用其他库的 $()
    $(“content”).style.display = ‘none’;

    Categories: 未分类

    12 Comments

    Frank · 06/28/2020 at 9:52 PM

    I always spent my half an hour to read this webpage’s posts all the time along with a mug of coffee.|

    Yelena · 06/28/2020 at 9:52 PM

    Does your website have a contact page? I’m having a tough time locating it but, I’d like to shoot you an email. I’ve got some ideas for your blog you might be interested in hearing. Either way, great website and I look forward to seeing it develop over time.|

    Sydney · 06/28/2020 at 9:52 PM

    Hi, yes this paragraph is in fact nice and I have learned lot of things from it regarding blogging. thanks.|

    Marco · 06/28/2020 at 9:52 PM

    Excellent weblog right here! Additionally your web site a lot up very fast! What host are you using? Can I am getting your affiliate hyperlink to your host? I want my website loaded up as quickly as yours lol|

    Gabriel · 07/03/2020 at 10:06 AM

    Amazing! Its truly awesome paragraph, I have got much clear idea about from this paragraph.|

    Barney · 07/03/2020 at 10:06 AM

    Great article! This is the kind of info that should be shared around the web. Disgrace on the seek engines for now not positioning this submit higher! Come on over and discuss with my site . Thank you =)|

    Edgar · 07/03/2020 at 10:06 AM

    Howdy are using WordPress for your site platform? I’m new to the blog world but I’m trying to get started and set up my own. Do you need any coding knowledge to make your own blog? Any help would be greatly appreciated!|

    Joel · 07/03/2020 at 10:06 AM

    you are actually a just right webmaster. The web site loading speed is amazing. It seems that you’re doing any distinctive trick. Also, The contents are masterwork. you have done a fantastic job in this subject!|

    Ronny · 07/07/2020 at 4:53 PM

    I blog quite often and I genuinely thank you for your content. Your article has really peaked my interest. I am going to take a note of your website and keep checking for new information about once a week. I subscribed to your Feed as well.|

    Jeramy · 07/07/2020 at 4:53 PM

    Hi to every one, the contents present at this web site are in fact amazing for people knowledge, well, keep up the good work fellows.|

    Mana · 07/07/2020 at 4:54 PM

    Thank you a bunch for sharing this with all of us you really know what you are speaking approximately! Bookmarked. Kindly additionally consult with my web site =). We will have a hyperlink alternate contract among us|

    Leave a Reply

    Avatar placeholder

    Your email address will not be published. Required fields are marked *