JavaScript跨域及解决方案

thbcm阅读(169)

1.什么是跨域

我们常常会在页面上使用 ajax 要求访问其他服务器的数据,此时,客户端会出现跨域问题.

跨域问题是由于 javascript 语言安全限制中的同源策略酿成的.

简单来讲,同源策略是指一段脚本只能读取来自同一来源的窗口和文档的属性,这里的同一来源指的是主机名、协议和端口号的组合.

例如:

2.实现原理

在 HTML DOM 中,Script 标签是可以跨域访问服务器上的数据的.因此,可以指定 script 的 src 属性为跨域的 url, 从而实现跨域访问.

例如:

这类访问方式是不行的.但是以下方式,却是可以的.

这里对返回的数据有个要求,即:服务器返回的数据不能是单纯的如{“Name”:”zhangsan”}

如果返回的是这个 json 字符串,我们是没有办法援用这个字符串的.所以,要求返回的值,务必是 var json={“Name”:”zhangsan”},或json({“Name”:”zhangsan”})

为了使程序不报错,我们务必还要建立个 json 函数.

3.解决方案

方案1

服务器端:

protected void Page_Load(object sender, EventArgs e)

{

    string result = “callback({“name”:”zhangsan”,”date”:”2012⑴2-03″})”;

    Response.Clear();

    Response.Write(result);

    Response.End();

}

客户端:

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> 
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head> 
<title></title> 
<script type=”text/javascript”> 
    var result = null; window.onload = function () { 
    var script = document.createElement(“script”); 
    script.type = “text/javascript”; 
    script.src = “http://192.168.0.101/ExampleBusinessApplication.Web/web2.aspx”; 
    var head = document.getElementsByTagName(“head”)[0]; 
    head.insertBefore(script, head.firstChild); }; 
    function callback(data) { result = data; } 
    function b_click() { alert(result.name); } 
</script> 
</head> 
<body> 
    <input type=”button” value=”click me!” onclick=”b_click();” /> 
</body> 
</html>

方案2,通过 jQuery 来完成

通过jquery的jsonp的方式.使用此方式,对服务器端有要求.

服务器端以下:

protected void Page_Load(object sender, EventArgs e)

{

   string callback = Request.QueryString[“jsoncallback”];

   string result = callback + “({“name”:”zhangsan”,”date”:”2012⑴2-03″})”;

   Response.Clear();

   Response.Write(result);

   Response.End();

}

客户端:

$.ajax({ async: false, url: “http://192.168.0.5/Web/web1.aspx”, type: “GET”, dataType: ‘jsonp’, 
//jsonp的值自定义,如果使用jsoncallback,那么服务器端,要返回一个 jsoncallback 的值对应的对象. jsonp: ‘jsoncallback’,
 //要传递的参数,没有传参时,也一定要写上 data: null, timeout: 5000, 
//返回Json类型 contentType: “application/json;utf⑻”, 
//服务器段返回的对象包括name,data属性. 
success: function (result) { alert(result.date); }, error: function (jqXHR, textStatus, errorThrown) { alert(textStatus); } });

实际上,在我们履行这段 js 时,js 向服务器发出了这样一个要求:

http://192.168.0.5/Web/web1.aspx?jsoncallback=jsonp1354505244726&_=1354505244742

而服务器也响应的返回了以下对象:

jsonp1354506338864({“name”:”zhangsan”,”date”:”2012⑴2-03″})

此时就实现了跨域范文数据的要求  

Java Instanceof关键字,你会用么?

thbcm阅读(164)

a instanceof A:关键字的作用就是判断类 A 的实例化对象能不能赋给对象 a,返回一个 boolean 类型的数据。推荐好课:Java微课Java进阶:Web开发实战

举例:

class A{

    public void eat() {

        System.out.println(“父类A吃饭”);

    }

}

class B extends A{

    public void eat() {

        System.out.println(“子类B吃饭”);

    }

}

class C extends A{

    public void eat() {

        System.out.println(“子类C吃饭”);

    }

}

public class Shiyan {

    public static void main(String[] args) {

    // TODO Auto-generated method stub

        A a=new B();//向上转型,将类B的实例化赋给类A的对象

        a.eat();//通过类A的对象去调用,类B的eat方法

        // a instanceof A 关键字的作用就是判断 类A的实例化对象能不能赋给对象a。

    C c=(C)a;//使用强制转换,将B类的实例化对象强制转成C的实例化对象。编译器可以编译,但是运行时会报转换异常的错误。

    a.eat();

}

未使用Instanceof关键字运行如下:

编译器报了类型转换异常

子类B吃饭

Exception in thread “main” java.lang.ClassCastException: class polymorphism.B cannot be cast to class polymorphism.C (polymorphism.B and polymorphism.C are in unnamed module of loader ‘app’)

 at polymorphism.Shiyan.main(Shiyan.java:28)

改进后使用关键字Instanceof代码:

此时使用关键字Instanceof,判断是否能转换成功

class A{

    public void eat() {

        System.out.println(“父类A吃饭”);

    }

}

class B extends A{

    public void eat() {

        System.out.println(“子类B吃饭”);

    }

}

class C extends A{

    public void eat() {

        System.out.println(“子类C吃饭”);

    }

}

public class Shiyan {

    public static void main(String[] args) {

    // TODO Auto-generated method stub

        A a=new B();//向上转型,将类B的实例化赋给类A的对象

        a.eat();//通过类A的对象去调用,类B的eat方法

        // a instanceof A 关键字的作用就是判断 类A的实例化对象能不能赋给对象a。

    boolean isturue=a instanceof C;

    System.out.println(isturue);

}

改进后运行结果:

子类B吃饭

false

如何用Java实现顺序表

thbcm阅读(194)

一、什么是顺序表?

顺序表就是按照顺序存储方式存储的线性表,该线性表的结点按照逻辑次序依次存放在计算机的一组连续的存储单元中。

由于顺序表是依次存放的,只要知道了该顺序表的首地址及每个数据元素所占用的存储长度,那么就很容易计算出任何一个数据元素(即数据结点)的位置。

二、顺序表的常见操作:

1、创建类和构造方法

public class MyArrayList {

    private int [] elem;

    private int usedSize;

    public MyArrayList(){

        this.elem = new int [10];

    }

    public MyArrayList(int capacity){

        this.elem = new int[capacity];

    }

 }

2、扩容

    public void resize(){

        this.elem = Arrays.copyOf(this.elem,2*this.elem.length);

    }

3、判断顺序表是否为满

      public boolean isFull(){

        if(this.usedSize == this.elem.length){

            return true;

        }

        return false;

    }

4、打印顺序表

    public void display() {

        for (int i = 0;i < usedSize; i++) {

            System.out.print(elem[i]+”  “);

        }

        System.out.println();

    }

5、在 pos 位置新增元素

    public void add(int pos, int data) {

        if(isFull()){

            System.out.println(“链表已满!”);

            resize();

        }

        if(pos < 0 || pos > this.usedSize){

            System.out.println(“插入位置不合法!”);

            return;

        }

        for (int i =  usedSize-1; i >= pos;i–) {

            elem[i+1] = elem[i];

        }

        elem[pos] = data;

        this.usedSize++;

    }

6、判断是否包含某个元素

    public boolean contains(int toFind) {

        for(int i = 0; i < usedSize;i++){

            if(elem[i] == toFind){

                return true;

            }

        }

        return false;

    }

7、查找某个元素对应的位置

    public int search(int toFind) {       

        for(int i = 0; i < usedSize;i++){

            if(elem[i] == toFind){

                return i;

            }

        }

        return -1;

    }

8、获取 pos 位置的元素

    public int getPos(int pos) {   

        if(pos < 0 || pos >= usedSize){

            System.out.println(“该pos位置不合法!”);

            return -1;

        }

        return elem[pos];

    }

9、给 pos 位置的元素修改为 value

    public void setPos(int pos, int value) {    

        if(pos < 0 || pos >= usedSize){

            System.out.println(“该pos位置不合法!”);

            return;

        }

        elem[pos] = value;

    }

10、删除第一次出现的关键字 Key

    public void remove(int toRemove) {    

        int index = -1;

        for(int i = 0; i < this.usedSize;i++){

            if(this.elem[i] == toRemove){

                index = i;

            }

        }

        if(index == -1){

            System.out.println(“未找到该元素!”);

            return;

        }

        for(int j = index;j < this.usedSize-1;j++){

            this.elem[j] = this.elem[j+1];

        }

        this.usedSize–;

    }

11、获取链表长度

    public int size() {    

        return this.usedSize;

    }

12、清空顺序表

      public void clear() {

        this.usedSize = 0;

    }

jquery源码探索之—-事件系统Events

thbcm阅读(192)

学习 jquery 的深入,发现 jquery 内部确切之优美,之前从没觉得 jquery 是做网站必须的,但是现在看来,想做一个漏洞很少的网页, jquery 是一个利器。

最近看 jquery 源码看了很多,主要是看了一些底层支持模块,也大概知道 jquery 内部的原理是什么了,虽然记不到可能记不到很多 API,但是那不重要,看到官网的 API,闭着眼睛也知道它是干什么的了。

今天就来讲说我认为 jquery 内部最复杂的模块之一,事件系统。这个模块一篇两篇应当是讲不完的了,那就一步一步跟我来梳理吧!

还是像平常一样,上个图先:

视察者模式之前就说过了吧,jquery 事件系统也是利用了视察者模式,在介绍之前,我们先来看看什么是 jquery 的数据缓存系统。

为何要使用 jquery 的事件系统?

(1)jquery 数据缓存系统

有些时候,我们需要给 js 对象或 DOM 对象附加一些数据,为 js 对象附加数据就不说了,直接可以 object.data={},但是要给 DOM 元素附加数据时就要注意了。比以下面这类情况:

$(document).ready(function() { 
var button = document.getElementById(‘button⑴’); 
button.onclick = function() { 
console.log(‘hello’); return false; 
}; 
});

上面这类情势的写法相信大家是常常这样写的,我之前也是的,但是这类有什么坏处么,在非IE阅读器中是没什么问题,但是在古老的IE 浏览器中写上上面这句话,问题就来了:

IE 的 dom 元素的垃圾回收机制是援用计数的方式,至于援用计数是什么方式,大家可以百度一下,这要是再展开,那就要说很久很久了。循环援用就出现了,只要循环援用一出现,就会造成内存泄漏。这里是怎样造成循环援用的呢?

很明显的看到,在闭包环境内,造成了循环援用,那怎样样来解决这个问题呢?那肯定就是数据缓存系统了。

怎样样避免这类循环情况?我们只需要破坏一条援用指针就能够了。那究竟是破坏哪一条呢?

function 作用域链援用外面 button 这条指针明显是不好破坏的,由于这里常常是开发者最容易写的,那就破坏 button.click 指向匿名函数这条了。

那怎样破坏这条路径呢?

我们来看看 jquery 的事件缓存系统是怎样做的:

在 jquery 当中,并没有直接援用对象,而是给 dom 元素设置了一个属性 jquery12123213为1,1 为基本数据类型,所以不存在循环援用,但是这个1却能跟 $.cache 当中的属性1相对应,那么根据这个一就可以找到对应的事件处理函数 fn,是否是觉得很奇妙,我也是这么认为的。

Ext JS 6有什么新东西?

thbcm阅读(257)

工具包(ToolKits)

Ext JS 6最大的变化就是将 Ext JS 和 Touch 合并为一个单一的框架。之前的框架的核心(数据、控制器、模型等等)已被调和为一个单一的公共平台。这样,数据和逻辑就可以同享,从而帮助开发人员进一步去优化他们的利用程序。

那些具有独特功能的东西将会被分解为两个绝然不同的两个工具包:古典(Classic)和现代(Modern)。这些工具包通过 Ext JS 和Touch 的视图层来进行划分的。那些同享核心资源和逻辑,并使用这两种工具包的利用程序被称为通用(Universal)利用程序。

在使用 Cmd 生成利用程序的时候,需要选择利用程序的工具包,这个可通过简单调剂利用程序的 app.json 来实现,以下所示:

“toolkit”: “classic”, // or “modern”

发布

由于框架结合为了单一实体,SDK 的结构不能不根据 classic、modern 和 common 这3个区域进行重组。

一样,生成和示例文件夹也包括 classic 和 modern 这两个子目录:

ext-all.js 这个文件在 build 文件夹中仍然存在。而 ext-modern.js 就相当于使用 sencha-touch.js。二者使用的是共同的核心。

在当前版本中,示例 kitchensink 就是所谓的通用利用程序,一个单一的结合了经典和现代两个生成配置的利用程序。

包的命名

对各种不同包中的前缀“ext-”和“sencha-”已被删除。这些前缀当初主要是用来辨别 Sencha Touch、Ext JS 和公共库的。而现在,他们不再需要进行这类辨别了,所有这些代码都已包括到了 Ext JS 中。这意味着“sencha-charts”现在应为“charts”,而“ext-theme-neptune”则为“theme-neptune”。

正如你所想的哪样,要从 Ext JS 5 升级到 Ext JS 6,就需要在 app.json 文件中调剂包的援用名称。

Fashion

Fashion 是 Sencha 推出的新的 SASS 编译器,用于创建利用程序主题。它是使用 Javascript 编写的,可在阅读器中运行。结合PhantomJS 后,在 Sencha Cmd 中使用 Fashion 来创建 SASS 比 app watch 要好。这意味着 Ruby 不再是系统所需的!由于 Fashion 是运行在阅读器的,因此能将 SASS 的构建减少到两次(一次是进行切片(slicer),一次是最小化所需内容)。更重要的是,可以通过 app watch 迅速的以增量方式重建 SASS,这给开发人员带来了实实在在的好处。

对 app watch,使用Fashion还有一个更大的好处:在线更新!在(现代)阅读器中打开有一个利用程序并加载SASS文件来代替生成的CSS。Fashion 不必刷新页面便可更改并编译 SASS,并更新 CSS。

如果要启用在西安更新,可将“?platformTags=fashion:true”添加到 URL。

由于不再使用 Ruby,因此依赖 Ruby 代码的 Compass 功能将不能再使用。这就不能不使用 JavaScript 来创建。我们将会尽快编写如作甚 Fashion 编写自定义 JavaScript 扩大的文档。有一些 Compass 中的SASS代码已迁移到了 Fashion,因此其实不是所有的Compass 功能都会遭到利用。总的来讲,如果不使用自定义的 Compass 功能,就不会体会到之间的差别。

重要的是,在线更新只有在页面视图是运行在 Cmd Web server 的时候才会工作。在 Ext JS 的 classic 工具包中,一些 Sass 的修改可能需要一个布局或全部页面重新加载。对 modern 工具包来讲,很少会有这样的问题,由于它很大程度上是基于 CSS 的,且更能适应积极的变化。

图表

图表包中最大的变化是在 3D饼图中,它现在支持标签和可配置的 3D方面。在图表 kitchensink 中可以查看到这些示例。

ItemEdit插件

另外一个最大最新的功能是itemEdit插件,它运行用户通过拖动标记去修改图表值。可通过查看Kitchen Sink中Scatter Chart的自定义图标示例来查看itemEdit插件的行动。

序列标签、条码和提示信息的 renderer 现在支持通过 ViewController 的方法来命名(声明式渲染)。轴标签的 renderer 也行将到来。

值得注意的是,Ext JS 6 已抛弃旧的 ext-charts 包。任何使用 ext-charts 的都需要重构利用程序以使用 sencha-charts 包。

网格
电子表格

在 Ext JS 5.1 中引入的电子表格模型现在有了一些使人惊叹的新功能。选择现在可通过设置 extensible 为 true 来设置为可扩大的,这样,便可拖动右下角的拖动角唆使器来添加选择,从而对当前所选内容沿垂直方向或水平方向进行扩大。

这通常会结合使用当前选择的插件来复制值到扩大区域,就像在一个典型的电子表格中所期望的哪样。

可操作模式(Actionable Mode)和可访问性

网格还支持ARIA的“可操作模式”,该模式是原始单元格编辑模式的延伸。这将允许所有类型的单元格内容能够通过键盘获得焦点或激活。这是对可访问性的巨大进步,这对超级用户来讲,就能够无需鼠标就可以导航到网格中的任何地方。

LazyItems插件

该插件可延迟子组件的渲染,直到显现的时候再进行渲染,从而下降子组件的实例化和初始化的履行本钱。

例如,在标签面板中设置 deferredRender 为 true,未显现的标签就不会对它的后代组件进行实例化和初始化,从而减少开消,直到标签被激活的时候才会进行渲染。

屏幕浏览器支持(可访问性)

ARIA 功能已直接到了组件的生命周期,这意味着不再需要指定 aria 包来获得正确的 ARIA 行动了。利用程序现在支持屏幕浏览器(类似JAWS)而无需指定援用。

微加载(Microloader)

Sencha Cmd 6现在资源方面包括了本地存储缓存,这类似于 Sencha Touch 的产品的微加载。虽然如此,还是有一些重要的改进:

缓存能在 app.json 中禁用

只有通过微加载方式加载的内容才不会被删除

只有利用程序确当前版本才可保持在本地存储

这些改进解决了当前 Touch 微加载所报告的问题。主要的是,它会在超越空间的时候积极的删除本地存储的内容。这问题经常产生是由于保存了没必要要的旧版本利用程序,这让完全删除成为终究选择。

Touch网格

Touch 网格不再是一个独立的 Cmd 包,它现在已默许成为 modern 工具包的一部份。

ES6 的知识点还等待你的学习:

Python—-初识pandas

thbcm阅读(247)

前言

pandas 是基于 Numpy 的一种工具,该工具是为解决数据分析任务而创建的,pandas 纳入了大量库和一些标准的数据模型,提供了高效的操作大型数据集所需要的的工具,pandas 提供了大量能使我们快速便捷地处理数据的函数和方法。 推荐好课:Pandas 中文教程Python3进阶:数据分析及可视化

一、pandas 操作流程

  1. 表格数据的增删改查;
  2. 实现多表格处理;
  3. 数据清洗操作:缺失值,重复值,异常值,数据标准化,数据转换操作;
  4. 实现 excel 的特殊操作,生成透视表,交叉表;
  5. 完成统计分析。

二、pandas 的创建

1、导入 pandas 库

import pandas as pd

2、表结构数据,构建 Dataframe

columns:列索引 index:行索引 values:元素数据

方式一:

df = pd.DataFrame(

    data=[[‘alex’, 20, ‘男’,’0831′],[‘tom’, 30, ‘女’, ‘0830’],],

    index=[‘a’,’b’],   # 可以不写,默认从0开始,也可以直接指定字符进行排序

    columns=[‘name’, ‘age’, ‘sex’, ‘class’],

)    # 构建方法

print(df)   # 打印数据

   name  age sex class 
a  alex   20   男  0831 
b   tom   30   女  0830

方式二:

df1 = pd.DataFrame(data={‘name’:[‘tom’, ‘alex’], ‘age’:[18,20], ‘sex’:[‘男’,’女’], ‘class’:[‘0831′,’0831’]})

print(df)   # 打印数据,没有指定index字符排序时,默认从0开始排序

   name  age sex class 
0  alex   20   男  0831 
1   tom   30   女  0830

3、dataframe 的属性

因为 pandas 基于 numpy,因此,numpy 的 ndarray 的属性,dataframe 也同样具有。

  • df.shape        # 结构
  • df.ndim         # 维度
  • df.size           # 数量
  • df.dtypes      # 元素的数据类型
  • df.columns   # 列索引
  • df.index        # 行索引
  • df.values       # 元素

三、df 的查找

1、索引某一列值

df1[‘name’] 一维的切法,返回的是 series

print(df1[‘name’])  # 切一列值的方法

0     tom
1    alex

2、切多列值的方法

print(df1[[‘name’, ‘age’]]) 

   name  age

0   tom   18

1  alex   20

print(type(df1[[‘name’, ‘age’]]))    # series 是一维的类型,只有一个轴

<class ‘pandas.core.series.Series’>

3、索引切的方法

方法一:

print(df[[‘name’, ‘age’]][:2])    # 不能指定行进行索引

   name  age

a  alex   20

b   tom   30

方法二:

索引切的方法: df.loc[行索引名称、条件, 列的索引名称]

print(df.loc[‘a’, ‘name’]) 

alex

df.loc[‘a’, [‘name’]]     # <class ‘pandas.core.series.Series’>  行或者列,只要有一个为字符串,是一维

df.loc[[‘a’], [‘name’]]   # <class ‘pandas.core.frame.DataFrame’> 行或者列,两个参数都为列表,是二维

4、条件索引: bool 切片

mask = df[‘age’]>18  # 返回所有大于18岁的同学,返回True, False

mask2 = df[‘sex’] == ‘女’  # 返回所有女的同学

mask3 = mask & mask2    # 将两个mask进行结合,不能使用and,只能使用 & 逻辑与

print(mask3)

a    False

b     True

dtype: bool

print(df.loc[mask3, :])  # 利用mask,对数据进行切片

  name  age sex class

b  tom   30   女  0830

5、索引查询: iloc 【行的索引, 列的索引】 # 前闭后开

print(df.iloc[:1, :])

   name  age sex class

a  alex   20   男  0831

四、df增加方法

1、键值对添加列

# df[‘address’] = [‘北京’, ‘上海’]  两种方式,一一对应, 直接等于‘北京’,则所有数据都会变成北京

df[‘address’] = ‘北京’

    name  age sex class address

a   alex   20   男  0831      北京

b    tom   30   女  0830      北京

2、append 增加行

df_mini = pd.DataFrame(data = {

        ‘name’:[‘jerry’, ‘make’],

        ‘age’:[15, 18],

        ‘sex’:[‘男’, ‘女’],

        ‘class’:[‘0831’, ‘0770’],

        ‘address’:[‘北京’, ‘河南’]

    }, index = [‘a’, ‘b’])

df4 = df.append(df_mini)

print(df4)

a   alex   20   男  0831      北京

b    tom   30   女  0830      北京

a  jerry   15   男  0831      北京

b   make   18   女  0770      河南

五、删除方法

axis  : 删除的行或者列

inplace:是否修改原始表

a = df4.drop(labels=[‘address’, ‘class’], axis=1)  # 删除列 需要使用一个变量接受

df4.drop(labels=[‘a’], axis=0, inplace=True)

六、修改

切出指定数据,再进行赋值修改

c = df4.loc[df4[‘name’] == ‘tom’, ‘class’]  = ‘有问题’

print(c)

    name  age sex class address

a   alex   20   男  0831      北京

b    tom   30   女   有问题      北京

a  jerry   15   男  0831      北京

b   make   18   女  0770      河南

七、统计分析

1、延用了 Numpy 中的 10 个统计方法

min()     argmin()     max()      argmax()     std()      vat()     sum()      mean()     cumsum()      cumprod()

2、pandas 中的方法

df[‘age’].min()     df[‘age’].max()     df[‘age’].argsort()

3、众数、非空元素、频数

df[‘age’].mode()

a    grade

b    grade

dtype: object

df[‘age’].count()

tom      1

make     1

alex     1

jerry    1

Name: name, dtype: int64

df[‘age’].value_counts()

name       alex

age          20

sex           女

class      0830

address      北京

dtype: object

4、针对 df 类型

df[‘age’].idxmax(axis=1)    # 横向比较

df[‘age’].idxmax(axis=0)    # 纵向比较

    name  age  sex class address

0   alex   15    女  0831      北京

1  jerry   18    男   NaN     NaN

2   make   20  NaN   NaN     NaN

3    tom   30  NaN   NaN     NaN

5、描述 describe

df[‘age’].describe()

#          age

# count   4.00  非空数目

# mean   20.75   平均值

# std     6.50   标准差

# min    15.00   最小

# 25%    17.25   1/4

# 50%    19.00   2/4

# 75%    22.50   3/4

# max    30.00   最大

df[‘name’].describe()

# count : 非空数目

# unique: 去重之后有几个值

# top: 众数

# freq: 众数出现的频数

八、Excel 文件的读取

pandas 可以读取多种数据类型,这里介绍下读取 excel 数据的操作方法

pd.read_excel(r’文件路径’)

CSS布局基础汇总

thbcm阅读(237)

常见布局种类

一列布局

  • 自上而下的,一般头部进行固定宽度,高度设置为自动

两列布局

  • 自适应的两列布局:width 用百分比+float;
  • 固定宽度的两列布局:width:具体值/父级元素的宽度肯定,width+百分比;+float;如果没有加 float 的话,不能实现并排的两列布局。

三列布局

  • 传统的三列布局依托于 float 实现
  • 特殊的三列布局:左右固定,中间自适应情况,左右使用绝对定位来实现,中间用 margin 实现三列布局:左边和右边固定,中间自适应:

CSS中的定位机制

  1. 标准文档流
  2. 浮动
  3. 绝对定位

网页简单布局之结构与表现的原则

  • 最大化的简化 html 的结构,然后用 css 进行设置,减少 html 与 css 的契合度
  • 不应当为了样式而添加无意义的标签
  • 结构与表现分离,结构简洁,构建结构不斟酌布局样式

CSS元素隐藏

{ display: none; /* 不占据空间,没法点击 */ } 

{ visibility: hidden; /* 占据空间,没法点击 */ } 
{ position: absolute; clip:rect(1px 1px 1px 1px); /* 不占据空间,没法点击 */ } 
{ position: absolute; top: -999em; /* 不占据空间,没法点击 */ } 
{ position: relative; top: -999em; /* 占据空间,没法点击 */ } 
{ position: absolute; visibility: hidden; /* 不占据空间,没法点击 */ } 
{ height: 0; overflow: hidden; /* 不占据空间,没法点击 */ } 
{ opacity: 0; filter:Alpha(opacity=0); /* 占据空间,可以点击 */ } 
{ position: absolute; opacity: 0; filter:Alpha(opacity=0); /* 不占据空间,可以点击 */ }

CSS中清除浮动最优方法

在父级添加 overflow:hidden

优点:不存在结构和语义化问题,代码量极少

缺点:内容增多时候容易造成不会自动换行致使内容被隐藏掉,没法显示需要溢出的元素

父元素也设置浮动(加个float:left/right)

优点:不存在结构和语义化问题,代码量极少

缺点:使得与父元素相邻的元素的布局会遭到影响,不可能一直浮动到 body,不推荐使用

父元素设置 display:table

优点:结构语义化完全正确,代码量极少

缺点:盒模型属性已改变,由此酿成的一系列问题,得不偿失,不推荐使用

使用 :after 伪元素

优点:需要注意的是 :after 是伪元素,不是伪类(某些CSS手册里面称之为“伪对象”),很多清除浮动大全之类的文章都称之为伪类,不过 csser 要严谨一点,这是一种态度。

由于IE6⑺不支持:after,使用 zoom: 触发 hasLayout。

缺点:兼容性不是很好。

在浮动的元素后面添加空标签

清除浮动

优点:简单明了

缺点:无意义的空标签,不利于语义化

DIV+CSS规范命名集合

命名规范说明:

所有的命名最好都小写

每一个标签都要有开始和结束,且要有正确的层次,排版有规律工整

空元素要有结束的 tag 或于开始的 tag 后加上”/”
表现与结构完全分离,代码中不触及任何的表现元素,如 style、font、bgColor、borde r等
定义,应遵守从大到小的原则,体现文档的结构,并有益于搜索引擎的查询。
给每个表格和表单加上一个唯一的、结构标记 id
给图片加上alt标签
尽可能使用英文命名原则
尽可能不缩写,除非一看就明白的单词

DIV+CSS命名参考表

CSS 样式命名 说明 CSS 文件命名 说明
wrapper 页面外围控制整体布局宽度 master.css,style.css 主要的
container或#content 容器,用于最外层 module.css 模块
layout 布局 base.css 基本公用
head,#header 页头部份 layout.css 布局,版面
foot,#footer 页脚部份 themes.css 主题
nav 主导航 columns.css 专栏
subnav 二级导航 font.css 文字、字体
menu 菜单 forms.css 表单
submenu 子菜单 mend.css 补钉
sideBar 侧栏 print.css 打印
sidebar_a,#sidebar_b 左侧栏或右侧栏 main 页面主体
msg#message 提示信息 tips 小技能
vote 投票 friendlink 友谊连接
title 标题 summary 摘要
loginbar 登录条 searchInput 搜索输入框
hot 热门热门 search 搜索
search_output 搜索输出和搜索结果类似 searchBar 搜索条
search_results 搜索结果 copyright 版权信息
branding 商标 logo 网站 LOGO 标志
siteinfo 网站信息 siteinfoLegal 法律声明
siteinfoCredits 信誉 .tab 标签页
joinus 加入我们 partner 合作火伴
service 服务 regsiter 注册
arr/arrow 箭头 guild 指南
sitemap 网站地图 list 列表
homepage 首页 subpage 2级页面子页面
tool,#toolbar 工具条 drop 下拉
dorpmenu 下拉菜单 tag 标签
status 状态 scroll 转动
.left.right.center 居左、中、右 .news 新闻
.download 下载 .banner 广告条(顶部广告条)

导入样式及脚本传统方式

援用线上CDN

<script type=”text/javascript” href=”xxx/xxx.js”> 这是援用 JS 文件

<script type=”text/css” href=”xxx/xxx.css”>这是援用 CSS 文件

援用本地文件

<script type=”text/javascript” src=”http://www.wfuyu.com/uploadfile/cj/20150502/xxx/xxx.js”> 这是援用JS文件

<script type=”text/css” src=”http://www.wfuyu.com/uploadfile/cj/20150502/xxx/xxx.css”>这是援用CSS文件

新规范

根据 HTMl5 规范,在 引入 CSS 和 JavaScript 文件时一般不需要指定

Python数据分析—-NumPy库常用用法总结

thbcm阅读(252)

前言

在没给大家介绍 numpy 之前先给大家说下 Python 的基本概念。

Python 是一种高级的,动态的,多泛型的编程语言。Python 代码很多时候看起来就像是伪代码一样,因此你可以使用很少的几行可读性很高的代码来实现一个非常强大的想法。

numpy 很简单,numpy 是 Python 的一个科学计算的库,提供了矩阵运算的功能,其一般与 Scipy、matplotlib 一起使用。其实,list 已经提供了类似于矩阵的表示形式,不过 numpy 为我们提供了更多的函数。

小编在这给大家总结了一些 numpy 的常用操作。

首先,要引入 numpy 包:

import numpy as np

一、在numpy中N维数组对象叫做ndarrey,关于它的一些操作:

1.ndarry对象的属性:

属性 说明
.ndim 秩,即轴的数量或维度的数量
.shape ndarray对象的尺度,对于矩阵,n行m列
.size ndarray对象元素的个数,相当于.shape中n*m的值
.dtype ndarray对象的元素类型
.itemsize ndarray对象中每个元素的大小,以字节为单位

2.ndarry的元素类型(1):

数据类型 说明
bool 布尔类型,True或False
intc 与C语言中的int类型一致,一般是int32或int64
intp 用于索引的整数,与C语言中ssize_t一致,int32或int64
int8 字节长度的整数,取值:[‐128, 127]
int16 16位长度的整数,取值:[‐32768, 32767]
int32 32位长度的整数,取值:[‐231, 231‐1]
int64 64位长度的整数,取值:[‐263, 263‐1]

2.ndarry的元素类型(1):

数据类型 说明
bool 布尔类型,True或False
intc 与C语言中的int类型一致,一般是int32或int64
intp 用于索引的整数,与C语言中ssize_t一致,int32或int64
int8 字节长度的整数,取值:[‐128, 127]
int16 16位长度的整数,取值:[‐32768, 32767]
int32 32位长度的整数,取值:[‐231, 231‐1]
int64 64位长度的整数,取值:[‐263, 263‐1]

3.ndarry的元素类型(2):

数据类型 说明
uint8 8位无符号整数,取值:[0, 255]
uint16 16位无符号整数,取值:[0, 65535]
uint32 32位无符号整数,取值:[0, 232‐1]
uint64 32位无符号整数,取值:[0, 264‐1]
float16 16位半精度浮点数:1位符号位,5位指数,10位尾数
float32 32位半精度浮点数:1位符号位,8位指数,23位尾数
float64 64位半精度浮点数:1位符号位,11位指数,52位尾数
complex64 复数类型,实部和虚部都是32位浮点数
complex128 复数类型,实部和虚部都是64位浮点数

4.ndarry常用函数总结:

函数 说明
np.arange(n) 类似range()函数,返回ndarray类型,元素从0到n‐1
np.ones(shape) 根据shape生成一个全1数组,shape是元组类型 np.zeros(shape)根据shape生成一个全0数组,shape是元组类型
np.full(shape,val) 根据shape生成一个数组,每个元素值都是val
np.eye(n) 创建一个正方的n*n单位矩阵,对角线为1,其余为0
np.ones_like(a) 根据数组a的形状生成一个全1数组
np.zeros_like(a) 根据数组a的形状生成一个全0数组
np.full_like(a,val) 根据数组a的形状生成一个数组,每个元素值都是val
np.linspace() 根据起止数据等间距地填充数据,形成数组
np.concatenate() 将两个或多个数组合并成一个新的数组
.reshape(shape) 不改变数组元素,返回一个shape形状的数组,原数组不变
.resize(shape) 与.reshape()功能一致,但修改原数组
.swapaxes(ax1,ax2) 将数组n个维度中两个维度进行调换
.flatten() 对数组进行降维,返回折叠后的一维数组,原数组不变
np.abs(x) np.fabs(x) 计算数组各元素的绝对值
np.sqrt(x) 计算数组各元素的平方根
np.square(x) 计算数组各元素的平方
np.log(x) np.log10(x) np.log2(x) 计算数组各元素的自然对数、10底对数和2底对数
np.ceil(x) np.floor(x) 计算数组各元素的ceiling值或floor值
np.rint(x) 计算数组各元素的四舍五入值
np.modf(x) 将数组各元素的小数和整数部分以两个独立数组形式返回
np.cos(x) np.cosh(x) np.sin(x) np.sinh(x) np.tan(x) np.tanh(x) 计算数组各元素的普通型和双曲型三角函数
np.exp(x) 计算数组各元素的指数值
np.sign(x) 计算数组各元素的符号值,1(+), 0, ‐1(‐)
+ ‐* / ** 两个数组各元素进行对应运算
np.maximum(x,y) np.fmax() np.minimum(x,y)np.fmin() 元素级的最大值/最小值计算
np.mod(x,y) 元素级的模运算
np.copysign(x,y) 将数组y中各元素值的符号赋值给数组x对应元素
> < >= <= == != 算术比较,产生布尔型数组

二、在numpy中随机函数库的函数总结:

1.np.random的随机函数(1):

函数 说明
rand(d0,d1,..,dn) 根据d0‐dn创建随机数数组,浮点数,[0,1),均匀分布
randn(d0,d1,..,dn) 根据d0‐dn创建随机数数组,标准正态分布
randint(low[,high,shape]) 根据shape创建随机整数或整数数组,范围是[low, high)
seed(s) 随机数种子,s是给定的种子值

2.np.random的随机函数(2):

函数 说明
shuffle(a) 根据数组a的第1轴进行随排列,改变数组x
permutation(a) 根据数组a的第1轴产生一个新的乱序数组,不改变数组x
choice(a[,size,replace,p]) 从一维数组a中以概率p抽取元素,形成size形状新数组 replace表示是否可以重用元素,默认为False

3.np.random的随机函数(3):

函数 说明
uniform(low,high,size) 产生具有均匀分布的数组,low起始值,high结束值,size形状
normal(loc,scale,size) 产生具有正态分布的数组,loc均值,scale标准差,size形状
poisson(lam,size) 产生具有泊松分布的数组,lam随机事件发生率,size形状

三、在numpy中统计函数总结:

函数 说明
sum(a, axis=None) 根据给定轴axis计算数组a相关元素之和,axis整数或元组
mean(a, axis=None) 根据给定轴axis计算数组a相关元素的期望,axis整数或元组
average(a,axis=None,weights=None) 根据给定轴axis计算数组a相关元素的加权平均值
std(a, axis=None) 根据给定轴axis计算数组a相关元素的标准差
var(a, axis=None) 根据给定轴axis计算数组a相关元素的方差
min(a) max(a) 计算数组a中元素的最小值、最大值
argmin(a) argmax(a) 计算数组a中元素最小值、最大值的降一维后下标
unravel_index(index, shape) 根据shape将一维下标index转换成多维下标
ptp(a) 计算数组a中元素最大值与最小值的差
median(a) 计算数组a中元素的中位数(中值)
np.gradient(f) 计算数组f中元素的梯度,当f为多维时,返回每个维度梯度

JavaScript—-Math数学对象(万能随机数公式)

thbcm阅读(206)

概念:是一个数学对象,不是构造函数,它具有数学常数和函数的属性和方法

  • Math.PI ——圆周率;
  • Math.floor() ——向下取整;
  • Math.ceil()——向上取整;
  • Math.round()——四舍五入;
  • Math.abs()——绝对值;
  • Math.max()/Math.min()——求最大和最小值;
  • Math.random()——获取范围在[0,1)内的随机值,可以随机返回一份小数,取值范围(0,1)左闭右开。

万能公式

获取某个范围内的随机数

​ 值 = Math.floor(Math.random()*可能值的总数+第一个可能的值)

小案例代码示例

<script>

    var arr = [];   //创建空数组放随机数

    for (var i = 0; i < 5; i++) {  //循环打印5个随机数  

        arr[i] = Math.round(Math.random() * 26 + 1);  //值 = 随机数公式

        for (var j = 0; j < i; j++) {   //循环5个随机数

            if (arr[i] == arr[j]) {   //做比较

                i–;   //如果相等,就不记录次数  因为循环打印5个随机数所以会重新生成一个随机数 

            }

        }

    }

    console.log(arr); //将5个随机数到控制台

</script>

Firefox下javascript调试方法

thbcm阅读(192)

打断点后,刷新页面,页面会停留在断点处,按下 F10 按钮,让代码继续,会看到后边变量窗口出现所有的变量信息。打断点后,刷新页面,页面会停留在断点处,按下 F10 按钮,让代码继续,会看到后边变量窗口出现所有的变量信息。今天没事干就把火狐浏览器(Firefox)下的 javascript 调试方法看了一下,记录在此,希望对大家有所帮助。

我们这次使用的代码页面为 document 获得对象博文中的按 name 属性获得对象的代码。

<html> 

<head> 

<title>getElementsByName</title> 

</head> 

<body> 

<form id=”form1″ action=”#”> 

<a href=”http://www.baidu.com/” name=”clj” >百度</a></br> 
<a href=”http://www.google.cn/” name=”clj” >谷歌</a></br> 
<a href=”http://www.gougou.com/” name=”clj” >狗狗</a></br> 
</form> 
<script> <!–getElementsByName–> 
var hrefs = document.getElementsByName(“clj”); 
for (var i=0; 
i < hrefs.length; i++) { 
var aHref = hrefs[i]; // 
var aHref = hrefs.item(i); 
if (aHref.innerHTML == “百度”) { 
alert(aHref.href); break; 


</script> 
</body> 
</html>

用 Firefox 浏览器打开该页面,在浏览器的打开浏览器的工具栏,找到开发者选项按钮,点击进入,勾选开发者工具栏

单击开发者选项的工具标识进入查看器页面

单击开发者选项的工具标识进入查看器页面

点击 暂停 按钮,点击后按钮状态改变,同时右侧的3个调试步骤变成可操作状态,调试步骤的作用可参考 IE 浏览器 javascript 调试篇的讲授。同时,在代码行上面打断点。点击断点后,代码自动进入调试状态,取消断点,代码直接运行过去。

打断点后,刷新页面,页面会停留在断点处,按下F10按钮,让代码继续,会看到后边变量窗口出现所有的变量信息。

点击 hrefs 变量,可以看到该集合属性的各对象,3个对象均为超链接,跟 IE 浏览器调试时看到的基本相同。

点击第一个对象,对象展开后会出现对象属性信息等内容

 说到这里,Firefox 浏览器的 javascript 调试基本就讲完了。

联系我们