HTML5
使用FileReader實作前端圖片預覽
<input type="file"><br>
<img src="" height="200" alt="Image preview area..." title="preview-img">
var fileInput = document.querySelector('input[type=file]');
var previewImg = document.querySelector('img');
fileInput.addEventListener('change', function () {
var file = this.files[0];
var reader = new FileReader();
reader.addEventListener('load', function () {
previewImg.src = reader.result;
}, false);
reader.readAsDataURL(file);
}, false);
取到頁面中所有的checkbox怎么做?(不使用第三方框架)
var doc = document,
domList = doc.getElementsByTagName('input'),
checkBoxList = [],
len = domList.length;
while (len--) {
if (domList[len].type === 'checkbox') {
checkBoxList.push(domList[len]);
}
}
JavaScript模版引擎小實體
<div class="result"></div>
<script type="template" id="template">
<h2>
<a href="{{href}}">
{{title}}
</a>
</h2>
<img src="{{imgSrc}}" width="300" height="100" alt="{{title}}"/>
</script>
資料
var data = [
{
title: "",
href: "",
imgSrc: ""
},
...
];
方法一:
var doc = document,
template = doc.querySelector('#template').innerHTML,
result = doc.querySelector('.result'),
fragment = '';
for (var i = 0, len = data.length; i < len; i++) {
fragment += template
.replace(/\{\{title\}\}/, data[i].title)
.replace(/\{\{href\}\}/, data[i].href)
.replace(/\{\{imgSrc\}\}/, data[i].imgSrc)
}
result.innerHTML = fragment;
方法二:
var doc = document,
template = doc.querySelector('#template').innerHTML,
result = doc.querySelector('.result'),
attachTemplateToData;
attachTemplateToData = function (template, data) {
var i = 0,
len = data.length,
fragment = '';
function replace(obj) {
var t, key, reg;
for (key in obj) {
reg = new RegExp('{{' + key + '}}', 'ig');
t = (t || template).replace(reg, obj[key]);
}
return t;
}
for (; i < len; i++) {
fragment += replace(data[i]);
}
return fragment;
};
result.innerHTML = attachTemplateToData(template, data);
JavaScript
實作JS函式多載
var people = {
values: ["Dean Edwards", "Sam Stephenson", "Alex Russell", "Dean Tom"]
};
function addMethod(object, name, fn) {
var old = object[name];
object[name] = function () {
if (fn.length === arguments.length) {
return fn.apply(this, arguments);
} else if (typeof old === 'function') {
return old.apply(this, arguments);
}
}
}
addMethod(people, "find", function () {
return this.values;
});
addMethod(people, "find", function (firstName) {
var ret = [];
for (var i = 0; i < this.values.length; i++) {
if (this.values[i].indexOf(firstName) === 0) {
ret.push(this.values[i]);
}
}
return ret;
});
addMethod(people, "find", function (firstName, lastName) {
var ret = [];
for (var i = 0; i < this.values.length; i++) {
if (this.values[i] === (firstName + ' ' + lastName)) {
ret.push(this.values[i]);
}
}
return ret;
});
console.log(people.find());
console.log(people.find("Sam"));
console.log(people.find("Dean Edwards"));
JS跨瀏覽器系結事件函式
常規實作方法
//跨瀏覽器添加事件
function addHandler(target, eventType, handler) {
//檢測瀏覽器型別,并且重寫addHandler方法
if (target.addEventListener) {
addHandler = function (target, eventType, handler) {
target.addEventListener(eventType, handler, false);
}
} else { //IE
addHandler = function (target, eventType, handler) {
target.attachEvent("on" + eventType, handler);
}
}
//呼叫新的函式
addHandler(target, eventType, handler);
}
//跨瀏覽器移除事件
function removeHandler(target, eventType, handler) {
//檢測瀏覽器型別,并且重寫addHandler方法
if (target.addEventListener) {
removeHandler = function (target, eventType, handler) {
target.removeEventListener(eventType, handler, false);
}
} else { //IE
removeHandler = function (target, eventType, handler) {
target.detachEvent("on", eventType, handler);
}
}
target.detachEvent("on" + eventType, handler);
}
優化方法
//系結事件
var addHandler = document.body.addEventListener ?
function (target, eventType, handler) {//DOM2
target.addEventListener(eventType, handler, false);
} :
function (target, eventType, handler) {//IE
target.attachEvent("on" + eventType, handler);
};
//移除事件
var removeHandler = document.body.removeEventListener ?
function (target, eventType, handler) {
target.removeEventListener(eventType, handler, false);
} :
function (target, eventType, handler) {
target.detachEvent("on" + eventType, handler);
};
JS單體模式
var shoppingCar = (function () {
//這個是由購物車構造器所創建的實體
var instance;
//購物車的構造器函式
function Trolley() {
this.date = new Date().getDate();//實體屬性,當前日期
}
//原型屬性,一個回傳當前日期的方法
Trolley.prototype.getDate = function () {
return this.date;
};
//暴露出去的公共API
return function () {
//如果實體不存在,那么就呼叫Trolley構造器實體化一個
if (!instance) {
instance = new Trolley();
}
//將實體回傳外部
return instance;
}
}());
var a = new shoppingCar();
var b = new shoppingCar();
console.log(a === b);//true
使用prototype屬性定義的物件方法
var dom = function () {};
dom.Show = function () {
alert("Show Message");
};
dom.prototype.Display = function () {
alert("Property Message");
};
dom.Display(); //error
dom.Show(); //Show Message
var d = new dom();
d.Display(); //Property Message
d.Show(); //error
1、不使用prototype屬性定義的物件方法,是靜態方法,只能直接用類名進行呼叫!另外,此靜態方法中無法使用this變數來呼叫物件其他的屬性!
2、使用prototype屬性定義的物件方法,是非靜態方法,只有在實體化后才能使用!其方法內部可以this來參考物件自身中的其他屬性!
閉包實作結果快取
var CachedSearchBox = (function () {
var cache = {},
table = [];
return {
attachSearchBox: function (dsid) {
if (dsid in cache) { //如果結果在快取中
return cache[dsid]; //直接回傳快取中的物件
}
var fsb = new uikit.webctrl.SearchBox(dsid);//新建
cache[dsid] = fsb;//更新快取
if (count.length > 100) {
delete cache[shift()];
}
return fsb;
},
clearSearchBox: function (dsid) {
if (dsid in cache) {
cache[dsid].clearSelection();
}
}
}
})();
CachedSearchBox.attachSearchBox('input');
我們開發中會碰到很多情況,設想我們有一個處理程序很耗時的函式物件,每次呼叫都會花費很長時間,
那么我們就需要將計算出來的值存盤起來,當呼叫這個函式的時候,首先在快取中查找,如果找不到,則進行計算,然后更新快取并回傳值,如果找到了,直接回傳查找到的值即可,閉包正是可以做到這一點,因為它不會釋放外部的參考,從而函式內部的值可以得以保留,
閉包實作封裝
var person = function () {
var name = "Default";
return {
getName: function () {
return name;
},
setName: function (newName) {
name = newName;
}
}
}();
console.log(person.name);//undefined
console.log(person.getName());//Default
person.setName("GoodMan");
console.log(person.getName());//GoodMan
閉包實作類和繼承
function Person() {
var name = "default";
return {
getName: function () {
return name;
},
setName: function (newName) {
name = newName;
}
}
}
var p = new Person();
p.setName('Tom');
console.log(p.getName());
var Jack = function () {
};
Jack.prototype = new Person();//繼承自Person
Jack.prototype.Say = function () { //添加私有方法
console.log("Hello,my name is Jack");
};
var j = new Jack();
j.setName("Jack");//Tom
j.Say();//Hello,my name is Jack
console.log(j.getName());//Jack
如何判斷某變數是否為陣列資料型別
if (typeof Array.isArray === "undefined") {
Array.isArray = function (arg) {
return Object.prototype.toString.call(arg) === "[object Array]"
};
}
Javascript繼承-借用建構式
var Widget = function (name) {
this.messages = [];
};
Widget.prototype.type = 'Widget';
var SubWidget = function (name) {
Widget.apply(this, Array.prototype.slice.call(arguments));
this.name = name;
};
SubWidget.prototype = Widget.prototype;
var sub1 = new SubWidget('foo');
var sub2 = new SubWidget('bar');
sub1.messages.push('foo');
sub2.messages.push('bar');
console.log(sub1.messages);//foo
console.log(sub2.messages);//bar
Javascript原型-封裝
var Dialog = (function () {
function Dialog() {
}
Dialog.prototype = {
init: function () {
console.log("ok");
}
};
return Dialog;
}());
var d = new Dialog();
d.init();//ok
通過閉包修正函式的背景關系(瀏覽器不支持解決方案)
if (!('bind' in Function.prototype)) {
Function.prototype.bind = function () {
var fn = this,
context = arguments[0],
args = Array.prototype.slice.call(arguments, 1);
return function () {
return fn.apply(context, args.concat(arguments));
}
}
}
優化JavaScript的建構式(new關鍵字的使用)
// 方法一:
function User(name, age) {
if (typeof Object.create === 'undefined') {
Object.create = function (prototype) {
function C() {
C.prototype = prototype;
return new C();
}
}
}
var self = this instanceof User ? this : Object.create(User.prototype);
self.name = name;
self.age = age;
return self;
}
// 方法二:
function Programmer(name, company, expertise) {
if (!(this instanceof Programmer)) {
return new Programmer(name, company, expertise);
}
this.name = name;
this.company = company;
this.expertise = expertise;
this.writeCode = function () {
console.log("Writing some public static thing..")
}
}
柯里化
var curry = function (fn) {
var limit = fn.length;
return function judgeCurry(...args) {
return function (...args) {
if (args.length >= limit) {
return fn.apply(null, args);
} else {
return function (...args2) {
return judgeCurry.apply(null, args.concat(args2))
}
}
}
}
};
var currySingle = fn => judgeCurry = (...args) => args.length >= fn.length ? fn.apply(null, args) : (...args2) => judgeCurry.apply(null, args.concat(args2));
物件拷貝與賦值
var obj = {
name: 'xiaoming',
age: 23
};
var newObj = obj;
newObj.name = 'xiaohua';
console.log(obj.name);//xiaohua
console.log(newObj.name);//xiaohua
我們將obj物件賦值給了newObj物件,從而改變newObj的name屬性,但是obj物件的name屬性也被篡改,這是因為實際上newObj物件獲得的只是一個記憶體地址,而不是真正的拷貝,所以obj物件被篡改,
var obj = {
name: 'xiaoming',
age: 23
};
var newObj = Object.assign({}, obj, {color: 'blue'});
newObj.name = 'xiaohua';
console.log(obj.name);//xiaoming
console.log(newObj.name);//xiaohua
console.log(newObj.color);//blue
利用**Object.assign()**方法進行物件的
深拷貝
可以避免源物件被篡改的可能,因為Object.assign()方法可以把任意多個的源物件自身的可列舉屬性拷貝給目標物件,然后回傳目標物件,
var obj = {
name: 'xiaoming',
age: 23
};
var newObj = Object.create(obj);
newObj.name = 'xiaohua';
console.log(obj.name);//xiaoming
console.log(newObj.name);//xiaohua
我們也可以使用**Object.create()**方法進行物件的拷貝,Object.create()方法可以創建一個具有指定原型物件和屬性的新物件,
CSS
居中
#main {
width: 440px;
margin: 0 auto;
position: relative;
text-align: center;
}
選單欄下拉
.menu > li {
display: block;
float: left;
position: relative;
}
JQuery
Q設定等高的列
<div class="equalHeight" style="border: 1px solid">
<p>First Line</p>
<p>Second Line</p>
<p>Third Line</p>
</div>
<div class="equalHeight" style="border: 1px solid">
<p>Column Two</p>
</div>
$(function () {
equalHeight(".equalHeight");
});
var maxHeight = 0;
function equalHeight(col) {
col = $(col);
col.each(function () {
if ($(this).height() > maxHeight) {
maxHeight = $(this).height()
}
});
col.height(maxHeight);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/236606.html
標籤:其他
上一篇:HTML+CSS仿BMW官網
