杏耀註冊平台官網_使用JavaScript將XML轉換為JSON

成為具有以下結構的JavaScript對象是可行的:,
,如果您在jsON上關注我,您就會知道我一直在使用Appcelerator Titanium開發超級機密的移動應用程序。體驗非常棒:使用JavaScript創建易於編寫,易於測試的本地移動應用程序很有趣。我的移動應用程序連接到許多社交網絡API,其中一些僅提供XML響應。我的迷你“框架”使用jsON動態創建小部件,因此我需要一種將XML轉換為JSON的方法。我發現了許多解決方案,但沒有一個起作用。調整現有功能后,我發現了一個很好的解決方案。,// Changes XML to JSON function xmlToJson(xml) {    // Create the return object  var obj = {};  if (xml.nodeType == 1) { // element   // do attributes   if (xml.attributes.length > 0) {   obj[“@attributes”] = {};    for (var j = 0; j < xml.attributes.length; j++) {     var attribute = xml.attributes.item(j);     obj[“@attributes”][attribute.nodeName] = attribute.nodeValue;    }   }  } else if (xml.nodeType == 3) { // text   obj = xml.nodeValue;  }  // do children  if (xml.hasChildNodes()) {   for(var i = 0; i < xml.childNodes.length; i++) {    var item = xml.childNodes.item(i);    var nodeName = item.nodeName;    if (typeof(obj[nodeName]) == “undefined”) {     obj[nodeName] = xmlToJson(item);    } else {     if (typeof(obj[nodeName].push) == “undefined”) {      var old = obj[nodeName];      obj[nodeName] = [];      obj[nodeName].push(old);     }     obj[nodeName].push(xmlToJson(item));    }   }  }  return obj; };,{  “@attributes”: {   AID: “=”,   HOME:  0,   URL: “davidwalsh.name/”,   VER: “0.9”,  },  SD = [   {    “@attributes”: {     FLAGS: “”,     HOST: “davidwalsh.name”,     TITLE: A    },    LINKSIN: {     “@attributes”: {      NUM: 1102     }    },    SPEED: {     “@attributes”: {      PCT: 51,      TEXT: 1421     }    },    TITLE: {     “@attributes”: {      TEXT: “David Walsh Blog :: php, MySQL, css, Javascript, MooTools, and Everything Else”,     }    },   },   {    POPULARITY: {     “@attributes”: {      TEXT: 7131,      URL: “davidwalsh.name/”     }    },    RANK: {     “@attributes”: {      DELTA: “-1648”     }    },    REACH: {     “@attributes”: {      RANK = 5952     }    }   }  ] },此功能在允許我快速忽略XML並改用JSON時非常有用。當構造嵌套子節點的屬性和數組時,該函數運行良好。保持方便;在某些時候,您可能需要將XML轉換為JSON!,從這裏可以使用JavaScript對象,但您認為合適。如果您想使用JSON字符串格式的JavaScript,可以編寫以下代碼:,<ALEXA VER=”0.9″ URL=”davidwalsh.name/” HOME=”0″ AID=”=”>  <SD TITLE=”A” FLAGS=”” HOST=”davidwalsh.name”>   <TITLE TEXT=”David Walsh Blog :: php, MySQL, css, Javascript, MooTools, and Everything Else”/>   <LINKSIN NUM=”1102″/>   <SPEED TEXT=”1421″ PCT=”51″/>  </SD>  <SD>   <POPULARITY URL=”davidwalsh.name/” TEXT=”7131″/>   <REACH RANK=”5952″/>   <RANK DELTA=”-1648″/>  </SD> </ALEXA>,JavaScript,重要的是要指出Titanium的Titanium.XML.DOMDocument對象實現DOM2級結構。這是神奇的XML到JSON代碼:,我需要實現的主要更改是使用attributes.item(j)而不是使用attributes[j]我發現的大多數腳本。使用此功能,XML如下所示:,成為具有以下結構的JavaScript對象是可行的:

沐鳴登錄_綁定點擊事件,當點擊事件里依賴異步返回結果則阻止冒泡失效

,在開發過程中,明明調試好的阻止冒泡沒有問題,但是真正使用 時候發現阻止冒泡失效了,原來原因是點擊事件里依賴了異步返回結果。,背景,正常阻止冒泡寫法,doReport是一個上報方法,這裏要等待上報完成之後再執行點擊邏輯,會導致阻止冒泡失效。,
,鏈接: http://www.fly63.com/article/detial/9912,

沐鳴娛樂業務:_HTML5 History API 和 Location 對象剖析

大致上看,history API 的支持情況還是很不錯的,可以點擊此處查看各個瀏覽器對 history 的支持情況。,
,這次也不長篇大論,只搞清楚兩件事 —— History API & Location 對象。了解清楚這些,將能夠使我們在不同 web 頁面之間穿梭自如。,當然,當我們更改URL時,可能會出現這樣一種情況:我們只更改了URL的片段標識符 (跟在#符號後面的URL部分,包括#符號),這種情況下將觸發 hashchange 事件,使用方法如下:,
,History 作為一個全局變量(即 window.history),不繼承任何屬性,在 html4 時代就已經存在,通過這個接口,我們可以操縱瀏覽器中曾經訪問過的會話歷史記錄,但當時我們能使用的屬性與方法只有這麼幾個:,從 html5 開始,增加了兩個新的方法:,至此,這個 API 擁有的方法就都梳理完了。但是剛剛說到了 state 對象關聯的一個事件,所以在這裏把 popstate 事件也描述一下。,大致上看,history API 的支持情況還是很不錯的,可以點擊此處查看各個瀏覽器對 history 的支持情況。

沐鳴:_CSS屬性書寫順序

鏈接: http://www.fly63.com/article/detial/10139,
,生活中衡量一個人有氣質:穿着打扮舉止言行等等,編程中如何衡量一個人的代碼能力?規範標準優雅高質量等等一個詞形容專業從代碼中看出是否有經驗..,.jdc {

 display: block;

 position: relative;

 float: left;

 width: 100px;

 height: 100px;

 margin: 0 10px;

 padding: 20px 0;

 font-family: Arial, ‘Helvetica Neue‘, Helvetica, sans-serif;

 color: #333;

 background: rgba(0,0,0,.5);

 -webkit-border-radius: 10px;

 -moz-border-radius: 10px;

 -o-border-radius: 10px;

 -ms-border-radius: 10px;

 border-radius: 10px;

},建議遵循以下順序:,
,代碼:,鏈接: http://www.fly63.com/article/detial/10139

沐鳴平台首頁_TypeScript 枚舉類型用法示例

鏈接: http://www.fly63.com/article/detial/10138,

沐鳴娛樂業務:_掌握 Promise 的邏輯方法

在後文中使用詞語“成功”表示承諾 resolve,“失敗”表示承諾 reject,Promise 對象有幾個組合方法,可以將多個承諾合併成一個進行處理,Promise 是 ES2015 新增的對象,Promise.all,Promise.all(values),Promise.race,// 設置一個定時器,時間到了就 reject 一個承諾 const timeout = new Promise((resolve, reject) => { setTimeout(reject, 3000) }) const missions = fetch(‘/missions’) try { const res = await Promise.race([timeout, missions]) // missions 任務成功 } catch () { // 時間超過 3 秒了或者任務失敗了 },Promise.all 方法返回的承諾會等到參數中所有的承諾都成功之後才會成功,只要其中有一個失敗了則返回的承諾也會立即失敗,不會等到那些還掛起的承諾有結果,
,const coffee = fetch(‘/coffee’) const tea = fetch(‘/tea’) const me = fetch(‘/me’) // 我全都要 const res = await Promise.all([coffee, tea, me]),分別是 Promise.all, Promise.race, Promise.allSettled, Promise.any,這些方法都可以接收一組承諾,返回一個新的承諾,其中參數 values 是一個可迭代對象,比如數組,在後文中使用詞語“成功”表示承諾 resolve,“失敗”表示承諾 reject

杏耀註冊平台官網_JavaScript DOM

DOM,JavaScript DOM 編程,1,節點及其類型,③ 可以在整個 HTML 文檔的最後編寫類似代碼,但這不符合習慣

④ 一般的,在 body 節點之前編寫 js代碼,但需要利用 windom.onload 事件,該事件在當前文檔完全加載之後被觸發,如:,缺點:

 a,js 和 HTML 強耦合,不利於代碼的維護

 b,若 click 相應函數是比較複雜的,則需先定義一個函數,然後在 onclick 屬性中完成對函數的引用,比較麻煩

② 一般的,不能在 body 節點之前來直接獲取 body 內的節點,因為此時 html 文檔樹還沒有加載完成,獲取不到指定的節點,
,

沐鳴總代_對vue雙向綁定的理解?



,我們先從單向綁定切入,

,理解ViewModel,class Vue { constructor(options) { this.$options = options; this.$data = options.data; // 對data選項做響應式處理 observe(this.$data); // 代理data到vm上 proxy(this); // 執行編譯 new Compile(options.el, this); } },三、如何實現雙向數據,class Compile { constructor(el, vm) { this.$vm = vm; this.$el = document.querySelector(el); // 獲取dom if (this.$el) { this.compile(this.$el); } } compile(el) { const childNodes = el.childNodes; Array.from(childNodes).forEach((node) => { // 遍歷子元素 if (this.isElement(node)) { // 判斷是否為節點 console.log(“編譯元素” + node.nodeName); } else if (this.isInterpolation(node)) { console.log(“編譯插值⽂本” + node.textContent); // 判斷是否為插值文本 {{}} } if (node.childNodes && node.childNodes.length > 0) { // 判斷是否有子元素 this.compile(node); // 對子元素進行遞歸遍歷 } }); } isElement(node) { return node.nodeType == 1; } isInterpolation(node) { return node.nodeType == 3 && /\{\{(.*)\}\}/.test(node.textContent); } },關係圖如下,當用戶填寫表單時,View的狀態就被更新了,如果此時可以自動更新Model的狀態,那就相當於我們把Model和View做了雙向綁定,function observe(obj) { if (typeof obj !== “object” || obj == null) { return; } new Observer(obj); } class Observer { constructor(value) { this.value = value; this.walk(value); } walk(obj) { Object.keys(obj).forEach((key) => { definereactive(obj, key, obj[key]); }); } },單向綁定非常簡單,就是把Model綁定到View,當我們用JavaScript代碼更新Model時,View就會自動更新,雙向綁定就很容易聯想到了,在單向綁定的基礎,用戶更新了View,Model的數據也自動被更新了,這種情況就是雙向綁定,舉個栗子,

沐鳴登錄網站_Vue實現隨機驗證碼功能

3、methods中:,
,步驟1 創建一個名為identify.vue的子組件,<template>

<div class=”s-canvas”>

<canvas id=”s-canvas” :width=”contentWidth” :height=”contentHeight”></canvas>

</div>

</template>

<script>

export default {

name: ‘SIdentify’,

props: {

// 默認註冊碼

identifyCode: {

type: String,

default: “1234”

},

// 字體最小值

fontSizeMin: {

type: Number,

default: 35

},

// 字體最大值

fontSizeMax: {

type: Number,

default: 35

},

// 背景顏色色值最小值

backgroundColorMin: {

type: Number,

default: 180

},

// 背景顏色色值最大值

backgroundColorMax: {

type: Number,

default: 240

},

// 字體顏色色值最小值

colorMin: {

type: Number,

default: 50

},

// 字體顏色色值最大值

colorMax: {

type: Number,

default: 160

},

// 干擾線顏色色值最小值

lineColorMin: {

type: Number,

default: 100

},

// 干擾線顏色色值最大值

lineColorMax: {

type: Number,

default: 200

},

// 干擾點顏色色值最小值

dotColorMin: {

type: Number,

default: 0

},

// 干擾點顏色色值最大值

dotColorMax: {

type: Number,

default: 255

},

// 畫布寬度

contentWidth: {

type: Number,

default: 120

},

// 畫布高度

contentHeight: {

type: Number,

default: 40

}

},

methods: {

// 生成一個隨機數

randomNum(min, max) {

return Math.floor(Math.random() * (max – min) + min)

},

// 生成一個隨機的顏色

randomColor(min, max) {

let r = this.randomNum(min, max)

let g = this.randomNum(min, max)

let b = this.randomNum(min, max)

return ‘rgb(‘ + r + ‘,’ + g + ‘,’ + b + ‘)’

},

drawPic() {

let canvas = document.getElementById(‘s-canvas’)

let ctx = canvas.getContext(‘2d’)

ctx.textBaseline = ‘bottom’

// 繪製背景

ctx.fillStyle = this.randomColor(this.backgroundColorMin, this.backgroundColorMax)

ctx.fillRect(0, 0, this.contentWidth, this.contentHeight)

// 繪製文字

for (let i = 0; i < this.identifyCode.length; i++) {

this.drawText(ctx, this.identifyCode[i], i)

}

this.drawLine(ctx)

this.drawDot(ctx)

},

drawText(ctx, txt, i) {

// 隨機生產字體顏色

ctx.fillStyle = this.randomColor(this.colorMin, this.colorMax)

// 隨機生成字體大小

ctx.font = this.randomNum(this.fontSizeMin, this.fontSizeMax) + ‘px SimHei’

let x = (i + 1) * (this.contentWidth / (this.identifyCode.length + 1))

let y = this.randomNum(this.fontSizeMax, this.contentHeight – 5)

var deg = this.randomNum(-45, 45)

// 修改坐標原點和旋轉角度

ctx.translate(x, y)

ctx.rotate(deg * Math.PI / 180)

ctx.fillText(txt, 0, 0)

// 恢復坐標原點和旋轉角度

ctx.rotate(-deg * Math.PI / 180)

ctx.translate(-x, -y)

},

drawLine(ctx) {

// 繪製干擾線

for (let i = 0; i < 5; i++) {

ctx.strokeStyle = this.randomColor(this.lineColorMin, this.lineColorMax)

ctx.beginPath()

ctx.moveTo(this.randomNum(0, this.contentWidth), this.randomNum(0, this.contentHeight))

ctx.lineTo(this.randomNum(0, this.contentWidth), this.randomNum(0, this.contentHeight))

ctx.stroke()

}

},

drawDot(ctx) {

// 繪製干擾點

for (let i = 0; i < 80; i++) {

ctx.fillStyle = this.randomColor(0, 255)

ctx.beginPath()

ctx.arc(this.randomNum(0, this.contentWidth), this.randomNum(0, this.contentHeight), 1, 0, 2 * Math.PI)

ctx.fill()

}

}

},

watch: {

identifyCode() {

this.drawPic()

}

},

mounted() {

this.drawPic()

}

}

</script>,鏈接: http://www.fly63.com/article/detial/10027,步驟2 在子組件中進行註冊和引用 ,步驟3 在主頁面中使用子組件

1、template中:,2、 data中:,3、methods中:

沐鳴網址_框架源碼中用來提高擴展性的設計模式

用過Axios的朋友應該知道,Axios的攔截器有請求攔截器和響應攔截器,執行的順序是請求攔截器 -> 發起請求 -> 響應攔截器,這其實就是一個鏈條上串起了三個職責。下面我們來看看這個鏈條怎麼實現:,
,我們寫的代碼都是為了一定的需求服務的,但是這些需求並不是一成不變的,當需求變更了,如果我們代碼的擴展性很好,我們可能只需要簡單的添加或者刪除模塊就行了,如果擴展性不好,可能所有代碼都需要重寫,那就是一場災難了,所以提高代碼的擴展性是勢在必行的。怎樣才算有好的擴展性呢?好的擴展性應該具備以下特徵:,實例:Axios攔截器,// 先從用法入手,一般我們添加攔截器是這樣寫的
// instance.interceptors.request.use(fulfilled, rejected)
// 根據這個用法我們先寫一個Axios類。
function Axios() {
// 實例上有個interceptors對象,裏面有request和response兩個屬性
// 這兩個屬性都是InterceptorManager的實例
this.interceptors = {
request:
new InterceptorManager(),
response:
new InterceptorManager() }; }
// 然後是實現InterceptorManager類
function InterceptorManager() {
// 實例上有一個數組,存儲攔截器方法
this.handlers = []; }
// InterceptorManager有一個實例方法use InterceptorManager.prototype.use =
function(fulfilled, rejected) {
// 這個方法很簡單,把傳入的回調放到handlers裏面就行
this.handlers.push({ fulfilled, rejected }) },實例:職責鏈組織表單驗證,// 前端驗證先寫個方法
function frontEndValidator(inputValue) {
return
Promise.resolve(inputValue);
// 注意返回值是個promise }
// 後端驗證也寫個方法
function backEndValidator(inputValue) {
return
Promise.resolve(inputValue); }
// 寫一個驗證器
function validator(inputValue) {
// 仿照Axios,將各個步驟放入一個數組
const validators = [frontEndValidator, backEndValidator];
// 前面Axios是循環調用promise.then來執行的職責鏈,我們這裏換個方式,用async來執行下
async
function runValidate() {
let result = inputValue;
while(validators.length) { result =
await validators.shift()(result); }
return result; }
// 執行runValidate,注意返回值也是一個promise runValidate().then(
(res) => {
console.log(res)}); }
// 上述代碼已經可以執行了,只是我們沒有具體的校驗邏輯,輸入值會原封不動的返回 validator(
123);
// 輸出: 123,上述代碼是從Axios源碼中精簡出來的,可以看出他巧妙的運用了職責鏈模式,將需要做的任務組織成一個鏈條,這個鏈條上的任務相互不影響,攔截器可有可無,而且可以有多個,兼容性非常強。,上面的代碼其實就完成了攔截器創建和use的邏輯,並不複雜,那這些攔截器方法都是什麼時候執行呢?當然是我們調用instance.request的時候,調用instance.request的時候真正執行的就是請求攔截器 -> 發起請求 -> 響應攔截器鏈條,所以我們還需要來實現下Axios.prototype.request:,Axios.prototype.request =
function(config) {
// chain裏面存的就是我們要執行的方法鏈條
// dispatchRequest是發起網絡請求的方法,本文主要講設計模式,這個方法就不實現了
// chain裏面先把發起網絡請求的方法放進去,他的位置應該在chain的中間
const chain = [dispatchRequest,
undefined];
// chain前面是請求攔截器的方法,從request.handlers裏面取出來放進去
this.interceptors.request.handlers.forEach(
function unshiftRequestInterceptors(interceptor) { chain.unshift(interceptor.fulfilled, interceptor.rejected); });
// chain後面是響應攔截器的方法,從response.handlers裏面取出來放進去
this.interceptors.response.handlers.forEach(
function pushResponseInterceptors(interceptor) { chain.push(interceptor.fulfilled, interceptor.rejected); });
// 經過上述代碼的組織,chain這時候是這樣的:
// [request.fulfilled, request.rejected, dispatchRequest, undefined, response.fulfilled,
// response.rejected]
// 這其實已經按照請求攔截器 -> 發起請求 -> 響應攔截器的順序排好了,拿來執行就行
let promise =
Promise.resolve(config);
// 先來個空的promise,好開啟then
while (chain.length) {
// 用promise.then進行鏈式調用 promise = promise.then(chain.shift(), chain.shift()); }
return promise; },當然是從優秀的代碼身上學習了,本文會深入Axios,Node.js,vue等優秀框架,從他們源碼總結幾種設計模式出來,然後再用這些設計模式嘗試解決下工作中遇到的問題。本文主要會講職責鏈模式,觀察者模式,適配器模式,裝飾器模式。下面一起來看下吧:,
,職責鏈模式顧名思義就是一個鏈條,這個鏈條上串聯了很多的職責,一個事件過來,可以被鏈條上的職責依次處理。他的好處是鏈條上的各個職責,只需要關心自己的事情就行了,不需要知道自己的上一步是什麼,下一步是什麼,跟上下的職責都不耦合,這樣當上下職責變化了,自己也不受影響,往鏈條上添加或者減少職責也非常方便。,用過Axios的朋友應該知道,Axios的攔截器有請求攔截器和響應攔截器,執行的順序是請求攔截器 -> 發起請求 -> 響應攔截器,這其實就是一個鏈條上串起了三個職責。下面我們來看看這個鏈條怎麼實現: