92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线

首頁

HTML li 標簽之間空白間隔的解決辦法

seo達人

問題描述:

做抽屜式菜單時候,在 ie 7 下發現 li 元素之間會留白,如下圖:







原以為是樣式的問題,后來看到有博文寫到“行框的排列會受到中間空白(回車\空格)等的影響,因為空格也屬于字符,這些空白也會被應用樣式,占據空間,所以會有間隔”。







解決辦法:

li 標簽之間的空白,可以通過設置 li 標簽的 font-size 為 0,可以解決:



li{

    padding:0;

    margin:0;

    height: 30px;

    line-height: 30px;

    font-size: 0;          / 設置 font-size 為 0 即可 /

}

修改后的效果如圖:



藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計  ipad界面設計 、 包裝設計  圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務。

li與li之間有看不見的空白間隔是什么原因引起的?有什么解決辦法?(十三)

seo達人

li與li之間有看不見的空白間隔是什么原因引起的?有什么解決辦法?

引起這種空白間隔的原因:

瀏覽器的默認行為是把inline元素間的空白字符(空格換行tab)渲染成一個空格,也就是我們上面的代碼



換行后會產生換行字符,而它會變成一個空格,當然空格就占用一個字符的寬度。

解決方案:

方法一: 既然是因為< li>換行導致的,那就可以將< li>代碼全部寫在一排,如下





<div class="wrap">

<h3>li標簽空白測試</h3>

<ul>

<li class="part1"></li><li class="part2"></li><li class="part3"></li><li class="part4"></li>

</ul>

</div>

1

2

3

4

5

6

7

再刷新頁面看就沒有空白了,就是這么神奇~



方法二: 我們為了代碼美觀以及方便修改,很多時候我們不可能將< li>全部寫在一排,那怎么辦?既然是空格占一個字符的寬度,那我們索性就將



內的字符尺寸直接設為0,將下面樣式放入樣式表,問題解決。

.wrap ul{font-size:0px;}

1

但隨著而來的就是



中的其他文字就不見了,因為其尺寸被設為0px了,我們只好將他們重新設定字符尺寸。

方法三: 本來以為方法二能夠完全解決問題,但經測試,將li父級標簽字符設置為0在Safari瀏覽器依然出現間隔空白;既然設置字符大小為0不行,那咱就將間隔消除了,將下面代碼替換方法二的代碼,目前測試完美解決。同樣隨來而來的問題是li內的字符間隔也被設置了,我們需要將li內的字符間隔設為默認。



.wrap ul{letter-spacing: -5px;}

1

之后記得設置li內字符間隔





.wrap ul li{letter-spacing: normal;}

1

2

詳細看這篇文章 li與li之間有看不見的空白間隔是什么原因引起的?有什么解決辦法?

藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計  cs界面設計 、 ipad界面設計 、 包裝設計  圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務。

后臺返回json數據給前臺和前臺解析json數據(總結)

seo達人

后臺返回json數據給前臺和前臺解析json數據(總結)

一般來說web開發中,前臺采用json數據提交給后臺,后臺處理數據以后返回json數據給前臺,前臺解析json,顯示數據。

總而言之,前后臺直接交換的數據格式最常用的非json數據無疑了。

這里就總結一些json數據的前后臺處理方式。



1.JSON數據

JSON(JavaScript Object Notation, JS 對象簡譜)



是一種輕量級的數據交換格式,比xml更輕巧(由于 JSON 所使用的字符要比 XML 少得多,可以大大得節約傳輸數據所占用的帶寬)。



json是javascript原生格式,就是說在javascript中處理json數據,需要引用其他API或工具包。



簡潔和清晰的層次結構使得 JSON 成為理想的數據交換語言。 易于人閱讀和編寫,同時也易于機器解析和生成,并有效地提升網絡傳輸效率。



只需要記住!

Json是一種文本字符串!被存儲在responseText屬性中,而讀取json數據可以使用javascript的eval函數來解析json。



2.json規則:

在 JS 語言中,一切都是對象,對象是一個無序的 “鍵/值” 對集合。

因此,任何支持的類型都可以通過 JSON 來表示,例如字符串、數字、對象、數組等。但是對象和數組是比較特殊且常用的兩種類型:

? 對象表示為鍵值對.

? 數據由逗號分隔.

? 花括號{}保存對象.

? 方括號[]保存數組.



鍵/值對組合中的鍵名寫在前面并用雙引號 “” 包裹,使用冒號 : 分隔,然后緊接著值:



{"firstName": "Json"}

1

這很容易理解,等價于這條 JavaScript 語句:



{firstName : "Json"}

1

對象在 JS 中是使用花括號包裹 {} 起來的內容,數據結構為 {key1:value1, key2:value2, …} 的鍵值對結構。



在面向對象的語言中,key 為對象的屬性,value 為對應的值。



鍵名可以使用整數和字符串來表示,值的類型可以是任意類型。



數組在 JS 中是方括號 [] 包裹起來的內容,數據結構為 [“java”, “javascript”, “vb”, …] 的索引結構。



在 JS 中,數組是一種比較特殊的數據類型,它也可以像對象那樣使用鍵值對,但還是索引使用得多。同樣,鍵名可以使用整數和字符串來表示,值的類型可以是任意類型。



3.JSON 與 JS 對象的關系:

很多人搞不清楚 JSON 和 Js 對象的關系,甚至連誰是誰都不清楚。其實,可以這么理解:

JSON 是 JS 對象的字符串表示法,它使用文本表示一個 JS 對象的信息,本質是一個字符串。

如:



var obj = {a: 'Hello', b: 'World'};    //這是一個對象,注意鍵名也是可以使用引號包裹的

var json = '{"a": "Hello", "b": "World"}';  //這是一個 JSON 字符串,本質是一個字符串

1

2

4.后臺返回json數據

一般來說,使用JsonObject來將Java類型數據轉換成Json類型,首先要下載該庫相關的jar包,下載地址如下:



json-jar包下載



JsonObject的使用:

后臺controller部分代碼:



JSONObject object = new JSONObject();  //創建Json對象

object.put("username", "張三");         //設置Json對象的屬性

object.put("password", "123456");

System.out.println(object.toString());  //調用toString方法將json對象轉換成json字符串



//把json數據返回給瀏覽器:

PrintWriter out = cu.getWriterOut(response);

out.print(object.toString());

//或者

response.getWriter().write(jsonObject.toString());



1

2

3

4

5

6

7

8

9

10

11

5.在JavaScript代碼中接收Json數據:

假設result為瀏覽器得到的json數據,可以使用以下js代碼可以將json對象轉換為字符串。



比如:



通過$.get從后臺獲取了一段json串{“id”:“1”,“name”:“ww”},然后要拿到這里面的id和name值:



注意!注意!注意!

如果你直接這么寫!



$.get(url,

     function(data) {

       alert("ID:" + data.id + "\nName:" + data.name);

     });

1

2

3

4

直接這樣寫的話,界面會alert提示undefined,因為沒能正確解析返回的字符串。



圖示:





解決方案:



1、 需要用eval()函數



將返回的串轉化成可用的strig串,eval(data),但是因為原串里面是以{}開始和結束的,會被認為是可執行方法,因此需要加上()包圍起來,最終形成:



var jsonobj= eval('(' + data + ')');  // 把JSON字符串解析為javascript對象

1

然后再



alert("ID:" + jsonobj.id + "\nName:" + jsonobj.name);

1

各種正常的按key取值,就能正常顯示了。



2、獲取的時候就直接表示返回的是json格式,用.getJSON代替 .getJSON代替.getJSON代替.get,其他代碼不變,也能正常獲取。



也可以直接獲取json對象的屬性,如下:console.log(result.username);



前端js代碼:



$.ajax({

url: url,

type: "POST",

data: parameters,

dataType:"json",

async: false,

success: function(result){

var newData = JSON.stringify(result);    //將json對象轉換為字符串

newData = eval("("+newData+")");   /解析json



var annualDays = newData.annualDays;

var entryDate = newData.entryDate;



$("input[name='extendDataFormInfo.value(fd_shengyu_nianjia)']").val(annualDays);

$("input[name='extendDataFormInfo.value(fd_ruzhi_date)']").val(entryDate);



}});



1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

ps: 注意注釋中的代碼,如果少了這一句,那么直接alert(result);得到的結果會是







所以在這里stringfy()的作用是用于從一個對象解析出字符串

加上了var newData = JSON.stringify(result);這句,然后你再alert(newData);

得到的就會是你想要的結果,如下:





另外:

如果返回的json數據格式不是很規范的解決辦法:



判斷后臺返回的數據格式是否字符串,是則轉,不是則不轉?



  var $obj = (typeof data.content == 'string') ? JSON.parse(data.content):data.content

1

總結:



前臺發送請求,并且設置數據為json格式‘

    $.ajax({

    url:"selectByid.",

    datatype:'json',

    data:{id:id}, // 發送數據 

1

2

3

4

數據回調函數

success:function(data){

alert(data);

var json = eval("("+data+")");//將json類型字符串轉換為json對象

alert("hjf"+json.name);

1

2

3

4

給對應的input賦值:

$("#id").val(json.id),

$("#name").val(json.name),

$("#age").val(json.age);

1

2

3

后臺代碼:返回json數據

response.getWriter().print(str);    //將數據返回前臺ajax

1

6.前端ajax接不到json解決?

在前臺:



async:false,                //加上這個屬性就好了

1

7.返回的json字符串中有轉義符解決?

比如:



"result":"{\"id\":\"60\",\"qid\":\"1\",\"bazi\":\"baiz\",\"shenxiao\":\"\",\"xingzuo\":\"\",\"wuge\":\"\",\"jianyi\":\"\",}"

1

這樣我們我們使用JSON.parse(result) ,直接轉化為json的話是會報錯的。



解決方法:

我們先把轉義符用正則表達式去掉,



   var string = result.replace("/\","");

   var getDataArray = JSON.parse(string)

1

2

這樣就OK了,不過要注意有時候也是需要指定返回數據類型的

dataType:“json”



8.使用其他的json依賴包方式:

引入阿里巴巴的json依賴包:



    <dependency>

     <groupId>com.alibaba</groupId>

     <artifactId>fastjson</artifactId>

     <version>1.2.9</version>

    </dependency>

1

2

3

4

5

模擬后臺:



    String params="{\"channelCode\":\"bbb\",\"accountNo\":\"121300000932\",\"message\":\"字符信息解密成功\",\"status\":\"1\"}";

    JSONObject pa=JSONObject.parseObject(params);

    System.out.println(pa.getString("message"));

1

2

3

結果:





或者:

引入net.sf.json-lib依賴包:



    <dependency>

      <groupId>net.sf.json-lib</groupId>

      <artifactId>json-lib</artifactId>

      <version>2.4</version>  

      <classifier>jdk15</classifier>

    </dependency>

1

2

3

4

5

6

后臺:



String params="{\"channelCode\":\"ccy\",\"accountNo\":\"121300000932\",\"message\":\"字符信息解密成功\",\"status\":\"1\"}";

JSONObject pa=JSONObject.fromObject(params);

String accountNo=pa.getString("accountNo");

System.out.println(accountNo);

1

2

3

4

結果:





9.后臺對象轉換json數據返回給前臺

List集合轉換成json代碼:



List list = new ArrayList();

list.add( "first" );

list.add( "second" );

JSONArray jsonArray2 = JSONArray.fromObject( list );

1

2

3

4

Map集合轉換成json代碼:



  Map map = new HashMap();

map.put("name", "json");

map.put("bool", Boolean.TRUE);

map.put("int", new Integer(1));

map.put("arr", new String[] { "a", "b" });

map.put("func", "function(i){ return this.arr[i]; }");

JSONObject json = JSONObject.fromObject(map);

1

2

3

4

5

6

7

或者在項目中加入引入JSON-lib包,JSON-lib包同時依賴于以下的JAR包:

下載地址。



  1.commons-lang.jar

  2.commons-beanutils.jar

  3.commons-collections.jar

  4.commons-logging.jar 

  5.ezmorph.jar

  6.json-lib-2.2.2-jdk15.jar

1

2

3

4

5

6

用法同上



JSONObject jsonObject = JSONObject.fromObject(message);

getResponse().getWriter().write(jsonObject.toString());

1

2

當把數據轉為json后,用如上的方法發送到客戶端。前端就可以取得json數據了。(可以參考最下面的實例)



10.后臺返回數據給前臺,json中文亂碼解決方法

在實際運用場景中,當前臺發起請求后,我們需要從后臺返回數據給前臺,這時,如果返回的數據中包含中文,則經常會出現在后臺查詢出來都是好好,但是傳輸回去就莫名的亂碼了,而且即使在 web.xml 中進行編碼過濾了,但還是亂碼。



解決辦法:

只需要在 spring-mvc.xml 配置文件中配置一次就好,省去了我們重復寫的麻煩,配置內容如下:



<!--自定義消息轉換器的編碼,解決后臺傳輸json回前臺時,中文亂碼問題-->

    <mvc:annotation-driven >

        <mvc:message-converters register-defaults="true">

            <bean class="org.springframework.http.converter.StringHttpMessageConverter" >

                <property name = "supportedMediaTypes">

                    <list>

                        <value>application/json;charset=utf-8</value>

                        <value>text/html;charset=utf-8</value>

                        <!-- application 可以在任意 form 表單里面 enctype 屬性默認找到 -->

                        <value>application/x-www-form-urlencoded</value>

                    </list>

                </property>

            </bean>

            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" ></bean>

        </mvc:message-converters>

    </mvc:annotation-driven>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

加上這段配置,保存重新運行,再次訪問,會發現,原先的中文亂碼都已經正常顯示了。



方法二:在后臺的方法映射添加:



@RequestMapping(value="/getphone",produces = “text/plain;charset=utf-8”)



11.Spring MVC返回json數據的方式

  1. 采用@ResponseBody注解

    @ResponseBody 注解的作用是:



    將controller的方法返回的對象通過適當的轉換器轉換為指定的格式之后,寫入到response對象的body區,通常用來返回JSON數據或者是XML數據,需要注意的呢,在使用此注解之后不會再走試圖處理器,而是直接將數據寫入到輸入流中,他的效果等同于通過response對象輸出指定格式的數據。



    使用舉例:





    使用@ResponseBody 注解返回響應體 直接將返回值序列化json

    優點:不需要自己再處理



    再舉例:



    RequestMapping("/login")

    @ResponseBody

    public User login(User user){

    return user;

    }

    1

    2

    3

    4

    5

    使用@ResponseBody 注解返回響應體 直接將返回值序列化json。



    User字段:userName pwd,那么在前臺接收到的數據為:’{“userName”:“xxx”,“pwd”:“xxx”}’,效果等同于如下代碼:



    @RequestMapping("/login")

    public void login(User user, HttpServletResponse response){

    response.getWriter.write(JSONObject.fromObject(user).toString());

    }



    1

    2

    3

    4

    5

    需要在springmvc的配置文件xml中添加:



    <mvc:annotation-driven/>  

    1
  2. 采用工具類,進行json格式轉換帶回

    JSON-lib包是一個beans,collections,maps,java arrays 和XML和JSON互相轉換的包。在本例中,我們將使用JSONObject類創建JSONObject對象,然后我們打印這些對象的值。為了使用JSONObject對象,我們要引入"net.sf.json"包。為了給對象添加元素,我們要使用put()方法。



    要使程序可以運行必須引入JSON-lib包,JSON-lib包同時依賴于以下的JAR包:



    commons-lang.jar

    commons-beanutils.jar

    commons-collections.jar

    commons-logging.jar 

    ezmorph.jar

    json-lib-2.2.2-jdk15.jar

    1

    2

    3

    4

    5

    6

    效果:



    工具類:

    ResponseUtil.java



    package com.zout.utils;

    import java.io.PrintWriter;

    import javax.servlet.http.HttpServletResponse;

    import net.sf.json.JSONArray;

    import net.sf.json.JSONObject;



    /*

     
    @class_name:ResponseUtil  

     @param: EasyUi-響應工具類

     
    @return: 返回字符串格式數據、result是JSONObject對象(json對象)

     @author:Zoutao

     
    @createtime:2018年3月8日

     /

    public class ResponseUtil {

    public static void write(HttpServletResponse response, Object result)

    throws Exception {

    response.setContentType("text/html;charset=utf-8");

    response.addHeader("Access-Control-Allow-Origin", "
    ");

    PrintWriter out = response.getWriter();

    out.println(result.toString());

    System.out.println("帶回的json字符串為:"+result.toString()+"類型為:"+result.getClass().getName());

    out.flush();

    out.close();

    }



    public static void main(String[] args) throws Exception {

    /在web運用控制層中調用如下:/

    JSONObject result = new JSONObject(); //創建json對象

    JSONArray jsonArray = JSONArray.fromObject("name:zhangsan"); //字符串轉為json數組

    result.put("rows", jsonArray);  //放入json數組中,并起個名字

    HttpServletResponse response = null; //jsp的response對象

    ResponseUtil.write(response, result); //result寫入response帶回前臺,jsp按名字拿取。

    }

    }



    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    后臺具體調用:



    JSONObject result = new JSONObject();

    if (resultTotal > 0) { //處理結果

    System.out.println("操作成功。");

    result.put("success",true)

    result.put("message","操作成功"); //消息語句

    } else {

    System.out.println("操作失敗。");

    result.put("success", false);

    result.put("message","操作失敗");

    }

    ResponseUtil.write(response,result); //帶回字符串+狀態碼

    return null;

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    圖:





    后臺已經通過工具類封裝為json字符串了,使用response帶回需要的數據,使用result帶回狀態字符串或狀態碼。



    前臺:

    這是當成返回一個json字符串,然后直接采取字符串截取的方式,取出消息語句message等消息。





    這是另外一種寫法:就是解析傳回來的json字符串我js的對象,然后按照key/value的取值。



      function (data) {

              var data=eval("("+data+")");  //解析json

             //alert(data.message)

                $.messager.show({

                  title:'消息',

                  msg:data.message,  //按key取值

                  timeout:1000,

                  showType:'slide',

                  height:120,

                 width:200

         });

     });

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    推薦這種方式。

    效果圖:





    以上都是后臺返回json數據給前臺和前臺解析json數據的一些總結,還有json數據的封裝,工具類的使用等等,東西有點復雜有點多,挑選自己需要的地方即可。

    另外的一些常用的web開發json:



    Json–Java數據類型對照表(映射)表


javascript基礎———原型、原型對象和原型鏈

seo達人

原型:函數中的屬性prototype,她的名字就叫原型??梢酝ㄟ^也只能通過prototype添加可繼承的屬性和方法

原型對象:函數中prototype中的proto 和對象中的proto

先記住原型(prototype)和原型對象(proto)

下面用代碼解釋原型、原型對象、 原型鏈

<!DOCTYPE html>

<html>

   <head>

    <meta charset="utf-8">

    <title>對象</title>

   </head>

   <body>

    <script type="text/javascript">

       //創建一個對象和一個函數

       var obj = {}

       console.log(obj.proto)//obj有原型對象

       function objFun (){}

       console.log(objFun.prototype) //objFun 原型

       console.log(objFun.prototype.proto) //原型中有原型對象

       console.log('*華麗的分割線***')

       // 以objFun為構造函數 (為了把構造函數和普通函數做區分,通常把構造函數名首字母大寫)

       // 添加屬性和方法

       objFun.prototype.name='saozhu'

       objFun.prototype.say = function(){

        console.log(this.name+'-騷豬')

       }

       // 創建實例對象1

       var obj1=new objFun()

       console.log(obj1)//打印對象 空對象

       console.log(obj1.name) //騷豬 證明obj1繼承了objFun函數的屬性

       console.log('*華麗的分割線***')

       // 此時此刻 可以理解原型鏈了: 

       console.log(obj1.proto=== objFun.prototype)

       //true 

       // 原型鏈是有實例對象的proto(原型對象)指向構造函數函數的原型(prototype)

       console.log(objFun.prototype.proto==window.Object.prototype)

       // true

       // 然后構造函數的原型的原型對象(prototype.proto)指向window.Object.protype(對象的原型)

       console.log(window.Object.prototype.proto===null)

       // 這樣的指向關系形成的鏈式關系就是原型鏈

       //鏈式查詢,查詢對象中的屬性和方法,會根據這樣的原型鏈查找,直到找到響應的屬性和方法.找到window.Object.prototype.proto還沒有值,就返回undeifne

       

    </script>

   </body>

</html>


一個例子讓你明白原型對象和原型鏈

seo達人

開篇

之前對js中的原型鏈和原型對象有所了解,每當別人問我什么是原型鏈和原型對象時,我總是用很官方(其實自己不懂)的解釋去描述。有一句話說的好:如果你不能把一個很復雜的東西用最簡單的話語描述出來,那就說明你沒有真正的理解。最近正在讀《Javascript高級程序設計》,書中對原型對象和原型鏈的描述讓我受益匪淺,下面僅用一個對比性的例子來說明。



我們經常會這么寫

    function Person () {

        this.name = 'John';

    }

    var person = new Person();

    Person.prototype.say = function() {

        console.log('Hello,' + this.name);

    };

    person.say();//Hello,John

1

2

3

4

5

6

7

8

上述代碼非常簡單,Person原型對象定義了公共的say方法,雖然此舉在構造實例之后出現,但因為原型方法在調用之前已經聲明,因此之后的每個實例將都擁有該方法。從這個簡單的例子里,我們可以得出:



原型對象的用途是為每個實例對象存儲共享的方法和屬性,它僅僅是一個普通對象而已。并且所有的實例是共享同一個原型對象,因此有別于實例方法或屬性,原型對象僅有一份。



所以就會有如下等式成立:



    person.say == new Person().say

1

可能我們也會這么寫

    function Person () {

        this.name = 'John';

    }

    var person = new Person();

    Person.prototype = {

        say: function() {

            console.log('Hello,' + this.name);

        }

    };

    person.say();//person.say is not a function

1

2

3

4

5

6

7

8

9

10

很不幸,person.say方法沒有找到,所以報錯了。其實這樣寫的初衷是好的:因為如果想在原型對象上添加更多的屬性和方法,我們不得不每次都要寫一行Person.prototype,還不如提煉成一個Object來的直接。但是此例子巧就巧在構造實例對象操作是在添加原型方法之前,這樣就會造成一個問題: 

當var person = new Person()時,Person.prototype為:Person {} (當然了,內部還有constructor屬性),即Person.prototype指向一個空的對象{}。而對于實例person而言,其內部有一個原型鏈指針proto,該指針指向了Person.prototype指向的對象,即{}。接下來重置了Person的原型對象,使其指向了另外一個對象,即



 Object {say: function}

1

這時person.proto的指向還是沒有變,它指向的{}對象里面是沒有say方法的,因為此報錯。



從這個現象我們可以得出:



在js中,對象在調用一個方法時會首先在自身里尋找是否有該方法,若沒有,則去原型鏈上去尋找,依次層層遞進,這里的原型鏈就是實例對象的proto屬性。



若想讓上述例子成功運行,最簡單有效的方法就是交換構造對象和重置原型對象的順序,即:



    function Person () {

        this.name = 'John';

    }

    Person.prototype = {

        say: function() {

            console.log('Hello,' + this.name);

        }

    };

    var person = new Person();

    person.say();//person.say is not a function

1

2

3

4

5

6

7

8

9

10

一張圖讓你秒懂原型鏈

 



其實,只需要明白原型對象的結構即可:



    Function.prototype = {

        constructor : Function,

        proto : parent prototype,

        some prototype properties: ...

    };

1

2

3

4

5

總結:

函數的原型對象constructor默認指向函數本身,原型對象除了有原型屬性外,為了實現繼承,還有一個原型鏈指針proto,該指針指向上一層的原型對象,而上一層的原型對象的結構依然類似,這樣利用proto一直指向Object的原型對象上,而Object的原型對象用Object.prototype.proto = null表示原型鏈的最頂端,如此變形成了javascript的原型鏈繼承,同時也解釋了為什么所有的javascript對象都具有Object的基本方法。



Blog同步


w3cschool編程實戰之JavaScript 隊列

seo達人

JavaScript 隊列

題目:

在計算機科學中 隊列(queue)是一個抽象的數據結構,隊列中的數據條目都是有秩序的。新的條目會被加到 隊列 的末尾,舊的條目會從 隊列 的頭部被移出。



寫一個函數 queue ,用一個數組arr和一個數字item作為參數。數字item添加到數組的結尾,然后移出數組的第一個元素,最后隊列函數應該返回被刪除的元素。

queue([], 1) 應該返回 1

queue([2], 1) 應該返回 2

queue([5,6,7,8,9], 1) 應該返回 5

在 queue(testArr, 10) 之后, testArr[4] 的值應該是 10



通關答案:



function queue(arr, item) {

/下面這兩句是關鍵/

    arr.push(item);

    return arr.shift();// Change this line

}



console.log(queue([], 1));

console.log(queue([2], 1));

console.log(queue([5,6,7,8,9], 1));

// Test Setup

var testArr = [1,2,3,4,5];



// Display Code

console.log("Before: " + JSON.stringify(testArr));

console.log(queue(testArr, 10)); // Modify this line to test

console.log("After: " + JSON.stringify(testArr));



藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計  cs界面設計 、 ipad界面設計 、 包裝設計  圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務。

頁面跳轉的兩種方式(轉發和重定向)區別及應用場景分析

seo達人

轉發和重定向區別詳解

        作為一名程序員,特別是java web開發的程序員,在使用servlet/jsp的時候,我們必須要知道實現頁面跳轉的兩種方式的區別和聯系:即轉發和重定向的區別。



      1、RequestDispatcher.forward方法只能將請求轉發給同一個WEB應用中的組件;而HttpServletResponse.sendRedirect 方法不僅可以重定向到當前應用程序中的其他資源,還可以重定向到同一個站點上的其他應用程序中的資源,甚至是使用絕對URL重定向到其他站點的資源。如果傳遞給HttpServletResponse.sendRedirect 方法的相對URL以“/”開頭,它是相對于整個WEB站點的根目錄;如果創建RequestDispatcher對象時指定的相對URL以“/”開頭,它是相對于當前WEB應用程序的根目錄。、



      2、調用HttpServletResponse.sendRedirect方法重定向的訪問過程結束后,瀏覽器地址欄中顯示的URL會發生改變,由初始的URL地址變成重定向的目標URL;而調用RequestDispatcher.forward 方法的請求轉發過程結束后,瀏覽器地址欄保持初始的URL地址不變。



      3、HttpServletResponse.sendRedirect方法對瀏覽器的請求直接作出響應,響應的結果就是告訴瀏覽器去重新發出對另外一個URL的 訪問請求,這個過程好比有個綽號叫“瀏覽器”的人寫信找張三借錢,張三回信說沒有錢,讓“瀏覽器”去找李四借,并將李四現在的通信地址告訴給了“瀏覽器”。于是,“瀏覽器”又按張三提供通信地址給李四寫信借錢,李四收到信后就把錢匯給了“瀏覽器”??梢姡盀g覽器”一共發出了兩封信和收到了兩次回復, “瀏覽器”也知道他借到的錢出自李四之手。RequestDispatcher.forward方法在服務器端內部將請求轉發給另外一個資源,瀏覽器只知道發出了請求并得到了響應結果,并不知道在服務器程序內部發生了轉發行為。這個過程好比綽號叫“瀏覽器”的人寫信找張三借錢,張三沒有錢,于是張三找李四借了一些錢,甚至還可以加上自己的一些錢,然后再將這些錢匯給了“瀏覽器”。可見,“瀏覽器”只發 出了一封信和收到了一次回復,他只知道從張三那里借到了錢,并不知道有一部分錢出自李四之手。



       4、RequestDispatcher.forward方法的調用者與被調用者之間共享相同的request對象和response對象,它們屬于同一個訪問請求和響應過程;而HttpServletResponse.sendRedirect方法調用者與被調用者使用各自的request對象和response對象,它們屬于兩個獨立的訪問請求和響應過程。對于同一個WEB應用程序的內部資源之間的跳轉,特別是跳轉之前要對請求進行一些前期預處理,并要使用HttpServletRequest.setAttribute方法傳遞預處理結果,那就應該使用RequestDispatcher.forward方法。不同WEB應用程序之間的重定向,特別是要重定向到另外一個WEB站點上的資源的情況,都應該使用HttpServletResponse.sendRedirect方法。



        5、無論是RequestDispatcher.forward方法,還是HttpServletResponse.sendRedirect方法,在調用它們之前,都不能有內容已經被實際輸出到了客戶端。如果緩沖區中已經有了一些內容,這些內容將被從緩沖區中。



以上五點的論述來源于:點擊查看原文論述



轉發和重定向的圖解





兩種跳轉獲得對象的方式

//獲得轉發對象getRequestDispatcher()

HttpServletRequest(httpServletRequest).getRequestDispatcher

ServletContext.getRequestDispatcher();

 

//獲得重定向對象sendRedirect()

HttpServletResponse(httpServletResponse).sendRedirect();

轉發和跳轉的小結

      1、轉發使用的是getRequestDispatcher()方法;重定向使用的是sendRedirect();



      2、轉發:瀏覽器URL的地址欄不變。重定向:瀏覽器URL的地址欄改變;



      3、轉發是服務器行為,重定向是客戶端行為;



      4、轉發是瀏覽器只做了一次訪問請求。重定向是瀏覽器做了至少兩次的訪問請求;



      5、轉發2次跳轉之間傳輸的信息不會丟失,重定向2次跳轉之間傳輸的信息會丟失(request范圍)。



轉發和重定向的選擇

      1、重定向的速度比轉發慢,因為瀏覽器還得發出一個新的請求,如果在使用轉發和重定向都無所謂的時候建議使用轉發。



      2、因為轉發只能訪問當前WEB的應用程序,所以不同WEB應用程序之間的訪問,特別是要訪問到另外一個WEB站點上的資源的情況,這個時候就只能使用重定向了。



轉發和重定向的應用場景

       在上面我已經提到了,轉發是要比重定向快,因為重定向需要經過客戶端,而轉發沒有。有時候,采用重定向會更好,若需要重定向到另外一個外部網站,則無法使用轉發。另外,重定向還有一個應用場景:避免在用戶重新加載頁面時兩次調用相同的動作。



       例如,當提交產品表單的時候,執行保存的方法將會被調用,并執行相應的動作;這在一個真實的應用程序中,很有可能將表單中的所有產品信息加入到數據庫中。但是如果在提交表單后,重新加載頁面,執行保存的方法就很有可能再次被調用。同樣的產品信息就將可能再次被添加,為了避免這種情況,提交表單后,你可以將用戶重定向到一個不同的頁面,這樣的話,這個網頁任意重新加載都沒有副作用;



       但是,使用重定向不太方便的地方是,使用它無法將值輕松地傳遞給目標頁面。而采用轉發,則可以簡單地將屬性添加到Model,使得目標視圖可以輕松訪問。由于重定向經過客戶端,所以Model中的一切都會在重定向時丟失。但幸運的是,在Spring3.1版本以后,我們可以通過Flash屬性,解決重定向時傳值丟失的問題。



       要使用Flash屬性,必須在Spring MVC的配置文件中添加一個<annotation-driven/>。然后,還必須再方法上添加一個新的參數類型:org.springframework.web.servlet.mvc.support.RedirectAttributes。



       如下所示:



@RequestMapping(value="saveProduct",method=RequestMethod.POST)

public String saveProduct(ProductForm productForm,RedirectAttributes redirectAttributes){

 

     //執行產品保存的業務邏輯等

  

     //傳遞參數

       redirectAttributes.addFlashAttribute("message","The product is saved successfully");

   

     //執行重定向

      return "redirect:/……";



藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務。

Struts2中轉發和重定向的區別以及實現方法

seo達人

Struts2中轉發和重定向的區別以及實現方法

最近遇到一個問題,就是在設置struts2的攔截器以后,想要訪問必須登錄,想要的效果是轉到登錄頁面,也就是轉到xxx.jsp,但是發現沒有轉到,而是action結尾的,后來發現是因為在struts.xml里面配置的時候,沒有在result中配置type屬性,struts默認的是重定向,就是網址不變,解決辦法就是在result中加type=”redirect”,就可以了



轉發和重定向的區別:



重定向是不共享request的東西,重定向后的頁面中無法接收request里的東西,另外dispatcher結果類型的default屬性為TRUE,故<result-          type/>缺省為dispatcher 所以如果沒有設置type屬性的話,那么默認的是請求轉發,就是說你要是什么都不寫的話,默認就是這樣的

1

<result name="list" type="dispatcher">/admin/jsp/userAction/list.jsp</result>

1

重定向的兩個屬性: 

redirect是在處理完當前Action之后,重定向到另外一個實際的物理資源,以.jsp結尾這樣的 

redirectAction也是重定向,但它重定向到的是另外一個Action,就是以action結尾這樣的 

只要是重定向,那么之前凡是保存在request里面的東西就全都消失了 

因為重定向實際是發送第二個請求,故請求中的東西也就不會出現在第二個請求里面了 

也就是說重定向是不共享request的東西,重定向后的頁面中無法接收request里的東西,

藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計  cs界面設計 、 ipad界面設計  包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務。

使用 vue 1.0.3 $set 函數遇到的坑

seo達人

vue 1.0.3  中 $set 函數是動態改變或添加一個 data 中的屬性值時 屬性 key 不可以使用純數字。



例如:



var app = new Vue({

     el:"#app",

     data:{

         test:{

             k1:'v1',

             k2:'v2'

         }

     },

     methods:{

         changeTestValue:function{

             // 動態改變 test 中某一屬性的值

             var key = 'test.k1';  // 改變 test 屬性中的 k1 的值

             this.$set(key,'changev1');  // 此處執行沒有問題

            // 改變 整個 test 的值可以使用

            this.$set('test',{k1:'change-demo-v1',k2:'change-demo-v2'});   // 此處執行沒有問題

            // 動態給 test 增加一個屬性  k3

            this.$set('test.k3','test-add-value3');   // 此處執行沒有問題

 

 

            // 此處有坑 當你的 屬性為全數字的時候,則 函數無效,不報錯,但是也添加不上值。

            // 例如

            this.$set('test.123','test-add-123');  // 此處執行不報錯,但是也沒有效果。

 

 

            // 所以在使用老版本vue的時候盡量避免 屬性 key 未純數字,或其他特殊字符。

         }

     }

});



除了這個坑以外還有另外一個坑,不過沒有具體試驗,

watch 監聽某一值得變化,好像有點問題, 實際結果是只要 data 中的任意一個值發生變化都會被捕捉到。







最后還是使用 vue 2.x  以上版本吧,bug 少很多。







另外 $set 函數在2.x 中使用方式有所變化。







this.$set(target,key,obj);



target 對象類型,是需要賦值或修改的對象,



key  是字符串類型, 是 target 對象的屬性



obj  可以是字符串,可以是對象類型,是 你要修改的或增加的值


藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計  ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務。

轉發和重定向的區別

seo達人

簡單介紹

多個頁面和 servlet 組成了一個基于 Java 的 web 應用程序。JSP 使用轉發和重定向兩種方式將控制權從一個 servlet 傳遞到另一個 servlet 或者 JSP。



轉發(Forward)方法: 將請求從一個 servlet 轉發到 web 應用程序中的另一個資源,這個資源可以是一個 servlet、JSP 頁面、或者 HTML 文件。



重定向(Redirect)方法: 方法將請求重定向到另一個 web 應用程序。使用轉發( Forward )方法無法完成此操作。如果一個重定向命中了同一個 web 應用程序的不同資源,那么它使用的 URL 將與原始請求的 URL 不同。如果你不想響應一個請求,你可以將請求重定向到一個不同的 URL,然后瀏覽器將會將你的新請求重定向到你提供的新的 URL。這篇文章詳細解釋了兩種方式的不同之處。



什么是轉發(Forward)

在基于 web 的系統或者應用程序中,通常需要在不同的資源或 JSP 之間轉移控制權。例如:你如希望從電子商務網站下單,則需要先進行注冊,然后才可以繼續。如果你還未在他們的系統中注冊,那么購物車界面可能會將控制權轉移到負責注冊過程的 JSP 表單。轉發( Forward )方法即是用于此目的。它用于將請求從一個 JSP 轉發到統一上下文中的另一個資源。



什么是重定向(Redirect)

此方法也用于轉發 HTTP 請求,但與轉發( Forward )不同的是:它是一個兩步過程,其中重定向發生在客戶端到不同的應用程序。Redirect 方法將用戶重定向到新的 URL。客戶端的瀏覽器會自動對來自服務器中的重定向表頭中指定的 URL 發出新的請求。它需要與客戶機進行往返通訊,因此相對來說會比轉發( Forward )方法慢些。



轉發(Forward)與重定向(Redirect)區別

轉發(Forward)與重定向(Redirect)的描述

Forward() 方法用于將請求從一個 JSP 轉發到另一個 JSP,或從一個 JSP 轉發到另一個 servlet,或從一個 JSP 轉發到 web 應用程序的另一個資源??刂剖窃谌萜鞯膬炔總鬟f的,瀏覽器/客戶機不參與此過程。Forward( )方法在 RequestDispatcher 中聲明。



Sendredirect () 方法在 HttPServletResponse 中聲明,用于將客戶端請求重定向到不同服務器或上下文中可用的不同 URL。 通過重定向,您可以將瀏覽器重定向到完全不同的應用程序。



客戶端是否參與轉發(Forward)和重定向(Redirect)

這兩種方法之間的一個關鍵區別是 web 容器在 Forward() 情況中處理了所有的內部進程,而且 URL 在客戶端的瀏覽器中不會改變,因此客戶端/瀏覽器不會參與其中,從而使它們完全不知道動作已經發生。



而在 Sendredirect () 的情況中,該方法設置適合的頭部信息和正文內容以將請求重定向到不同的 URL 中,瀏覽器付負責將新的請求發送到客戶端可見的 URL。



執行控制

當在請求時執行 Forward() 方法,當前的請求會被轉發到另一個 JSP 頁面,對當前 JSP 的處理也會被終止。請求可能會被轉發到另一個用 Java 編程語言編寫的 servlet,或者一個靜態的 HTML 頁面。



一個 SendRedirect() 請求只是簡單告知瀏覽器轉到另一個 URL,將執行控制發送到 web 應用程序之外。它使用一個兩步的過程來指示瀏覽器的 URL 發出另一個將控制轉發到另一個客戶端的請求。



速度

Forward () 在服務器內運行,執行速度比 SendRedirect () 快。



重定向必須通過瀏覽器,然后等待瀏覽器發出新的 HTTP 請求。 一個重定向使得服務器發送 HTTP 響應狀態代碼 302 和一個包含新的 URL 的位置頭到瀏覽器,并且在瀏覽器收到狀態代碼 302 之后,它對位置頭中的 URL 發出一個新的請求。 這需要與客戶機進行往返通信,這使得它比 Forward () 相對慢一些。



轉發(Forward)和重定向(Redirect)比較圖表

轉發(Forward) 重定向(Redirect)

用于將請求從一個 JSP 轉發到另一個 JSP,或從一個 JSP 轉發到另一個 servlet,或從一個 JSP 轉發到 web 應用程序的另一個資源。 用于將客戶端請求重定向到不同服務器或上下文中可用的不同 URL。

Forward( )方法在 RequestDispatcher 中聲明。 Sendredirect () 方法在 HttPServletResponse 中聲明

不涉及客戶端/瀏覽器,web 容器在內部處理該過程。 當客戶端將 URL 作為一個新的請求后,控制權將會轉移至客戶端或瀏覽器。

當一個組件執行業務邏輯并與另一個組件共享結果時,它最有效。 當客戶端應從一個頁面重定向到另一頁面時,此方法效果最佳。

它在服務器內運行,并且比重定向執行得更快。 它比轉發慢,因為它需要與客戶端進行往返通信。

使用時,原來的 URL 請求不變。 原始的 URL 請求會改變。

兩種資源都必須屬于同一上下文。 將請求重定向到不屬于當前上下文的其它 URL。

轉發(Forward)和重定向(Redirect)總結

學習轉發方法和重定向方法之間的區別是 Java 開發人員最重要的部分之一。 雖然控制器可以在處理請求結束時執行轉發(Forward)或重定向(Redirect)方法,但它們有自己的一組用途。



大多數情況下,您會使用 Forward () 方法,因為它比 SendRedirect () 稍微快一點,而后者實際上需要與客戶機進行往返通信,使其比 Forward() 更慢。 通過重定向,你可以將瀏覽器導向到另一個應用程序。 這是轉發無法做到的。



簡而言之,當一個組件必須執行業務邏輯并與另一個組件共享結果時,轉發(Forward)工作效果最好,而當客戶端應該從一個頁面重定向到另一個頁面時,重定向(Redirect)工作效果最好。



以上內容翻譯自:

Difference Between Forward and Redirect。

能力有限,還望斧正。

藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制  用戶體驗 、交互設計、 網站建設 平面設計服務。

日歷

鏈接

個人資料

藍藍設計的小編 http://m.skdbbs.com

存檔

92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线
一个人看的www久久| 日本精品600av| 欧美乱妇一区二区三区不卡视频| 国内精品久久久久影院优| 精品国产免费人成网站| 国产精品xxx视频| 性国产高清在线观看| 九九热线视频只有这里最精品| 国产日韩中文字幕在线| 色婷婷国产精品| 精品国产91久久久久久久妲己| 成人h在线播放| 群体交乱之放荡娇妻一区二区| 91久久精品一区二区| 亚洲一线二线三线视频| 久久综合精品一区| 最近2019免费中文字幕视频三| 国产欧美日韩综合精品二区| 蜜桃成人av| 日本欧美在线观看| 亚洲综合丁香婷婷六月香| 另类小说欧美激情| 视频三区二区一区| 日韩一区二区三区高清在线观看| 国产欧美日产一区| 欧美精品一区二区三区蜜桃| 欧美二区乱c黑人| 亚洲高清123| 欧美重口乱码一区二区| 91麻豆福利精品推荐| 日本女人一区二区三区| 久久综合九色| 精品午夜视频| 成人毛片av在线| 欧美日韩亚洲一区二| 粉嫩av免费一区二区三区| 国产精品wwwwww| 色狠狠av一区二区三区香蕉蜜桃| 中国日韩欧美久久久久久久久| 狠狠综合久久av一区二区小说| 亚洲一区在线观看免费| 成人影院中文字幕| 国产精品毛片无遮挡高清| 精品国产a毛片| 欧美一二三四五区| 川上优av一区二区线观看| 国产精品入口福利| 懂色中文一区二区三区在线视频| 欧美日韩国产三区| 国产一区二区你懂的| 一区二区亚洲精品国产| 波多野结衣成人在线| 亚洲亚裔videos黑人hd| 亚洲精品乱码久久久久| eeuss鲁片一区二区三区| 欧美理伦片在线播放| 国产精品日日做人人爱| 精品国产一区二区三区麻豆小说| 特黄毛片在线观看| 亚洲第一伊人| 1024精品久久久久久久久| 久本草在线中文字幕亚洲| 精品999在线播放| 久久夜色精品国产欧美乱| 精品一区二区免费在线观看| 男人添女人下部高潮视频在线观看| 国产精品99久久久久久白浆小说| 国产精品日韩精品欧美在线| 久久青青草原| 亚洲一区免费| 国产精品三p一区二区| 一区二区免费不卡在线| 亚洲小说图片| 亚洲成人资源| 自拍亚洲一区| 日韩精品在线免费观看| 2023国产精品视频| 一区二区三区伦理| 国产色综合网| 婷婷国产精品| 91午夜精品| 久久婷婷国产| 米奇777四色精品人人爽| jizz性欧美10| 国内精久久久久久久久久人| 欧美做受高潮1| 小嫩嫩精品导航| 欧美性猛交xxxx免费看久久久| 最新日韩在线| 狠狠操综合网| 粉嫩在线一区二区三区视频| 久久久亚洲精品视频| 一区二区三区 在线观看视| 久久久亚洲国产天美传媒修理工| 国产精品一区二区免费不卡| 国产剧情一区二区三区| 黄视频网站在线看| 精品丝袜一区二区三区| 国产高清自拍视频在线观看| 99高清视频有精品视频| 9999精品| 久久伊人色综合| 99久久精品费精品国产风间由美| 成a人片在线观看www视频| 国产成+人+日韩+欧美+亚洲| 亚洲精品aⅴ| 亚洲第一黄色| 香蕉久久夜色精品国产使用方法| 免费观看不卡av| 欧美性xxxx极品hd欧美风情| 91高清免费在线观看| 国产精品入口久久| 色综合咪咪久久| 日韩亚洲国产中文字幕欧美| 日本vs亚洲vs韩国一区三区二区| 中文字幕视频在线免费欧美日韩综合在线看| 岛国av在线不卡| 成人h猎奇视频网站| www在线观看黄色| 国产精品天美传媒沈樵| sis001欧美| 一区二区在线免费播放| 欧美影院精品| 一区二区高清在线| 日韩在线a电影| 亚洲第一在线综合网站| 欧洲一区二区日韩在线视频观看免费| 国产精品久久久久91| 欧美一区二区三区公司| 欧美精品一区男女天堂| 亚洲丝袜美腿一区| 亚洲国产aⅴ成人精品无吗| 日韩中文有码在线视频| 黄色在线免费看| 日韩电影第一页| 欧美极品欧美精品欧美视频| 欧美丝袜激情| 9国产精品午夜| 亚洲区综合中文字幕日日| 一区二区三区国产在线| 国产日韩一区二区三区在线| 久久综合国产精品| 一区二区三区高清视频在线观看| 大陆成人av片| 欧美成人高清视频| 欧美高清在线| 亚洲色图35p| 青青草97国产精品免费观看无弹窗版| 国产精品一级二级三级| 欧美一区午夜精品| 亚洲综合激情小说| 色综合五月天| 亚洲香蕉网站| 久久99精品国产自在现线| 99久久精品一区二区| 91麻豆桃色免费看| 久久综合网色—综合色88| 色综合久久悠悠| 国产精品羞羞答答在线观看| 你懂的成人av| 久久精品国产成人一区二区三区| 全球成人免费直播| 亚洲三级av在线| 久久色中文字幕|