隨著各大互連網公司設立了Web前端開發工程師、設計工程師等職位,web前端越來越得到互連網企業的認可。而且其重視程度與地位也隨著瀏覽器端的富用戶端的體現而日益提高。 眼前對HTML5的未來和走向,業內的預測是會和Flash、Silverlight等相結合,從而取代傳統的用戶端應用程式。而實現這個目標的用戶端核心工作是有Web前端工程師來完成的。 從另一個角度,對於web產品來說,互動和使用者體驗是產品的第一價值,這部分價值的體現就是在web前端。可以說web前端是一個web產品的長相和談吐、行為。
下面就簡單的說明一下web前端的組成部分。
1. UI設計部分
這是web產品化的第一步。這個部分通常在稍大型的公司裡,被單獨設立為一個部門或者一些人來工作。主要是要掌握Photo, AI,可以很快的將創意轉化為平面設計圖,並製作PNG等小圖片。 同時,UI設計還要預包含使用者互動設計的元素,如何和使用者互動的基本原型等。
2. HTML/CSS,頁面靜態化
這是web產品化的2步,就是將UI設計師的設計圖切成靜態頁面。這裡的“切”不是單純的切,而是使用css裡面背景色和邊框樣式等方式對設計原稿進行解讀,並形成符合web標準的html代碼。這裡web前端還需要將圖片、html頁面以及css樣式進行合理的檔案分布安排等
3.Javascript, AS 用戶端動態化
這是web產品化的3步,工程師使用DOM操作、AJAX,實現資料和服務端的通訊以及本機樣式的切換。同時,由於Javascript、AS是一門動態語言,所以這部分的編碼要求web前端工程師有較好的編碼習慣,能寫高效率的OOP代碼,並對代碼進行壓縮上線以降低頻寬消耗等。
4.Flash、Silverlight、Video 多媒體化
這部分針對不同web產品有不同的要求,通常要求是可以使用Flash和web、Server進行互動,並對Flash進行設計與開發。
5.PHP、Java等CGI, 服務端通訊基本知識和編碼
這部分主要是更好的使用Ajax等技術,瞭解服務端的工作方式將更有利於web前端工程師工作的開展。通常優秀的web前端工程師都是對服務端的一種開發語言很瞭解。
下面是webryan整理的百度web前端筆試和面試的一些題目和過程,提供給大家借鑒。
百度web前端筆試試卷上的題目:
1.判斷字串是否是這樣組成的,第一個必須是字母,後面可以是字母、數字、底線,總長度為5-20
2.截取字串abcdefg的efg
3.讓一個input的背景顏色變成紅色
4。給一個頁面,寫html css
5。div的高寬等於瀏覽器可見地區的高寬,瀏覽器滾動,div始終覆蓋瀏覽器的整個可見地區
6。判斷一個字串中出現次數最多的字元,統計這個次數
7。IE與FF指令碼相容性問題
又重新問的是1,4,6,7,這次問出題者的意圖,並且讓給出7的更多答案,以及IE FF不相容的原因
然後看了看簡曆,沒有問簡曆上的項目,而是讓自己隨便談談
1對於web用戶端技術未來趨勢發展談談看法
javascript + ajax=RIA
Adobe Flash AS 3
Flex
Sliveright
2webTeam Dev人員應該如何分工協作
布局 CSS 指令碼
比如指令碼人員長期的積累可能鑄造類型YUI這樣的產品級指令碼庫(亮點)
3web開發曾經的團隊有沒有別人遇到問題,什麼問題,向你請教
4如果要實習,什麼時候可以
5自己在開發的過程中遇到什麼問題,談談看法
6web開發指令碼開發環境用什麼、調試用什麼
試過aptana,現在就用editplus
調試肯定用firebug,ie下看頁面DOM用IEInspector
7如果有個新技術,現在需要掌握,你會怎麼做
新技術的發現我一般是通過RSS工具,比如我用GoogleReader
每天有半個小時左右在看最新的資訊、技術走向
發現新技術,首先有個大概瞭解,如果有深入的必要
我一般會看他的官網,比如jquery,我會搜尋到www.jquery.com,然後看Docs、samples
如果要用到項目中,有困難的問題,我會svn得到最新的這個技術的源碼,深入跟蹤進去,看實現原理
一般現在湧現的技術都是opensource
提問時間
1百度web開發指令碼是否有做類似YUI庫的打算
2百度web開發工程師打算招多少人
百度電話二面回憶 web開發部–web開發工程師
首先是自我介紹
然後談談做的web項目
然後開始問技術問題
前端開發的最佳化問題
答:
產品發布時,js的壓縮,即函數名替換、整個檔案壓縮成一行
css開發的時候 注釋寫清楚,先有個base.css,然後根據不同頁面需要再加css,發布的時候將css中的一個定義寫成一行,目的是壓縮檔大小
最終發布的時候甚至可以將css,js分別壓縮成一個檔案,甚至css、js通過技巧壓縮到一個裡邊(亮點)
這樣的目的是,減少使用者訪問web產品的http串連數
web前端產品的開發流程
答:首先根據產品的定位、使用者群,確定配色,然後紙上設計整體布局,然後png或者psd出效果圖,切出需要的小圖片,然後手寫代碼div+css構造出頁面,然後根據功能寫指令碼
參考126郵箱首頁,將所有小圖片放到一個圖片中,通過css的background-position實現頁面,還是為了最佳化,減少http串連數
規避javascript多人開發函數重名問題
答:首先是通過命名規範,比如根據不同的開發人員實現的功能,在函數名加首碼,雖然函數名看起來複雜,發布的時候還是可以替換,從而最佳化。
還有一種辦法是,每個開發人員都把自己的函數封裝到類中,然後調用的時候即使函數名相同,但是因為是要類.函數名來調用,所以也減少了重複的可能性。
javascript物件導向中繼承實現
答:我是用prototype.js extend.js擴充
然後子類中parent.initialize()…
答的不好
正確答案:
// 1. 構造器
function Animal() {};
function Mammal() {};
function Canine() {};
function Dog() {};
// 2. 原型鏈表
Mammal.prototype = new Animal();
Canine.prototype = new Mammal();
Dog.prototype = new Canine();
prototype.js實現的基本原理
答:
將功能封裝
比如Ajax.Request,還是有判斷瀏覽器的代碼;Position這樣的實現頁面元素位置的計算
prototye太大,如果一個頁面功能不需要這樣的,自己實現,怎麼做
答:首先頁面、css、指令碼分離之後,指令碼中將整個模組功能寫成一個類var Do={}
其中初始化函數init:function(){},然後最後做Do.init()
其中init會對頁面上form中需要互動的元素繫結事件,比如$(’input1′).onclick=function(){}
IE、FF下面指令碼的區別
答:
1.IE有outerHTML,FF沒有
2.頁面元素id,IE可以直接取,FF必須document.getElementById()
3.Ajax裡邊FF是new XMLHttpRequest,而IE是
try new ActiveXObject(’Msxml2.XMLHTTP’) try new ActiveXObject(’Microsoft.XMLHTTP’)
FF下面實現outerHTML
答:.parenet.firstChild .parent.innerHTML
這個沒答好
正確答案:原理是,get:取到這個標籤的tagname,然後屬性迴圈構造成這個標籤的屬性
set:把字串用insertBefore插入到這個元素前面,然後removeChild這個元素
<head>
<SCRIPT LANGUAGE=”JavaScript”>
<!–
if(typeof(HTMLElement)!=”undefined” && !window.opera)
{
HTMLElement.prototype.__defineGetter__(”outerHTML”,function()
{
var a=this.attributes, str=”<”+this.tagName, i=0;
for(;i<a.length;i++)
if(a[i].specified)
str+=” “+a[i].name+’=”‘+a[i].value+’”‘;
if(!this.canHaveChildren)
return str+” />”;
return str+”>”+this.innerHTML+”</”+this.tagName+”>”;
});
HTMLElement.prototype.__defineSetter__(”outerHTML”,function(s)
{
var d = document.createElement(”DIV”); d.innerHTML = s;
for(var i=0; i<d.childNodes.length; i++)
this.parentNode.insertBefore(d.childNodes[i], this);
this.parentNode.removeChild(this);
});
HTMLElement.prototype.__defineGetter__(”canHaveChildren”,function()
{
return !/^(areabasebasefontcolframehrimgbrinputisindexlinkmetaparam)$/.test(this.tagName.toLowerCase());
});
}
//–>
</SCRIPT>
IE、FF下面CSS的解釋區別
答:
1.png透明背景,FF下面沒有問題,IE需要用濾鏡通道
2.z-index在IE、FF下面的解釋問題,
IE會認為第一個z-index=0
3.長字串,word-wrap:break-all可以解決IE,但是FF需要overflow:hidden才行
馮舒婭補充:
1、有些標籤在ff中不能用,比如button
2、濾鏡
3、滑鼠cursor:hand cursor:pointer
4、div的高度自適應
5、對box模型解析不一樣
6、ul、ol的padding和margin
IE都能識別*,標準瀏覽器(如FF)不能識別*;
IE6能識別*,但不能識別 !important;
IE7能識別*,也能識別 !important;
FF不能識別*,但能識別 !important;
例如style=”*width:10px;!important width:20px;”
這樣在IE6下寬度為10px,在IE7下寬度時20px
web前端技術的展望
答:javascript ajax;flash AS;Flex;Sliveright
附上網上的百度web開發工程師筆試問題集
1編寫一個方法 求一個字串的位元組長度
<script language=”javascript” type=”text/javascript”>
new function(s)
{
if(!arguments.length!s) return null;
if(”"==s) return 0;
var l=0;
for(var i=0;i<s.length;i++)
{
if(s.charCodeAt(i)>255) l+=2;
else l++;
}
alert(l);
}(”hello你好,我好,大家好!world!”);
</script>
2編寫一個方法 去掉一個數組的重複元素
<script language=”javascript” type=”text/javascript”>
Array.prototype.strip=function()
{
if(this.length<2) return [this[0]][];
var arr=[];
for(var i=0;i<this.length;i++)
{
arr.push(this.splice(i–,1));
for(var j=0;j<this.length;j++)
{
if(this[j]==arr[arr.length-1])
{
this.splice(j–,1);
}
}
}
return arr;
}
var arr=["abc",85,"abc",85,8,8,1,2,5,4,7,8];
alert(arr.strip());
</script>
3說出3條以上ff和ie的指令碼相容問題
IE 有children,FF沒有;IE有parentElement,FF沒有;IE有innerText,outerText,outerHTML,FF 沒有;FF有HTMLElement,HTMLDivElement,XMLDocument,DocumentFragment,Node, Event,Element等等,IE沒有;IE有資料島,FF沒有;IE跟FF建立HttpRequest執行個體的方法不一樣。。等等。。
4用指令碼寫去除字串的前後空格
String.prototype.trim = function(mode)
{//前後去空格
if (mode==’left’) {
return ((this.charAt(0) == ” “ && this.length > 0) ? this.slice(1).trim(’left’) : this);
} else
if (mode == ’right’) {
return ((this.charAt(this.length - 1) == ” “ && this.length > 0) ? this.slice(0, this.length - 1).trim(’right’) : this);
} else {
return this.trim(’left’).trim(’right’);
}
};
5算出字串中出現次數最多的字元是什麼,出現了多少次
<script type=”text/javascript”>
//<![CDATA[var str ="adadfdfseffserfefsefseeffffftsdg"; //命名一個變數放置給出的字串
var maxLength = 0; //命名一個變數放置字母出現的最高次數並初始化為0
var result = ''; //命名一個變數放置結果輸入
while( str != '' ){ //迴圈迭代開始,並判斷字串是否為空白
oldStr = str; //將原始的字串變數賦值給新變數
getStr = str.substr(0,1); //用字串的substr的方法得到第一個字元(首字母)
eval("str = str.replace(/"+getStr+"/g,'')"); //詳細如補充
if( oldStr.length-str.length > maxLength )
{ //判斷原始的字串的長度減去替代後字串長度是否大於之前出現的最大的字串長度
maxLength = oldStr.length-str.length; //兩字串長度相減得到最大的字串長度
result = getStr + "=" + maxLength //返回最大的字串結果(字母、出現次數)
}
}
alert(result) //彈出結果
//]]>
</script>
6寫出3中使用this的典型應用
在HTML元素事件屬性中inline方式使用this關鍵字:
7.最後一個問題是,如何製作一個combo選項,就是可以輸入可以下拉式功能表選擇。
這個網上有很多成品,主要是通過絕對位置和相對定位結合的方式,改造原有的select 標籤和input標籤的方法。
附上javascriptRegex的基本知識:
g: 全域匹配
i: 忽略大小寫
^ 匹配一個輸入或一行的開頭,/^a/匹配”an A”,而不匹配”An a”
$ 匹配一個輸入或一行的結尾,/a$/匹配”An a”,而不匹配”an A”
* 匹配前面元字元0次或多次,/ba*/將匹配b,ba,baa,baaa
+ 匹配前面元字元1次或多次,/ba*/將匹配ba,baa,baaa
? 匹配前面元字元0次或1次,/ba*/將匹配b,ba
(x) 匹配x儲存x在名為$1…$9的變數中
xy 匹配x或y
{n} 精確匹配n次
{n,} 匹配n次以上
{n,m} 匹配n-m次
[xyz] 字元集(character set),匹配這個集合中的任一一個字元(或元字元)
[^xyz] 不匹配這個集合中的任何一個字元
[b] 匹配一個退格符
b 匹配一個單詞的邊界
B 匹配一個單詞的非邊界
cX 這兒,X是一個控制符,/cM/匹配Ctrl-M
d 匹配一個字數字元,/d/ = /[0-9]/
D 匹配一個非字數字元,/D/ = /[^0-9]/
n 匹配一個分行符號
r 匹配一個斷行符號符
s 匹配一個空白字元,包括n,r,f,t,v等
S 匹配一個非空白字元,等於/[^nfrtv]/
t 匹配一個定位字元
v 匹配一個重直定位字元
w 匹配一個可以組成單詞的字元(alphanumeric,這是我的意譯,含數字),包括底線,如[w]匹配”$5.98″中的5,等於[a-zA-Z0-9]
W 匹配一個不可以組成單詞的字元,如[W]匹配”$5.98″中的$,等於[^a-zA-Z0-9
舉例:驗證email
var myReg = /^[_a-z0-9]+@([_a-z0-9]+.)+[a-z0-9]{2,3}$/;
if(myReg.test(strEmail)) return true;