youku的js腳本的工具函數和初始化方法

来源:http://www.cnblogs.com/wala-wo/archive/2016/01/27/5162159.html
-Advertisement-
Play Games

定義日誌輸出函數(function(){ if(window['console']){ return; } window['console'] = { log: function(){} ,clear: function(){} ,debug: function(){} ,error: ...


       定義日誌輸出函數

(function(){
	if(window['console']){ return; }
	window['console'] = {
		 log: function(){}
		,clear: function(){}
		,debug: function(){}
		,error: function(){}
		,info: function(){}
		,count: function(){}
		,time: function(){}
		,trace: function(){}
		,warn: function(){}
	}
})();

       定義全局的方法,實現載入cdn的響應的地址

(function(){
    var url = 'Bad url, watch browser console error.',
        Local = window.Local,
        err = function(msg){ if(console && console.error){  console.error('[cdn function error] '+ msg + '.'); } },
        cdn = function(path, type){
            //path rule
            if(path.charAt(0) != '/'){ err('@param path: relative to root start by /'); return url; }
            //global block
            if(!Local){ err('@see BETA-18932: template funciton {nova->globaJS}'); return url; }
            var key = 'RELEASE_TAG', version = Local[key];
            //version define
            if(!version){ err('@see local: ' + key + ' not defined'); return url; }
            //server define
            key = type.toUpperCase() + 'SERVER', server = Local[key];
            if(!server){ err('@see local: ' + key + ' not defined.'); return url; }
            //bad server define
            if(!server.match(/^(http|https)/)){ err('@see local: ' + key + ' is server, add protocol'); return url; }
            if(server.match(/\/$/)){ err('@see local: ' + key + ' is server, not ending by \/'); return url; }
            url = server+ '/' +  version + path;
            return url;
        };
        window.cdn_jsurl = function(path){ return cdn(path, 'js'); };
        window.cdn_cssurl = function(path){ return cdn(path, 'css'); };
        window.cdn_imgurl = function(path){ return cdn(path, 'img'); };
})();

        全站監聽連接事件

//監聽全站的鏈接點擊事件,檢查是否存在data-from屬性,並添加from參數至href屬性中
(function(o){
	if(!o) {return false;}
	if(!o.Event) {return false;}
	var checkFromDomain = function(href){
		var domain = ["youku.com/v_show/","youku.com/show_page/","youku.com/u/U"];
		for(var i=0,length=domain.length; i<length; i++){
			if(href.indexOf(domain[i]) !== -1) {
				return true;
			}
		}
	}
	o.nova_init_hook_data_from = function(){
		o.Event.observe(document, "click",  function(ev){
			if(!ev) ev = o.event;
			var target = ev.target || ev.srcElement;
			if(!target) {return;}
			if(target.tagName != 'A' && target.parentNode) {
				target = target.parentNode;
			}
			if(target.tagName == 'A') {
				var data_from = target.getAttribute("data-from");
				var from = data_from || window.pvDataFrom;
				var href = target.getAttribute("href");
				if(from && from != '') {
					if(href && href.indexOf('http') === 0 && href.indexOf('?from') === -1 && href.indexOf('&from') === -1 && checkFromDomain(href)) {
						from = encodeURIComponent(from);
						if(href.indexOf('?') !== -1){
							target.setAttribute("href", href+'&from='+from);
						}else{
							target.setAttribute("href", href+'?from='+from);
						}
					}
				}
			}
		});
	}
 })(window);

        生成時間戳+6位隨機數的字元串

var getPvid = function(len){
		var randchar=["0","1","2","3","4","5","6","7","8","9",
			"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
			"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"
					];
		var i=0;
		var r="";
		var d=new Date();
		for (i=0;i<len;i++){
				         var index=parseInt(Math.random()*Math.pow(10,6))%randchar.length;
						          r+=randchar[index];
		}
		return d.getTime()+r;
}

        jsonp非同步調用方法

	var jsonp = function(src, callback){
		if(typeof(arguments[0]) != 'string'){ return; }
		var callback = typeof(arguments[1]) == 'function' ? callback : function(){};
		var head = document.getElementsByTagName('HEAD')[0];
		var script = document.createElement('SCRIPT');
		script.type = 'text/javascript';
		script.src = src;
		head.appendChild(script);
		if(!/*@cc_on!@*/0) {
			script.onload = function(){ callback(); this.parentNode.removeChild(this); }
		}else{
			script.onreadystatechange = function () {
				if (this.readyState == 'loaded' || this.readyState == 'complete') {
					callback();
					this.parentNode.removeChild(this);
				}
			}
		}
	}

        過濾空字元串

function ltrim(s){ return s.replace( /^(\s*| *)/, ""); }
function rtrim(s){ return s.replace( /(\s*| *)$/, ""); }
function trim(s){ return ltrim(rtrim(s));}

        判斷是否為空值

/**
 * 判斷變數是否空值
 * undefined, null, '', false, 0, [], {} 均返回true,否則返回false
 */
function empty(v){
    switch (typeof v){
        case 'undefined' : return true;
        case 'string'    : if(trim(v).length == 0) return true; break;
        case 'boolean'   : if(!v) return true; break;
        case 'number'    : if(0 === v) return true; break;
        case 'object'    :
            if(null === v) return true;
            if(undefined !== v.length && v.length==0) return true;
            for(var k in v){return false;} return true;
            break;
    }
    return false;
}

        根據cookie判斷是否已經登錄

var islogin = function(){
	var username = '';
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if(c.indexOf('yktk=') == 0){
			var u_info = decode64(decodeURIComponent(c).split("|")[3]);
			if(u_info.indexOf(",") > -1 && u_info.indexOf("nn:") > -1 && u_info.indexOf("id:") > -1){
				 username = u_info.split(",")[1].split(":")[1];
				 if(username != '') break;
			}
		}
	}

	return (username == '') ? false : true;
}

        判斷是否為email

function isEmail(mail){
	return(new RegExp(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z]{1,4}$/).test(mail));
}



function U8_16(_1) {
    var i, len, c;
    var char2, char3;
    var ary = [];
    len = _1.length;
    i = 0;
    while (i < len) {
        c = _1.charCodeAt(i++);
        switch (c >> 4) {
        case 0:
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
        case 6:
        case 7:
            // 0xxxxxxx
            ary.push(_1.charAt(i - 1));
            break;
        case 12:
        case 13:
            // 110x xxxx   10xx xxxx
            char2 = _1.charCodeAt(i++);
            ary.push(String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F)));
            break;
        case 14:
            // 1110 xxxx 10xx xxxx 10xx xxxx
            char2 = _1.charCodeAt(i++);
            char3 = _1.charCodeAt(i++);
            ary.push(String.fromCharCode(((c & 0x0F) << 12) | ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0)));
            break;
        }
    }
    return ary.join('');
}
function decode64(_1) {
    if(!_1) return '';
    var _2 = "ABCDEFGHIJKLMNOP"+"QRSTUVWXYZabcdef"+"ghijklmnopqrstuv"+"wxyz0123456789+/"+"=";
    var _3 = "";
    var _4, _5, _6;
    var _7, _8, _9, _a;
    var i = 0;
    _1 = _1.replace(/[^A-Za-z0-9\+\/\=]/g, "");
    do {
        _7 = _2.indexOf(_1.charAt(i++));
        _8 = _2.indexOf(_1.charAt(i++));
        _9 = _2.indexOf(_1.charAt(i++));
        _a = _2.indexOf(_1.charAt(i++));
        _4 = (_7 << 2) | (_8 >> 4);
        _5 = ((_8 & 15) << 4) | (_9 >> 2);
        _6 = ((_9 & 3) << 6) | _a;
        _3 = _3 + String.fromCharCode(_4);
        if (_9 != 64) {
            _3 = _3 + String.fromCharCode(_5);
        }
        if (_a != 64) {
            _3 = _3 + String.fromCharCode(_6);
        }
    } while (i < _1.length);
    return U8_16(_3);
}
function encode64(str)
{
    if(!str) return '';
    str = str.toString();
    var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    var base64DecodeChars = new Array(
       -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
       -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
       -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
       52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
       -1, 0,   1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
       15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
       -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
       41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1
    );
    var out, i, len;
    var c1, c2, c3;
    len = str.length;
    i = 0;
    out = "";
    while(i < len) {
        c1 = str.charCodeAt(i++) & 0xff;
        if(i == len)
        {
            out += base64EncodeChars.charAt(c1 >> 2);
            out += base64EncodeChars.charAt((c1 & 0x3) << 4);
            out += "==";
            break;
        }
        c2 = str.charCodeAt(i++);
        if(i == len)
        {
            out += base64EncodeChars.charAt(c1 >> 2);
            out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
            out += base64EncodeChars.charAt((c2 & 0xF) << 2);
            out += "=";
            break;
        }
        c3 = str.charCodeAt(i++);
        out += base64EncodeChars.charAt(c1 >> 2);
        out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
        out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6));
        out += base64EncodeChars.charAt(c3 & 0x3F);
    }
    return out;
}
function encodeUid(uid)
{
    if(!uid) return '';
    if(uid << 2 > 0){
        var enUid = 'U' + encode64(uid << 2);
    }else{
        //uid超過限制
        var enUid = 'U' + encode64(uid * 4);
    }
    return enUid;
}

 

wala-wo
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • CSS 技術的最大優點是,它能夠幫助你將 Web 文檔的內容結構(html)和版面設計(css)分離開來。文檔結構和文檔樣式的分離可以保證頁面都能平穩退化。具備 CSS 支持的瀏覽器能夠把頁面呈現的美輪美奐,但是不支持或者禁用了 CSS 功能的瀏覽器同樣可以把頁面的內容按照正確的結構顯示出來。在 H...
  • 音視頻處理 視頻處理 基本內容 使用Flash技術處理HTML頁面中的視頻內容 包含音頻、動畫、網頁游戲等 特點 瀏覽器原生不支持(IE瀏覽器要求安裝ActiveX組件) 性能不好(不能過多地使用) 智能移動端並不支持Flash技術 命運 Flash的母公司A...
  • 從遠程API獲取到的響應內容,通常是json格式的,有時候需要對獲取到的內容進行轉換,比如去除某些不需要的欄位,給欄位取別名,等等。本篇就來體驗在AngualrJS中如何實現。在主頁面,還是從controller中拿數據。 ...
  • 首先:jsonp是json用來跨域的一個東西。原理是通過script標簽的跨域特性來繞過同源策略。經過測試實驗:發送端:$.ajax({ type : "post", url : "ajax.php", dataType : "jsonp", jsonp: "callback...
  • click是最常見的點擊事件,但是對於移動終端,比如手機,一般都是以touch事件代替的,而click事件在手機也是生效的,只是會有1-2秒左右的延遲,那麼當你想要用click而非touch事件的時候,該如何處理事件綁定的呢,不用說,為了阻止事件冒泡,以及動態載入出來的DOM元素也綁定點擊事件,肯定...
  • 在任何應用程式中,中介者模式隨處可見。→ 有一個事件源,觸發事件,傳遞參數→ 中介者記下這個事件,向外界廣播,並帶上參賽→ 有一個地方偵聽中介者事件,一旦事件源觸發事件,就從中介者手裡獲取事件相關參數本篇,要體驗的是在AngularJS中的中介者模式。場景是:當創建一個訂單,需要引發一些動作,比如給...
  • 最近在學習移動網頁開發,首先看到head裡面設置了下麵這個屬性:通過搜集資料,大體瞭解了viewport屬性的含義。一、什麼是Viewport手機瀏覽器是把頁面放在一個虛擬的“視窗”(viewport)中,通常這個虛擬的“視窗”(viewport)比屏幕寬,這樣就不用把每個網頁擠到很小的視窗中,也不...
  • 聖杯佈局,很久之前就聽過,但是從來都沒深入瞭解過,最近因為做了一個項目,借鑒了薪人薪事這個公司的產品頁面,才第一次用到這種佈局方式。於是就花了點時間,測了下它所有分欄佈局的代碼,每段代碼都非常簡單,但佈局效果很完美,比我以前用的方式好用不少。本文是對它實現方式的一些總結,希望可以把這種技術推薦給跟我...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...