mass framework在最新版使用種子模塊加載節點的屬性來判定是什么環境:
<script type="text/javascript" debug="true" src="/scripts/mass.js"></script>
當頁面一載入此腳本時,它通過 scripts = DOC.getElementsByTagName( "script" );node = scripts[ scripts.length - 1 ];得到此節點,然后我們使用getAttribute("debug")來得到這個值。
我計划此屬性只能有四個合法的值,true, false, 0, 1,其他值或者不存在此屬性,則認為$["@debug"]為false。但不要忘記,通過getAttribute得到的值都是字符串,然后Boolean("false")的結果為true,因此剩下的問題是如何轉換這四個值!
方法一,使用eval, Function進行解析
var bool = node.getAttribute("debug") $["@debug"] = /^(false|true|1|0)$/i.test(false) ? eval("0,"+bool) : false;
方法二,使用JSON.parse
//由一群的糖果男孩提供 var bool = node.getAttribute("debug") $["@debug"] = /^(false|true|1|0)$/i.test(false) ? JSON.parse(bool) : false;
不過JSON有兼容問題,而且這是種子模塊,來不及調用其他模塊……
方法三,使用正則
var bool = node.getAttribute("debug") ; var match = bool.match(/^(true|1)$|^(false|0)$/) $["@debug"] = !!(bool && bool[1])
方法四,直接利用等號與短路
//由一群的abcd提供 沒有用到轉換,但很滿足我框架的需求 var str = node.getAttribute("debug") ; $["@debug"] = str =='true' || str=='1';
然后方法四完勝。這事情告訴我們,不要把情況想得太復雜……