天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

Prototype String對(duì)象 學(xué)習(xí)

復(fù)制代碼 代碼如下:
//String對(duì)象的靜態(tài)方法
Object.extend(String, {
interpret: function(value) {
return value == null ? '' : String(value);
},
specialChar: {
'/b': '//b',
'/t': '//t',
'/n': '//n',
'/f': '//f',
'/r': '//r',
'//': '////'
}
});

Object.extend(String.prototype, (function() {

//內(nèi)部方法,為gsub和sub函數(shù)初始化replacement參數(shù)
function prepareReplacement(replacement) {
if (Object.isFunction(replacement)) return replacement;
var template = new Template(replacement);
return function(match) { return template.evaluate(match) };
}

//用replacement替換所有符合pattern的字符串
//注意當(dāng)replacement不為函數(shù)時(shí),這里面會(huì)有一個(gè)遞歸調(diào)用,其中參數(shù)pattern會(huì)變?yōu)門(mén)emplate.pattern
//可以參考Template的evaluate方法,這里構(gòu)造的非常巧妙,在while循環(huán)里的else部分會(huì)處理這個(gè)遞歸調(diào)用的結(jié)果
function gsub(pattern, replacement) {
var result = '', source = this, match;
replacement = prepareReplacement(replacement);

if (Object.isString(pattern))
pattern = RegExp.escape(pattern);

//如果pattern參數(shù)為null或者'',用把整個(gè)字符串按照單個(gè)字符分割,并且在每個(gè)字符的前后添加replacement
if (!(pattern.length || pattern.source)) {
replacement = replacement('');
return replacement + source.split('').join(replacement) + replacement;
}

while (source.length > 0) {
     //如果source匹配pattern
if (match = source.match(pattern)) {
         //取出匹配之前的字符串
result += source.slice(0, match.index);
        //匹配替換
result += String.interpret(replacement(match));
        //把匹配字符之后的部分賦給source,進(jìn)行下一次匹配
source = source.slice(match.index + match[0].length);
} else { //如果source不匹配pattern,則直接把source添加到結(jié)果上,并把source置空,結(jié)束循環(huán)
result += source, source = '';
}

}
return result;
}

//基本意思和gsub一樣,只不過(guò)多一個(gè)count參數(shù),表示要替換幾次
function sub(pattern, replacement, count) {
replacement = prepareReplacement(replacement);
count = Object.isUndefined(count) ? 1 : count;

return this.gsub(pattern, function(match) {
if (--count < 0) return match[0];
return replacement(match);
});
}

//對(duì)符合pattern的字符串進(jìn)行iterator調(diào)用
function scan(pattern, iterator) {
this.gsub(pattern, iterator);
return String(this);
}

//按照給定長(zhǎng)度截?cái)嘧址?
function truncate(length, truncation) {
length = length || 30;
truncation = Object.isUndefined(truncation) ? '...' : truncation;
return this.length > length ?
this.slice(0, length - truncation.length) + truncation : String(this);
}

//剔除字符串前后空格
function strip() {
return this.replace(/^/s+/, '').replace(//s+$/, '');
}

//把字符串的html標(biāo)記剔除
function stripTags() {
return this.replace(/</w+(/s+("[^"]*"|'[^']*'|[^>])+)?>|<///w+>/gi, '');
}

//把字符串中的script標(biāo)記剔除
function stripScripts() {
return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
}

//獲取字符串中的script內(nèi)容
function extractScripts() {
var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
return (this.match(matchAll) || []).map(function(scriptTag) {
return (scriptTag.match(matchOne) || ['', ''])[1];
});
}

//執(zhí)行字符串中的script內(nèi)容
function evalScripts() {
return this.extractScripts().map(function(script) { return eval(script) });
}

//轉(zhuǎn)義HTML內(nèi)容,例如把'<>&'等特殊字符替換成標(biāo)準(zhǔn)的HTML表達(dá)形式
function escapeHTML() {
escapeHTML.text.data = this;
return escapeHTML.div.innerHTML;
}

function unescapeHTML() {
var div = document.createElement('div');
div.innerHTML = this.stripTags();
return div.childNodes[0] ? (div.childNodes.length > 1 ?
$A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) :
div.childNodes[0].nodeValue) : '';
}

//按照separator參數(shù)把字符串分割成查詢(xún)參數(shù)形式
function toQueryParams(separator) {
var match = this.strip().match(/([^?#]*)(#.*)?$/);
if (!match) return { };

return match[1].split(separator || '&').inject({ }, function(hash, pair) {
if ((pair = pair.split('='))[0]) {
var key = decodeURIComponent(pair.shift());
var value = pair.length > 1 ? pair.join('=') : pair[0];
if (value != undefined) value = decodeURIComponent(value);

if (key in hash) {
if (!Object.isArray(hash[key])) hash[key] = [hash[key]];
hash[key].push(value);
}
else hash[key] = value;
}
return hash;
});
}

function toArray() {
return this.split('');
}

//返回字符串的字符
function succ() {
return this.slice(0, this.length - 1) +
String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
}

//獲得重復(fù)的字符串
function times(count) {
return count < 1 ? '' : new Array(count + 1).join(this);
}

//把css樣式類(lèi)型的字符串轉(zhuǎn)換成腳本形式
function camelize() {
var parts = this.split('-'), len = parts.length;
if (len == 1) return parts[0];

var camelized = this.charAt(0) == '-'
? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
: parts[0];

for (var i = 1; i < len; i++)
camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);

return camelized;
}

//首字母大寫(xiě)
function capitalize() {
return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
}

//'borderBottomWidth'.underscore();
// -> 'border_bottom_width'
function underscore() {
return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z/d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();
}

//'border_bottom_width'.dasherize();
// -> 'border-bottom-width'
function dasherize() {
return this.gsub(/_/,'-');
}

//Returns a debug-oriented version of the string(返回一個(gè)用來(lái)調(diào)式的字符串)
function inspect(useDoubleQuotes) {
var escapedString = this.gsub(/[/x00-/x1f//]/, function(match) {
var character = String.specialChar[match[0]];
return character ? character : '//u00' + match[0].charCodeAt().toPaddedString(2, 16);
});
if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '//"') + '"';
return "'" + escapedString.replace(/'/g, '///'') + "'";
}

function toJSON() {
return this.inspect(true);
}

function unfilterJSON(filter) {
return this.sub(filter || Prototype.JSONFilter, '#{1}');
}

function isJSON() {
var str = this;
if (str.blank()) return false;
str = this.replace(///./g, '@').replace(/"[^"http:///n/r]*"/g, '');
return (/^[,:{}/[/]0-9./-+Eaeflnr-u /n/r/t]*$/).test(str);
}

//Strips comment delimiters around Ajax JSON or JavaScript responses. This security method is called internally.
function evalJSON(sanitize) {
var json = this.unfilterJSON();
try {
if (!sanitize || json.isJSON()) return eval('(' + json + ')');
} catch (e) { }
throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
}

function include(pattern) {
return this.indexOf(pattern) > -1;
}

function startsWith(pattern) {
return this.indexOf(pattern) === 0;
}

function endsWith(pattern) {
var d = this.length - pattern.length;
return d >= 0 && this.lastIndexOf(pattern) === d;
}

function empty() {
return this == '';
}

function blank() {
return /^/s*$/.test(this);
}

//和Template的evaluate方法一樣
function interpolate(object, pattern) {
return new Template(this, pattern).evaluate(object);
}

return {
gsub: gsub,
sub: sub,
scan: scan,
truncate: truncate,
strip: String.prototype.trim ? String.prototype.trim : strip,
stripTags: stripTags,
stripScripts: stripScripts,
extractScripts: extractScripts,
evalScripts: evalScripts,
escapeHTML: escapeHTML,
unescapeHTML: unescapeHTML,
toQueryParams: toQueryParams,
parseQuery: toQueryParams,
toArray: toArray,
succ: succ,
times: times,
camelize: camelize,
capitalize: capitalize,
underscore: underscore,
dasherize: dasherize,
inspect: inspect,
toJSON: toJSON,
unfilterJSON: unfilterJSON,
isJSON: isJSON,
evalJSON: evalJSON,
include: include,
startsWith: startsWith,
endsWith: endsWith,
empty: empty,
blank: blank,
interpolate: interpolate
};
})());

Object.extend(String.prototype.escapeHTML, {
div: document.createElement('div'),
text: document.createTextNode('')
});

String.prototype.escapeHTML.div.appendChild(String.prototype.escapeHTML.text);
//以下估計(jì)是解決瀏覽器兼容問(wèn)題
if ('</n>'.escapeHTML() !== '</n>') {
String.prototype.escapeHTML = function() {
return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
};
}

if ('</n>'.unescapeHTML() !== '</n>') {
String.prototype.unescapeHTML = function() {
return this.stripTags().replace(/</g,'<').replace(/>/g,'>').replace(/&/g,'&');
};
}

blank
camelize
capitalize
dasherize
empty
endsWith
escapeHTML
evalJSON
evalScripts
extractScripts
gsub
include
inspect
interpolate
isJSON
parseQuery
scan
startsWith
strip
stripScripts
stripTags
sub
succ
times
toArray
toJSON
toQueryParams
truncate
underscore
unescapeHTML
unfilterJSON
下面只給出一些重要方法的例子,簡(jiǎn)單方法就略過(guò)了

escapeHTML() /unescapeHTML() :
復(fù)制代碼 代碼如下:
'<div class="article">This is an article</div>'.escapeHTML();
// -> "<div class="article">This is an article</div>"

'x > 10'.unescapeHTML()
// -> 'x > 10' '<h1>Pride & Prejudice</h1>'.unescapeHTML()
// -> 'Pride & Prejudice'

evalJSON() /evalScripts()

String對(duì)象里面的有幾個(gè)方法是為了防止XSS Attack攻擊的,有興趣的可以搜一下,下面給出XSS的概念:

Cross-site scripting (XSS) is a type of computer security vulnerability typically found in web applications which allow code injection by malicious web users into the web pages viewed by other users.
復(fù)制代碼 代碼如下:
var person = '{ "name": "Violet", "occupation": "character" }'.evalJSON();
person.name;
//-> "Violet"

person = 'grabUserPassword()'.evalJSON(true);
//-> SyntaxError: Badly formed JSON string: 'grabUserPassword()'

person = '/*-secure-/n{"name": "Violet", "occupation": "character"}/n*/'.evalJSON()
person.name;
//-> "Violet"

復(fù)制代碼 代碼如下:
'lorem... <script type="text/Javascript"><!--
2 + 2
// --></script>'.evalScripts();
// -> [4]

'<script type="text/Javascript"><!--
2 + 2
// --></script><script type="text/Javascript"><!--
alert("hello world!")
// --></script>'.evalScripts();
// -> [4, undefined] (and displays 'hello world!' in the alert dialog)

gsub() /sub() :
復(fù)制代碼 代碼如下:
var mouseEvents = 'click dblclick mousedown mouseup mouseover mousemove mouseout'; mouseEvents.gsub(' ', ', ');
// -> 'click, dblclick, mousedown, mouseup, mouseover, mousemove, mouseout'

mouseEvents.gsub(//w+/, function(match){return 'on' + match[0].capitalize()});
// -> 'onClick onDblclick onMousedown onMouseup onMouseover onMousemove onMouseout'

var markdown = '![a pear](/img/pear.jpg) ![an orange](/img/orange.jpg)';
markdown.gsub(/!/[(.*?)/]/((.*?)/)/, function(match){ return '<img alt="' + match[1] + '" src="' + match[2] + '" src="' + match[2] + '" />'; });
// -> '<img alt="a pear" src="/img/pear.jpg" src="img/pear.jpg" /> <img alt="an orange" src="/img/orange.jpg" src="img/orange.jpg" />'

//==================================================

var fruits = 'apple pear orange';
fruits.sub(' ', ', '); // -> 'apple, pear orange'
fruits.sub(' ', ', ', 1); // -> 'apple, pear orange'
fruits.sub(' ', ', ', 2); // -> 'apple, pear, orange'
fruits.sub(//w+/, function(match){return match[0].capitalize() + ','}, 2);
// -> 'Apple, Pear, orange'

var markdown = '![a pear](/img/pear.jpg) ![an orange](/img/orange.jpg)';
markdown.sub(/!/[(.*?)/]/((.*?)/)/, function(match){ return '<img alt="' + match[1] + '" src="' + match[2] + '" src="' + match[2] + '" />'; });
// -> '<img alt="a pear" src="/img/pear.jpg" src="img/pear.jpg" /> ![an orange](/img/orange.jpg)'

markdown.sub(/!/[(.*?)/]/((.*?)/)/, '<img alt="#{1}" src="#{2}" src="#{2}" />');
// -> '<img alt="a pear" src="/img/pear.jpg" src="img/pear.jpg" /> ![an orange](/img/orange.jpg)'

interpolate() :
復(fù)制代碼 代碼如下:
"#{animals} on a #{transport}".interpolate({ animals: "Pigs", transport: "Surfboard" });
//-> "Pigs on a Surfboard"

scan() :
復(fù)制代碼 代碼如下:
var fruits = [];
'apple, pear & orange'.scan(//w+/, function(match){ fruits.push(match[0])}); fruits.inspect()
// -> ['apple', 'pear', 'orange']

times() :
復(fù)制代碼 代碼如下:
"echo ".times(3); //-> "echo echo echo "

toQueryParams():
復(fù)制代碼 代碼如下:
'section=blog&id=45'.toQueryParams();
// -> {section: 'blog', id: '45'}

'section=blog;id=45'.toQueryParams();
// -> {section: 'blog', id: '45'}

'http://www.example.com?section=blog&id=45#comments'.toQueryParams();
// -> {section: 'blog', id: '45'}

'section=blog&tag=Javascript&tag=prototype&tag=doc'.toQueryParams();
// -> {section: 'blog', tag:['Javascript', 'prototype', 'doc']}

'tag=ruby%20on%20rails'.toQueryParams();
// -> {tag: 'ruby on rails'}

'id=45&raw'.toQueryParams();
// -> {id: '45', raw: undefined}

JavaScript技術(shù)Prototype String對(duì)象 學(xué)習(xí),轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 国模精品一区二区三区视频 | 少爷被多个暗卫肉高h | 忘忧草在线社区WWW日本-韩国 | 手机在线观看你懂的 | 老司机福利在视频在ae8 | caoporm国产精品视频免费 | yy8090理论三级在线看 | 姑娘视频日本在线播放 | 一品道门在线观看免费视频 | 国语对白老女人8av 国语对白刺激真实精品 | 久久免费观看视频 | 抽插性奴中出乳精内射 | 日韩欧美国产免费看清风阁 | 久久合| 三级aa久久 | 超碰在线视频公开 | jizzjizz丝袜 | 欧美性xxx18一20 | 97久久超碰中文字幕 | 亚洲精品乱码久久久久久v 亚洲精品乱码电影在线观看 | 久久综合香蕉久久久久久久 | 花蝴蝶高清影视视频在线播放 | 亚洲国产精品久久精品成人网站 | 亚洲AV无码乱码国产麻豆P | 中文字幕一区中文亚洲 | 成人18视频在线 | 手机看片国产日韩欧美 | 波多野结衣二区 | 嘟嘟嘟影院免费观看视频 | 偷拍久久国产视频免费 | 国产精片久久久久久婷婷 | 国产露脸150部国语对白 | 甜性涩爱免费下载 | 一本道久在线综合道 | 麻花传媒MD0044视频 | 黄色天堂网 | 樱桃视频高清免费观看在线播放 | 91麻豆国产精品91久久久 | 日本久久黄色 | 亚洲AV午夜福利精品香蕉麻豆 | 真实国产精品视频国产网 |