½éÉÜ
±¾Ö¸ÄÏΪÄú½éÉÜÁËÔŲ́ʽ»úºÍÒÆ¶¯ÍøÂçÔÚ²»Í¬µÄƽ̨ºÍä¯ÀÀÆ÷£¨ < 99.99 £¥ÎÒ¿ÉÄÜ»áÌø¹ýһЩä¯ÀÀÆ÷£©¿ª·¢µÄJavaScript
SDK £¬¶ÔÓÚÄÇЩ·Çä¯ÀÀÆ÷¿ª·¢µÄÖ§³Ö£¨Ó²¼þ£¬Ç¶Èëʽ£¬½Úµã/ IO JS £©±»ÅųýÔÚ±¾ÎĵµÖ®Í⣬ÔÚδÀ´ÓèÒÔ¿¼ÂÇ¡£
ÒòΪÎÒûÓÐÕÒµ½Ò»¸ö¹ØÓÚÉè¼ÆJavaScript SDKµÄ±È½ÏºÃµÄÎĵµ£¬ËùÒÔÎÒÔÚÕâÀïÊÕ¼¯²¢¼ÇÏÂÁËÎÒ¸öÈ˵ľÑé¡£Õâ·ÝÎĵµÒѾдÁ˺ü¸¸öÔ£¬ÓÐÒ»µãÎÒÃÇÐèÒªÖªµÀ£¬JavaScriptµÄSDK-Éè¼Æ²»½ö½öÊÇÉè¼ÆSDK±¾Éí£¬ÕâÒ²ÊÇÓйØÓÚ¿ª·¢ÕßÓëÉ豸ä¯ÀÀÆ÷ÖмäµÄÁªÏµ¡£ÎÒÃÇдµÄÔ½¶à£¬Ô½»á¸ü¶àµÄ˼¿¼ÎÒÃÇÕæÕý¹ØÐĵÄÊDz»Í¬Æ½Ì¨ºÍä¯ÀÀÆ÷Ö®¼äµÄÐÔÄܺͼæÈÝÎÊÌâ¡£Äã¿ÉÒÔ¸ù¾ÝÇé¿ö×ÔÓɵĸü¸Ä»òÕßÍêÈ«·ÅÆúÎÒÔÚÎÄÕÂÀïÁгöµÄ½¨Òé¡£
ʲôÊÇSDK
ÎÒÖªµÀËüȷʵÊÇºÜÆÕͨºÜ³£¼û¡£Ò»°ãÊÇһЩÈí¼þ¹¤³ÌÊ¦ÎªÌØ¶¨µÄÈí¼þ°ü¡¢Èí¼þ¿ò¼Ü¡¢Ó²¼þƽ̨¡¢²Ù×÷ϵͳµÈ½¨Á¢Ó¦ÓÃÈí¼þʱµÄ¿ª·¢¹¤¾ßµÄ¼¯ºÏ¡£Í¨³£Ò»¸öSDK°üº¬Ò»¸ö»ò¶à¸öAPI£¬±à³Ì¹¤¾ßºÍµµ¡£
Éè¼ÆÀíÄî
ÕâÈ¡¾öÓÚÄãµÄSDKÓÃÀ´¸ÉʲôµÄ£¬µ«ÊÇËü±ØÐë¾ß±¸ÔÉúµÄ£¬¶Ì£¬Ëٶȿ죬¸É¾»£¬¿É¶Á¿É²âÊÔÌØÐÔ¡£ÓÃÔÉújavascriptд£¬²»ÒªÓÃÏñLivescript,
Coffeescript, TypescriptºÍÆäËüµÄ±àÒëÓïÑÔ¡£±ØÐëÓиüºÃµÄ·½·¨À´±àд×Ô¼ºµÄjavascriptÔÉú´úÂë±È±ðÈ˸ü¿ì¡£Çë²»ÒªÔÚÄãµÄSDKÀïÓÃJQuery£¬³ý·ÇËü·Ç³£ÓбØÒª¡£Äã¿ÉÒÔʹÓÃÆäËüµÄÀàËÆjQueryµÄ¿â£¬Æ©Èçzetpo.js£¬ÓÃÓÚDOM²Ù×÷£¬Èç¹ûÄãÐèÒªÓõ½HTTP
AjaxÇëÇ󣬿ÉÒÔʹÓÃÁíÍâÒ»ÖÖÇáÁ¿¿âÏñwindow.fetch¡£
ÿһ´ÎµÄSDK°æ±¾·¢²¼£¬È·±£Ëü²»½öÊÊÓÃÓھɰ汾¶øÇÒÊÊÓ¦ÓÚδÀ´µÄа汾¡£ËùÒÔ£¬¼ÇµÃΪÄãµÄSDKдÎĵµ£¬´úÂëҪдעÊÍ£¬Í¬Ê±×öºÃµ¥Ôª²âÊÔºÍÓû§³¡¾°²âÊÔ¡£
ÊÊÓ¦·¶Î§
»ùÓÚ¡¶Third-Party JavaScript¡·Õâ±¾Êé¡£ÔÚºÎÖÖÇé¿öÏ£¬ÄãÓ¦¸ÃΪÄãµÄÓ¦ÓÃÉè¼ÆÒ»¸öJavaScript
SDK£¿
ǶÈëʽ×é¼þ ¨C ǶÈëÔÚ³ö·¢²¼ÕßµÄÍøÒ³ÖеĽ»»¥Ê½Ó¦ÓóÌÐò(Disqus, Google Maps, Facebook
Widget)¡£
·ÖÎöÓëÊý¾Ý ¨C ËѼ¯ÍøÕ¾·ÃÎÊÕßÒÔ¼°ÆäÓëÍøÕ¾»¥¶¯µÄÊý¾ÝÐÅÏ¢¡£(GA, Flurry, Mixpanel)
web·þÎñAPI·â×° -¶ÔÓÚ·¢Õ¹ÓëÍⲿWeb·þÎñͨÐŵĿͻ§¶ËÓ¦ÓóÌÐò¡££¨FacebookµÄͼÐÎAPI£©
ÔÚʲôÇé¿öÏ£¬ÎÒÃÇÓ¦¸ÃÔÚJavaScript»·¾³ÖÐʹÓÃSDKÄØ£¿´ó¼Ò¿ÉÒÔÏëÏ뻹ÓÐÆäËüÇéû£¿
ÒýÈëSDK
½¨ÒéÄã²ÉÓÃÒì²½¼ÓÔØ½Å±¾µÄ·½Ê½¡£ÎÒÃÇÒªÓÅ»¯ÍøÕ¾µÄÓû§ÌåÑ飬ËùÒÔ²»Ï£ÍûÎÒÃǵÄSDK¿â×èÈûÆäËüÖ÷Òª½ø³Ì¡£
Òì²½¼ÓÔØ
(function() {vars=document.createElement('script');s.type='text/javascript';s.async=tr ue;s.src='http://xxx.com/sdk.js';varx=document.getElementsByTagName('script')[0];x.pa rentNode.insertBefore(s, x);})();** |
ÔÚеÄÏÖ´úä¯ÀÀÆ÷£¨chrome£©Äã¿ÉÒÔʹÓÃ
<script asyncsrc="http://xxx.com/sdk.js"></script> |
´«Í³¼ÓÔØ·½·¨
<script type="text/javascript"src="http://xxx.com/sdk.js"></script> |
¶Ô±È£º
ÏÂÃæÊǼòµ¥µÄͼÐÎÏÔʾÒì²½¼ÓÔØºÍ´«Í³Í¬²½¼ÓÔØ·½Ê½Ö®¼äµÄÇø±ð
Òì²½£º
|----A-----| |-----B-----------| |-------C------| |
ͬ²½£º
|----A-----||-----B-----------||-------C------| |
Òì²½ºÍÑӳٽű¾Ö´ÐнâÊÍ

Òì²½µÄÎÊÌâ
µ±ÄãʹÓÃÒì²½¼ÓÔØµÄʱºò£¬½«»á³öÏÖ£¬Ò³ÃæÖеĺ¯ÊýÎÞ·¨Õý³£µ÷ÓÃSDK·½·¨µÄÇé¿ö¡£
<script> (function () { var s =document.createElement('script'); s.type='text/javascript'; s.async=true; s.src='http://xxx.com/sdk.js'; var x =document.getElementsByTagName('script')[0]; x.parentNode.insertBefore(s, x); })(); // execute your script immediately hereSDKName('some arguments'); </script> |
½á¹û»á±¨undefined´íÎó£¬ÒòΪSDKName()Ôڽű¾¼ÓÔØÖ®Ç°Ö´ÐÐÁË¡£ËùÒÔÎÒÃÇÓ¦¸ÃʹÓõ㼼ÇÉÈýű¾ÕýÈ·Ö´ÐС£°Ñʼþ±£´æÔÚSDKName.qÊý×éÀSDK³õʼ»¯µÄʱºòÖ´ÐÐSDKName.q¡£
<script> (function () { // add a queue event here SDKName = SDKName ||function () { (SDKName.q=SDKName.q|| []).push(arguments); }; var s =document.createElement('script'); s.type='text/javascript'; s.async=true; s.src='http://xxx.com/sdk.js'; var x =document.getElementsByTagName('script')[0]; x.parentNode.insertBefore(s, x); })(); // execute your script immediately hereSDKName('some arguments'); </script> |
»òÕßÓÃ [ ].push
<script> (function () { // add a queue event here SDKName =window.SDKName|| (window.SDKName= []); var s =document.createElement('script'); s.type='text/javascript'; s.async=true; s.src='http://xxx.com/sdk.js'; var x =document.getElementsByTagName('script')[0]; x.parentNode.insertBefore(s, x); })(); // execute your script immediately hereSDKName.push(['some arguments']); </script> |
ÆäËû·½Ê½
»¹ÓÐÆäËü²»Í¬·½Ê½¼ÓÔØ½Å±¾
Import in ES2015
Ä£¿é¼ÓÔØ
ÕâÀïÓÐÍêÕûµÄÔ´ÂëºÍ·Ç³£°ôµÄ½Ì³Ì. Loading JavaScript Modules
module('sdk.js',['sdk-track.js', 'sdk-beacon.js'],function(track, beacon) { // sdk definitions, split into local and global/exported definitions// local definitions// exports }); // you should contain this "module" method (function () { var modules = {}; // private record of module data// modules are functions with additional informationfunctionmodule(name,imports,mod) { // record module informationwindow.console.log('found module '+name); modules[name] = {name:name, imports: imports, mod: mod}; // trigger loading of import dependenciesfor (var imp in imports) loadModule(imports[imp]); // check whether this was the last module to be loaded// in a given dependency grouploadedModule(name); }
// function loadModule// function loadedModulewindow.module=module;
})(); |
SDK°æ±¾
±ÜÃâʹÓÃ×Ô¼ºµÄÌØÀý×÷Ϊ°æ±¾Ãû³ÆÏñ
±êʶ-v<ʱ¼ä´Á>.js ±êʶ-v<ÈÕÆÚ>.js ±êʶ-v1-v2.js
Ëü¿ÉÄܵ¼ÖÂʹÓÃSDKµÄ¿ª·¢ÕߺܻìÂÒ²»ÖªµÀÄĸöÊÇ×îа汾¡£
ʹÓà Semantic Versioning £¨ÓïÒ廯°æ±¾¹æ·¶£©È¥¶¨ÒåSDKµÄ°æ±¾ºÅÒÔ¡±´ó.С.²¹¶¡¡±ÐÎʽ¡£
°æ±¾ÒÔv1.0.0 v1.5.0 v2.0.0µÄÐÎʽ£¬»áÈÃʹÓÃÕßËÑË÷¸ú×ÙÈÕÖ¾Îļþ¸üÈÝÒס£
ͨ³£Çé¿öÏ£¬ÎÒÃÇ»áÓв»Í¬µÄ·½Ê½È¥ÉùÃ÷SDKµÄ°æ±¾£¬ÕâÈ¡¾öÓÚ¾ßÌåÕë¶ÔµÄÒµÎñºÍÉè¼Æ¡£
ʹÓòéѯ×Ö·û´®Â·¾¶
http://xxx.com/sdk.js?v=1.0.0 |
ʹÓÃÎļþ¼ÐÃüÃû
http://xxx.com/v1.0.0/sdk.js |
ʹÓÃÖ÷»úÃû»òÕß×ÓÓòÃû
ΪÁËÒÔºó°æ±¾µÄÉý¼¶µü´ú£¬½¨ÒéÓÃstable unstable alpha latest experimental
°æ±¾¡£
http://xxx.com/sdk-stable.js
http://xxx.com/sdk-unstable.js
http://xxx.com/sdk-alpha.js
http://xxx.com/sdk-latest.js
http://xxx.com/sdk-experimental.js
|
¸üÐÂÈÕÖ¾Îļþ
ÄãÓ¦¸Ã×¢Òâµ½Èç¹ûÄãÉý¼¶ÄãµÄSDKȴû֪ͨÓû§£¬Óû§²»»áÖªµÀ¡£¼ÇµÃд¸üÐÂÈÕÖ¾À´¼Ç¼ÎÞÂÛÊÇÖ÷Òª¡¢´ÎÒªÉõÖÁbugÐÞ¸´µÈÐ޸ġ£Õ⽫ÊÇÒ»¸öºÃµÄ¿ª·¢¾Ñ飬ÎÒÃÇÄÜ¿ìËٵĸú×Ùµ½SDKij¸öAPIµÄÐ޸ġ£ËùÒÔ±£³Ö¸üÐÂÈÕÖ¾
¨C Keep a Changelog, Github Repo
ÿ¸ö°æ±¾µÄÈÕÖ¾Ó¦¸ÃÓУº
[ÐÂÔö] й¦ÄÜ. [¸üÐÂ] ÐÞ¸ÄÏÖÓеĸüÄÜ [·ÏÆú] ÔÚ¼´½«·¢²¼µÄ°æ±¾ÖÐɾ³ýij¸ö¹¦ÄÜ. [ɾ³ý] ÔÚÕâ¸ö°æ±¾ÖÐɾ³ýÆúÓõŦÄÜ. [ÐÞÕý] bugÐÞ¸´ [°²È«] ÑûÇëÓû§¶Ô°²È«½øÐÐÉý¼¶ |
ÃüÃû¿Õ¼ä
ÔÚÄãµÄSDKÀïÖ»¶¨ÒåÒ»¸öÈ«¾ÖÃüÃû¿Õ¼ä£¬²¢ÇÒ²»ÒªÓÃÌ«¹ýͨÓõÄÃû×Ö£¬±ÜÃâºÍÆäËüÀà¿âÃû·¢Éú³åÍ»¡£SDKµÄÖ÷ÌåÓÃ(function
() { ¡ })()°ü¹ü¡£ÕâÖÖ×ö·¨Ô½À´Ô½ÆÕ±éµÄÓ¦ÓÃÓÚ¸÷ÖÖÁ÷ÐеÄjavascriptÀà¿âÆ©ÈçjQuery,Node.jsµÈµÈ¡£ÕâÖÖ´´½¨Ë½ÓеÄÃüÃû¿Õ¼äµÄ¼¼ÊõºÜÖØÒª£¬ÓÐÖúÓÚ±ÜÃâ¸÷ÖÖÀà¿âÖ®¼äÃüÃûµÄ³åÍ»¡£
ΪÁ˱ÜÃâÃüÃû¿Õ¼ä³åÍ»
ѧϰGoogle AnalyticsµÄ×ö·¨£¬Äã¿ÉÒÔͨ¹ý¸Ä±ä gaµÄÖµÀ´¶¨ÒåÄã×Ô¼ºµÄÃüÃû¿Õ¼ä¡£
(function(i,s,o,g,r,a,m) {i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o) [0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google- analytics.com/analytics.js','ga'); |
ÏÂÃæµÄÊÇ openXµÄ×ö·¨£¬Ö§³Öͨ¹ý¸øµØÖ·´«µÝ²ÎÊý¶¨ÒåÃüÃû¿Õ¼ä¡£
<script src="http://your_domain/sdk?namespace=yourcompany"></script> |
´æ´¢»úÖÆ
cookie
ʹÓÃcookie¾Í»áÃæÁÙ¸´ÔÓµÄ×÷ÓÃÓò·¶Î§ÎÊÌ⣬¶øÇÒÉæ¼°µ½×ÓÓòºÍ·¾¶ÎÊÌâ¡£
±ÈÈçÔÚ·¾¶ path=/ÏÂ, cookie first=value1 ÔÚÓòÃû http://github.comÏÂ,
ÁíÍâÒ»¸ö cookie second=value2 ÔÚÓòÃû http://sub.github.comÏÂ

Óиö cookie first=value1 ÔÚ http://github.comÏÂ, cookie
second=value2 ÔÚ http://github.com/path1 ÁíÍâÒ»¸ö cookie
third=value3 ÔÚ http://sub.github.comÏÂ,

¼ì²é Cookie ¿É¶Áд
¸ø¶¨Ò»¸öÓò (ĬÈϵ±Ç°Ö÷»úÓòÃû), ¼ì²écookieÊÇ·ñ¿É¶Áд¡£
var checkCookieWritable = function(domain) { try { // Create cookie document.cookie = 'cookietest=1' + (domain ? '; domain=' + domain : ''); var ret = document.cookie.indexOf('cookietest=') != -1; // Delete cookie document.cookie = 'cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT' + (domain ? '; domain=' + domain : ''); return ret; } catch (e) { return false; } }; |
¼ì²éµÚÈý·½ Cookie ¿É¶Áд
¼ì²éµÚÈý·½cookie½ö½öͨ¹ý¿Í»§¶ËjsÊǰ첻µ½µÄ£¬ÐèÒª·þÎñÆ÷¶ËÅäºÏ¡£
д ¶Á ɾ³ý Cookie ´úÂë
´úÂëÆ¬¶Îд/¶Á/ɾ³ýcookieµÄ½Å±¾¡£
var cookie = { write: function(name, value, days, domain, path) { var date = new Date(); days = days || 730; // two years path = path || '/'; date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); var expires = '; expires=' + date.toGMTString(); var cookieValue = name + '=' + value + expires + '; path=' + path; if (domain) { cookieValue += '; domain=' + domain; } document.cookie = cookieValue; }, read: function(name) { var allCookie = '' + document.cookie; var index = allCookie.indexOf(name); if (name === undefined || name === '' || index === -1) return ''; var ind1 = allCookie.indexOf(';', index); if (ind1 == -1) ind1 = allCookie.length; return unescape(allCookie.substring(index + name.length + 1, ind1)); }, remove: function(name) { if (this.read(name)) { this.write(name, '', -1, '/'); } } }; |
Session
jsд²»ÁËsession,ÐèÒª·þÎñÆ÷¶Ëд¡£
Ò»¸öÒ³ÃæµÄsession»áÒ»Ö±±£´æ×ÅÖ»Òªä¯ÀÀÆ÷ÊÇ¿ª×ŵļ´Ê¹Ò³ÃæÖØÐ¼ÓÔØ¡£´ò¿ªÒ»¸öÐÂÒ³Ãæ»áÉú³ÉÒ»¸öеÄsession¡£×Ó´°¿Ú»áºÍ¸¸´°¿Ú¹²ÏíÒ»¸ösession¡£
LocalStorage
´æ´¢µÄÊý¾ÝûÓÐʱ¼äÏÞÖÆ¡£´æ´¢Êý¾ÝÁ¿´ó£¨ÖÁÉÙ5MB£©²¢ÇÒÐÅÏ¢²»»á´«Ë͵½·þÎñÆ÷¡£¶øÇÒͬһ¸öÓòÃû´ÓhttpºÍhttps·ÃÎÊlocalStorageÊDz»¹²ÏíµÄ¡£Äã¿ÉÒÔÔÚÄãµÄÍøÒ³ÉÏ´´½¨¸öiframe£¬È»ºóÓÃpostMessage·½·¨È¥´«Öµµ½¸¸Ò³Ãæ¡£HOW
TO?
¼ì²é LocalStorage ¿Éд
window.localStorage ²¢²»ÊÇÈκÎä¯ÀÀÆ÷¶¼Ö§³Ö£¬SDKÔÚÓÃ֮ǰҪ¼ì²éÊÇ·ñ¿ÉÓá£
var testCanLocalStorage = function() { var mod = 'modernizr'; try { localStorage.setItem(mod, mod); localStorage.removeItem(mod); return true; } catch (e) { return false; } }; |
SessionStorage
Õë¶ÔÒ»¸ö session µÄÊý¾Ý´æ´¢(µ±Óû§¹Ø±Õä¯ÀÀÆ÷´°¿Úºó£¬Êý¾Ý»á±»É¾³ý).
¼ì²é SessionStorage ¿Éд
var checkCanSessionStorage = function() { var mod = 'modernizr'; try { sessionStorage.setItem(mod, mod); sessionStorage.removeItem(mod); return true; } catch (e) { return false; } } |
ʼþ
ÔÚ¿Í»§¶Ëä¯ÀÀÆ÷Óкܶàʼþ¼ÓÔØ¡¢Ð¶ÔØ¡¢°ó¶¨µÈ»á´æÔÚ¼æÈÝÎÊÌâ¡£polyfillsÊǸö½â¾ö²»Í¬Æ½Ì¨Ê¼þ°ó¶¨µÄ²»´íµÄ½â¾ö·½°¸¡£
Document Ready
È·±£Õû¸öÒ³ÃæÍê³É¼ÓÔØÁËÔÙÖ´ÐÐSDK·½·¨¡£
// handle IE8+ function ready (fn) { if (document.readyState != 'loading') { fn(); } else if (window.addEventListener) { // window.addEventListener('load', fn); window.addEventListener('DOMContentLoaded', fn); } else { window.attachEvent('onreadystatechange', function() { if (document.readyState != 'loading') fn(); }); } } |
DOMContentLoaded - ËùÓÐDOM½âÎöÍê»á´¥·¢Õû¸öʼþ ²»ÐèÒªµÈµ½Ñùʽ±í¡¢Í¼Æ¬µÈ¼ÓÔØÍê¡£
load Ò³ÃæÍêÕû¼ÓÔØ¡£
Message Event
ÕâÀïÊÇʵÏÖiframeºÍ¸¸Ò³ÃæÖ®¼äµÄÊý¾ÝͨÐÅ, ÕâÀïÓÐÎĵµ API documentation.
// in the iframe parent.postMessage("Hello"); // string
// ==========================================
// in the iframe's parent
// Create IE + others compatible event handler
var eventMethod = window.addEventListener ? "addEventListener"
: "attachEvent";
var eventer = window[eventMethod];
var messageEvent = eventMethod == "attachEvent"
? "onmessage" : "message";
// Listen to message from child window
eventer(messageEvent,function(e) {
// e.origin , check the message origin
console.log('parent received message!: ',e.data);
},false); |
·¢Ë͵ÄÊý¾ÝÊÇ×Ö·û´®, ¶ÔÓÚʹÓøü¸ß¼¶µÄjson×Ö·û´®. ²»ÊÇËùÓеÄä¯ÀÀÆ÷¶ÔÖ§³Ö Structured Clone
Algorithm on the parameter, £¨²ÎÊýµÄ½á¹¹»¯¿Ë¡£©¡£
Orientation Change ºáÆÁʼþ
¼ì²âÉ豸ºáÆÁ
window.addEventListener('orientationchange', fn); |
»ñÈ¡Ðýת·½ÏòºÍ½Ç¶È
window.orientation; // => 90, -90, 0 |
Screen portrait-primary£¨ÊúÆÁÕý·½Ïò£©, portrait-secondary£¨ÊúÆÁ·´·½Ïò£©,
landscape-primary£¨ºáÆÁÕý·½Ïò£©, landscape-secondary £¨ºáÆÁ·´·½Ïò£©(Experimental)
// https://developer.mozilla.org/en-US/docs/Web/API/Screen/orientation var orientation = screen.orientation || screen.mozOrientation || screen.msOrientation; |
Request
ÎÒÃǵÄSDKºÍ·þÎñÆ÷Ö®¼äͨÐÅͨ¹ýAjaxÇëÇó£¬ÒòΪÎÒÃÇÖªµÀÎÒÃÇ¿ÉÒÔʹÓÃjQueryµÄAjax ·½·¨¡£µ«ÊÇÓиüºÃµÄ·½°¸À´ÊµÏÖËü¡£
ͼƬԤ¼ÓÔØ
ͨ¹ý´´½¨Ò»¸öImage¶ÔÏóÔ¤¼ÓÔØÒ»ÕÅͼƬ¡£ÎªÁË·ÀÖ¹ä¯ÀÀÆ÷»º´æ¼ÇµÃ¼ÓÉÏʱ¼ä´Á¡£
(new Image()).src = 'http://xxxxx.com/collect?id=1111'; |
ҪעÒâͨ¹ýGET·½Ê½´«Êä²ÎÊý×î´ó³¤¶ÈÊÇ2048¸ö×Ö½Ú£¨È¡¾öÓÚ²»Í¬µÄä¯ÀÀÆ÷ºÍ·þÎñÆ÷£©¡£ÕâÀïÒª×öһЩ´¦ÀíÈç¹û³¬¹ý³¤¶È¡£
if (length > 2048) { // do Multiple Post (form) } else { // do Image Beacon } |
Äã¿ÉÄÜÓöµ½ÎÊÌâÔÚʹÓÃencodeURI »¹ÊÇ encodeURIComponentµÄʱºò,×îºÃÀí½âËüÃǵÄÇø±ð¡£
See below.
¶ÔÓÚͼÏñ¼ÓÔØ³É¹¦/´íÎ󻨵÷
var img = new Image(); img.src = 'http://xxxxx.com/collect?id=1111'; img.onload = successCallback; img.onerror = errorCallback; |
µ¥¸ö Post ÇëÇó
ÆÕͨ±íµ¥·¢ËÍÒ»¸ö¶ÔÓ¦ÔªËØºÍÖµ
var form = document.createElement('form'); var input = document.createElement('input');
form.style.display = 'none';
form.setAttribute('method', 'POST');
form.setAttribute('action', 'http://xxxx.com/track');
input.name = 'username';
input.value = 'attacker';
form.appendChild(input);
document.getElementsByTagName('body')[0].appendChild(form);
form.submit(); |
¶à¸ö Post ÇëÇó
·þÎñͨ³£±È½Ï¸´ÔÓ£¬ÐèҪͨ¹ýPOST·½·¨·¢Ë͸ü¶àÊý¾Ý¡£
function requestWithoutAjax( url, params, method ){
params = params || {};
method = method || "post";
// function to remove the iframe
var removeIframe = function( iframe ){
iframe.parentElement.removeChild(iframe);
};
// make a iframe...
var iframe = document.createElement('iframe');
iframe.style.display = 'none';
iframe.onload = function(){
var iframeDoc = this.contentWindow.document;
// Make a invisible form
var form = iframeDoc.createElement('form');
form.method = method;
form.action = url;
iframeDoc.body.appendChild(form);
// pass the parameters
for( var name in params ){
var input = iframeDoc.createElement('input');
input.type = 'hidden';
input.name = name;
input.value = params[name];
form.appendChild(input);
}
form.submit();
// remove the iframe
setTimeout( function(){
removeIframe(iframe);
}, 500);
};
document.body.appendChild(iframe);
}
requestWithoutAjax('url/to', { id: 2, price: 2.5,
lastname: 'Gamez'}); |
Iframe
µ±ÄãÔÚÐèÒªÔÚÒ³ÃæÖÐÉú³ÉÄÚÈÝʱºò£¬Äã¿ÉÒÔͨ¹ýiframeǶÈë¡£
var iframe = document.createElement('iframe'); var body = document.getElementsByTagName('body')[0];
iframe.style.display = 'none';
iframe.src = 'http://xxxx.com/page';
iframe.onreadystatechange = function () {
if (iframe.readyState !== 'complete') {
return;
}
};
iframe.onload = loadCallback;
body.appendChild(iframe); |
Çå³ýiframeµÄ±ß¿ò£¬ÄÚ²¿marginÖµ¡£
<iframe src="..." marginwidth="0" marginheight="0" hspace="0" vspace="0" frameborder="0" scrolling="no"> </iframe> |
iframeÖвåÈëhtml
<iframe id="iframe"></iframe>
<script>
var html_string= "content <script>alert(location.href);
</script>";
document.getElementById('iframe').src = "data:text/html;charset=utf-8,"
+ escape(html_string);
// alert data:text/html;charset=utf-8.....
// access cookie get ERROR
var doc = document.getElementById('iframe').contentWindow.document;
doc.open();
doc.write('<body>Test<script>alert(location.href);</script></body>');
doc.close();
// alert "top window url"
var iframe = document.createElement('iframe');
iframe.src = 'javascript:;\\\\'' + encodeURI('<html><body>
<script>alert(location.href);</body></html>')
+ '\\\\'';
// iframe.src = 'javascript:;"' + encodeURI((html_tag).replace(/\\\\"/g,
'\\\\\\\\\\\\"')) + '"';
document.body.appendChild(iframe);
// alert "about:blank"
</script> |
jsonp
ÕâÖÖÇé¿öÏ£¬ÄãµÄ·þÎñÆ÷ÐèÒªÏìÓ¦JavaScript ´úÂ룬²¢ÈÃä¯ÀÀÆ÷Ö´ÐÐËü£¬½ö½öͨ¹ýjs½Å±¾Á´½Ó¡£
(function () { var s = document.createElement('script'); s.type = 'text/javascript'; s.async = true; s.src = '/yourscript? some=parameter&callback=jsonpCallback'; var x = document.getElementsByTagName('script')[0]; x.parentNode.insertBefore(s, x); })(); |
¹ØÓÚjsonpÄãÐèÒªÁ˽⣺
JSONP Ö»ÄÜͨ¹ýGETÇëÇó¡£
JSONP ȱÉÙ´íÎó´¦Àí»úÖÆ, Òâζ×ÅÄã²»Äܼì²â´úÂëÊÇ·ñ404»¹ÊÇ500µÈ״̬¡£
JSONP ÇëÇóÊÇÒì²½µÄ¡£
µ±ÐÄ CSRF ¹¥»÷¡£
¿çÓòͨÐÅ¡£½Å±¾ÏìÓ¦¶Ë£¨·þÎñÆ÷¶Ë£©²»ÐèÒª¹ØÐÄCORS¡£
XMLHttpRequest
×Ô¼ºÐ´XMLHttpRequest²»ÊǸöºÃÖ÷Ò⣬ÒòΪÄãÒªÀ˷Ѻܶàʱ¼äÈ¥×öIE»òÕ߯äËüä¯ÀÀÆ÷µÄ¼æÈÝ¡£ÕâÀïÌṩһЩÏֳɵĽâ¾ö·½°¸¹©´ó¼Ò²Î¿¼£º
1 - window.fetch - A window.fetch JavaScript polyfill.
2 - got - Simplified HTTP/HTTPS requests
3 - microjs - list of ajax lib
4 ¨C more
Maximum Number of Connection
¼ì²é²»Í¬ä¯ÀÀÆ÷µÄ×î´óÁ¬½ÓÊý browserscope

µ÷ÊÔ
Ä£Äâ¶à¸öÓò
Äã²»ÐèҪע²á¶à¸öÓòÃûÀ´Ä£ÄâÓò£¬ÔÚ±¾µØ´î½¨¸öÐéÄâ·þÎñÆ÷£¬°ó¶¨hostµÄ·½Ê½¾Í¿ÉÒÔ£º
Ìí¼ÓÒÔÏÂÌõÄ¿
#refer to localhost 127.0.0.1 publisher.net 127.0.0.1 sdk.net |
È»ºóÄã¾Í¿ÉÒÔ·ÃÎʸÃÒ³Ãæhttp://publisher.netºÍhttp://sdk.net
Developer Tools
ÓÃä¯ÀÀÆ÷×Ô´øµÄµ÷ÊÔ¹¤¾ß£¬Chrome Developer Tool ¡¢Safari Developer
Tools¡¢Firebug¶¼ÊDz»´íµÄÑ¡Ôñ¡£
¿ª·¢¹¤¾ßÒ²¼ò³ÆÎª¹¤¾ß¡£
¹¤¾ßÌṩWeb¿ª·¢ÕßÉî½øÈëä¯ÀÀÆ÷ºÍWebÓ¦ÓóÌÐòµÄÄÚ²¿¡£Ê¹Óù¤¾ßÀ´ÓÐЧµØ×·×Ù²¼¾ÖÎÊÌ⣬½«JavaScript´ò¶Ïµã£¬²¢»ñµÃ´úÂëÓÅ»¯µÄ½¨Òé¡£
¿ØÖÆÌ¨ÈÕÖ¾
ÓÃÓÚ²âÊÔºÍÊä³öÎı¾ºÍÆäËûÒ»°ãµÄµ÷ÊÔ£¬ ¿ØÖÆÌ¨ÈÕÖ¾¿Éͨ¹ýä¯ÀÀÆ÷µÄAPI log()Êä³öÏÔʾ¡£Óи÷ÖÖ¸÷ÑùµÄ·½·¨ºÍ¸ñʽÊä³öÄãµÄÐÅÏ¢£¬Á˽â¸ü¶àAPI£º
Console API.

µ÷ÊÔ´úÀí
´úÀíÔÚÄãµ÷ÊÔSDKµÄºÜ¶àʱºò¶¼ºÜÓÐÓᣠÐÞ¸Äcookies, headers, cache, ±à¼ http
request/response, SSL Proxying, ajax µ÷ÊԵȵȡ£
ÕâÀïÍÆ¼öһЩ´úÀí¹¤¾ß£º
FiddlerCore
Charles
Cellist
BrowserSync
BrowsersyncÄÜÈÃä¯ÀÀÆ÷ʵʱ¡¢¿ìËÙÏìÓ¦ÄúµÄÎļþ¸ü¸Ä£¨html¡¢js¡¢css¡¢sass¡¢lessµÈ£©²¢×Ô¶¯Ë¢ÐÂÒ³Ãæ¡£¸üÖØÒªµÄÊÇ
Browsersync¿ÉÒÔͬʱÔÚPC¡¢Æ½°å¡¢ÊÖ»úµÈÉ豸ϽøÏîµ÷ÊÔ¡£ËüÕæµÄºÜÓаïÖúÈç¹ûÄãÐèÒª¿çƽ̨²âÊÔÄãµÄSDK£©¡£
ÌáʾºÍС¼¼ÇÉ
Console Logs Polyfill£¨Polyfilling ÊÇÓÉ RemySharp Ìá³öµÄÒ»¸öÊõÓËüÊÇÓÃÀ´ÃèÊö¸´ÖÆÈ±ÉÙµÄ
API ºÍAPI ¹¦ÄܵÄÐÐΪ£©
Õâ²»ÊÇÒ»¸öÕæÕýµÄpolyfill£¬Ö»ÊDZ£Ö¤ÔÚµ÷ÓÃconsole.log APIµÄʱºò²»Å׳ö´íÎó¡£
if (typeof console === "undefined") { var f = function() {}; console = { log: f, debug: f, error: f, info: f };} |
EncodeURI or EncodeURIComponent
Àí½âÈýÕߵIJ»Í¬ escape()¡¢encodeURI()¡¢encodeURIComponent()
here.
¼ÇסʹÓà encodeURI()ºÍencodeURIComponent()ÓÐ11¸ö×Ö·û²»Í¬¡£ ËüÃÇÊÇ:
# $ & + , / : ; = ? @ more discussion¡£

Äã¿ÉÄÜÕæµÄ²»ÐèÒªJQuery
ÕýÈç±êÌâËù˵, Äã¿ÉÄÜÕæµÄ²»ÐèÒªJQuery¡£Èç¹ûÄãÕýÔÚÕÒһЩ¹«¹²µÄ´úÂëÄÇÏÂÃæÕâЩ»áºÜÓÐÓãº- AJAX
EFFECTS, ELEMENTS, EVENTS, UTILS
Äã²»ÐèÒª jQuery
Free yourself from the chains of jQuery by embracing and understanding the modern Web API and disc overing various directed libraries to help you fill in the gaps. |
http://blog.garstasio.com/you-dont-need-jquery/
ÓÐÓÃµÄ Tips
Selecting Elements
DOM Manipulation
»Øµ÷º¯Êý¼ÓÔØ½Å±¾
ÀàËÆÓÚ Òì²½¼ÓÔØ½Å±¾ Ôö¼Ó»Øµ÷º¯Êý¡£
function loadScript(url, callback) { var script = document.createElement('script'); script.async = true; script.src = url; var entry = document.getElementsByTagName('script')[0]; entry.parentNode.insertBefore(script, entry); script.onload = script.onreadystatechange = function () { var rdyState = script.readyState; if (!rdyState || /complete|loaded/.test(script.readyState)) {
callback(); // detach the event handler to avoid
memory leaks in IE (http://mng.bz/W8fx)
script.onload = null;
script.onreadystatechange = null; } };
} |
Ö´ÐÐÒ»´Îº¯Êý
ÕâÀïչʾÁËÈçºÎʵÏÖº¯ÊýÖ»Ö´ÐÐÒ»´Î¡£
ÿµ±ÄãÏëÓÐÒ»¸öÖ»ÔËÐÐÒ»´ÎµÄº¯Êý¡£Í¨³£ÕâЩº¯ÊýÊÇÒÔʼþ¼àÌýµÄ·½Ê½£¬ºÜÄѹÜÀí¡£µ±È»Èç¹ûºÜÈÝÒ×¹ÜÀí£¬ÄãÖ»ÐèҪɾ³ý¼àÌýʼþ£¬µ«ÊÇÕâÊǸöÀíÏëµÄ״̬£¬ºÜ¶àʱºòÄãÖ»ÐèÒªÔÊÐíÒ»¸öº¯ÊýÖ´ÐÐÒ»´Î¡£ÏÂÃæµÄ´úÂë¿ÉÒÔʵÏÖ£º
// Copy from DWB // http://davidwalsh.name/javascript-once function once(fn, context) { var result; return function() { if(fn) { result = fn.apply(context || this, arguments); fn = null; } return result; }; } // Usagevar canOnlyFireOnce = once(function() { console.log('Fired!');}); canOnlyFireOnce(); // "Fired!"canOnlyFireOnce(); // nada |
»ñÈ¡Ñùʽ
»ñÈ¡ÐмäÑùʽ
<span id="black" style="color: black"> This is black color span </span> <script> document.getElementById('black').style.color; // => black</script> |
»ñÈ¡ÕæÕýµÄÑùʽ
<style> #black { color: red !important;} </style> <span id="black" style="color: black"> This is black color span </span> <script> document.getElementById('black').style.color; // => black // real var black = document.getElementById('black'); window.getComputedStyle(black, null).getPropertyValue('color'); // => rgb(255, 0, 0) </script> |
¼ì²âµ±Ç°´°¿Ú
function isElementInViewport (el) { //special bonus for those using jQuery if (typeof jQuery === "function" && el instanceof jQuery) { el = el[0]; } var rect = el.getBoundingClientRect(); return ( rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */ rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */ ); } |
|