標簽‘JavaScript’

基于Array的JavaScript表達式執行函數實現

最近項目涉及到表達式,簡單封裝了一些功能,如表達式解析、執行等,解析不用說,網上很多表達式字符串解析為詞法樹的庫,我們也不必再造輪子(我用jsep進行解析),這里說下執行表達式的方式。

默認字符串解析抽象詞法樹按理說是可以直接解析執行的,只不過通常此類詞法樹要表達的內容過于多,數據的存儲也過于龐大,于是我們結合自己業務對關鍵數據做了抽象,比如

查看更多...

我為什么選擇Nunjucks作為NodeJS模板引擎

最近換了工作,在新的工作中,需要實現后端渲染,故而一改最初的純html+js形式,選擇頁面框架、TDK及部分頁面后端渲染,由于后臺采用java開發,一開始曾考慮另起一個tomcat服務,用于渲染前端頁面,而實際搭建完框架后發現,一年多不碰java(期間雖然用過Groovy、kotlin,但實際開發起來還是不如js來得暢快),已經對java的繁瑣有些不耐煩,最后轉而選擇采用NodeJS做后端渲染,一來部分前端模板可以復用(后面發現復用其實是個很糾結的想法),二來做前端開發的兄弟也可以快速上手,相比他們并不懂的java來說,畢竟NodeJS更容易學習接受。

確定了適用NodeJS,下面就確定一下大概框架,采用了目前常見的組合——express+template,因為最初前端使用了所謂最快的模板引擎artTemplate,這里tempate想進行復用,就采用了服務器版artTemplate,實際測試發現并不符合我的需求,由于最近一年使用PHP的YII框架,其中模板layout可以使用block,很方便重寫樣式、腳本等部分,這里實測后發現,后端模板如果沒有layout,基本和寫純靜態無異了。 查看更多...

JavaScript函數究竟是值傳遞還是引用傳遞?

很多人認為 JavaScript中函數進行參數傳遞有兩種方式:基礎類型值傳遞;對象類型按引用傳遞。很長一段時間我也這樣認為,其實都是一種值傳遞。

事情是在近期QQ群里偶爾聊到,JavaScript函數傳值到底是值傳遞還是引用傳遞,看到有人說都是值,原因即使是對象也是傳了對象的拷貝,即對象的值本身。本著對技術的刨根問底兒的精神,查了相關資料,得到結論:ECMAScript中所有函數的參數都是按值來傳遞的

下面是一些相關概念的解釋,整理自網絡:

眾所周知,在JavaScript中數據類型可以分為兩類:

原始數據類型值 primitive type,比如Undefined,Null,Boolean,Number,String。

引用類型值,也就是對象類型 Object type,比如Object,Array,Function,Date等。 查看更多...

JS獲取鼠標點擊坐標五種方式及兼容性

關于js鼠標事件綜合各大瀏覽器能獲取到坐標的屬性總共以下五種

event.clientX/Y
event.pageX/Y
event.offsetX/Y
event.layerX/Y
event.screenX/Y

clientX/Y:

clientX/Y獲取到的是觸發點相對瀏覽器可視區域左上角距離,不隨頁面滾動而改變

兼容性:所有瀏覽器均支持 查看更多...

IE8及以下瀏覽器js中日期字符串格式化問題解決

最近一個小項目上涉及日期字符串格式化的問題,由于之前大部分工作中使用現有js框架自帶的組件庫,并沒有注意此類兼容性問題,直到最近才發現,原來在IE8及以下IE版本中,JavaScript的Date函數是不支持new Date("2013-12-31")、new Date("2013-12-31 00:00:00")或者new Date("2013-12-31T00:00:00Z")這樣的構造方式的。

網上關于字符串格式化的函數一般都雷同,如下

function dateFormat(dateString,format) {
            if(!dateString)return "";
            var time = new Date(dateString);
            var o = {
                "M+": time.getMonth() + 1, //月份
                "d+": time.getDate(), //日
                "h+": time.getHours(), //小時
                "m+": time.getMinutes(), //分
                "s+": time.getSeconds(), //秒
                "q+": Math.floor((time.getMonth() + 3) / 3), //季度
                "S": time.getMilliseconds() //毫秒
            };
            if (/(y+)/.test(format)) format = format.replace(RegExp.$1, (time.getFullYear() + "").substr(4 - RegExp.$1.length));
            for (var k in o)
                if (new RegExp("(" + k + ")").test(format)) format = format.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
            return format;
        }

查看更多...

Extjs 4.2 Grid增刪改及后臺交互(Java)

上次發了Easyui Datagrid的增刪改查的使用學習記錄后一直想整理下基于Extjs4.2的Grid學習使用記錄。苦于抽不出時間,一直拖到現在。不得不說,Extjs確實很強大,新版的Neptune風格也很入我眼,但畢竟沒怎么用過,第一次用,也不敢上來就搞什么自定義組件,也就純粹的model+store+panel聲明式創建表格了。

拋開分頁,拋開排序,今天只簡單講一下最近使用中總結出來的rest形式增刪改查數據的方式。發現這種方式挺不錯的,故而分享下。
代碼Example如下:
定義Model

Ext.define('Person', {
    extend: 'Ext.data.Model',
    fields: [{name: 'id',
        type: 'int',
        useNull: true
    }, 'email', 'first', 'last'],
    validations: [{ type: 'length',
        field: 'email',
        min: 1
    }, {type: 'length',
        field: 'first',
        min: 1
    }, {type: 'length',
        field: 'last',
        min: 1
    }]
});

查看更多...

Easyui Datagrid增刪改及后臺交互(java)

最近項目的特殊性可算是把我折騰得夠嗆,從最開始的整站JS,到現在的Liferay,且不說后臺,單單前臺框架就讓我從Dojo到YUI又到AUI、jQuery、ExtJS,常用API翻了一遍,常見問題解決了一遍,而歸根結底,為的就是一個方便好用、加載迅速的Grid控件。還好目前是定準用ExtJS了,不然常用控件都用一遍也沒找到完全合適的,就困難了。題外話至此,下面開始正題。

剛剛看到同學在之前發的文章,在使用Easyui DataGrid時遇到新增行數據在保存時不能獲取的問題,解決方法是在保存時先執行$('#example′).datagrid('acceptChanges');然后前臺獲取全部行,再拼裝字符串傳到后臺,這樣做是可以解決,但實際上Easyui Datagrid似乎有更好的API供調用。為了和我一樣的新手少走彎路,故寫此篇文章以便參考。 查看更多...

分享一段javascript編寫的editplus注冊機

一直以來,習慣于使用免費、特別版軟件的我,經常免不了去收集一些激活碼、注冊機,雖然殺毒軟件各種報毒,但為了便于使用和學習,還是忍住了。最近發現有朋友做了網頁版的editplus注冊機,看了下源碼原來是javascript寫的,于是就瞧瞧的拿來分享了。
wordpress原因,代碼可能會出現排版不整齊、符號被轉義等,想要原始代碼的朋友可以直接下載小子正在使用的js文件或者在線打開直接復制即可。

代碼鏈接:傳送門

廢話不說,code如下: 查看更多...

JavaScript:世界上誤解最深的語言

JavaScript,是世界上最流行的編程語言之一。事實上世界上的每一臺個人電腦都安裝并在頻繁使用至少一個JavaScript解釋器。JavaScript的流行完全是由于他在WWW腳本語言領域中的地位決定的。

Despite its popularity, few know that JavaScript is a very nice dynamic object-oriented general-purpose programming language. How can this be a secret? Why is this language so misunderstood?

盡管它很流行,但是很少有人知道JavaScript是一個非常棒的動態面向對象通用編程語言。這居然能成為一個秘密!這門語言為什么被誤解如此之深?

The Name

名字

The Java- prefix suggests that JavaScript is somehow related to Java, that it is a subset or less capable version of Java. It seems that the name was intentionally selected to create confusion, and from confusion comes misunderstanding. JavaScript is not interpreted Java. Java is interpreted Java. JavaScript is a different language.

Java- 前綴很容易使人聯想到Java,并認為它是Java的子集或簡化版的Java。 查看更多...

Ajax應用事件處理及瀏覽器內存泄漏實踐

事件處理是 Ajax 應用中的重要組成部分,也是應用動態變化的源動力。本文詳細介紹了瀏覽器中的事件處理相關的內容,包括注冊事件監聽器、事件發生之后的傳播機制、編寫事件監聽器等,還介紹了 Dojo 對事件處理提供的支持。最后介紹了與瀏覽器內存泄露和性能相關的最佳實踐。

瀏覽器中的事件是 Ajax 應用動態變化的源動力。用戶通過輸入設備(主要是鍵盤和鼠標)與應用進行互動。對于用戶不同的動作,如點擊鼠標左鍵、右鍵、或是按下鍵盤上的回車鍵,瀏覽器會產生與之對應的事件。這些事件按照一定的規則在當前文檔樹中傳播。應用可以根據自己的需要,對特定的事件進行處理,以響應用戶的動作。這種事件驅動的方式,不僅在 Web 應用中被使用,在桌面應用中也廣泛流行。本文詳細介紹了瀏覽器中事件處理的各個方面,包括事件監聽器的注冊、事件的傳播、事件處理和其它高級話題。本文還介紹了如何使用 Dojo 提供的 dojo.connect()。本文中使用的 Dojo 版本是 1.4。下面首先介紹如何注冊事件監聽器。

注冊事件監聽器

注冊事件監聽器的目的是在事件發生的時候添加相應的處理邏輯。瀏覽器中的事件處理采用經典的觀察者(Observer)設計模式。對于可能產生的各種事件,Ajax 應用通過腳本在節點上關注自己感興趣的事件,并添加相應的處理邏輯。當相應的事件發生并傳播到監聽器注冊的節點時,處理邏輯會被調用。 查看更多...

黑龙江22选5开奖