【JS教程】JS常用交互经验技巧篇(二)

常用技巧篇

1、不刷新页面提交表单

    当然这种页面肯定不难想象是使用ajax来做,页面中有个地方是单独上传图片,然后并不保存到数据库,而是有一个提前预览的效果。那就是先把图片 upload到服务器上的一个临时目录,并给出页面上一个预览效果。等用户保存,在把图片移到真正的上传图片目录并把地址写入数据库。单独上传图片的这个 地方,是可以用ajax来实现的。但是我们用了一个提交的form,即当用户点击预览的时候,用form传统的post的方式传递数据。代码片断如下:

<form enctype = 'multipart/form-data' method="post" action=/front/imageupload name='imageupload' id='imageupload' target="uploadcallback">
    <input name="userfile" type="file" size="15" />
    <input type="hidden" name="pictureId" value="item_img">
</form>
<iframe name="uploadcallback" id="uploadcallback" src="<?php echo ' http://localhost".$this->baseUrl."/slot/imageupload';?>" style="display:none;"></iframe>

    iframe 所指向的页面中,可以直接调用表单所在页面的方法(如下 DEMO 所示):

<script type="text/javascript">if(window.parent){window.parent.uploadCallback("'.$arrayData['photo_url'].'");}</script>

    这样无论target设置成什么,提交以后都会跳转到域名/front /imageupload/。为了不让提交以后页面跳转,我们在页面底部增加了一个隐藏得frame。

    在把form中的target属性改成隐藏iframe的name。这样就看不到页面的跳转了。兼容性注释

    在 HTML 4.01 中,不赞成使用 form 元素的target 属性;在XHTML 1.0 Strict DTD 中,不支持该属性。

    语法< form target=" value">属性值值描述_blank在新窗口中打开。_self默认。_parent在父框架集中打开。_top在整个窗口中打开。 framename在指定的框架中打开。

2、刷新页面方法大全

  • 自动刷新页面的方法:

    1. 页面自动刷新:<meta http-equiv="refresh" content="20"> 其中20指每隔20秒刷新一次页面.

    2. 页面自动跳转:<meta http-equiv="refresh" content="20;url=http://www.***.com">  其中20指隔20秒后跳转到http://www.***.com/页面

  • Javascript刷新页面的几种方法:
        1   history.go(0) 
        2   location.reload() 
        3   location=location 
        4   location.assign(location) 
        5   document.execCommand('Refresh') 
        6    window.navigate(location) 
        7   location.replace(location) 
        8   document.URL=location.href

  • Javascript刷新框架或窗口方法:

    • 刷新包含该框架的页面:parent.location.reload();

    • 子窗口刷新父窗口:self.opener.location.reload();

    • 刷新另一个框架的页面:parent.另一FrameID.location.reload();

    • 如果想关闭窗口时刷新或者想开窗时刷新的话,在<body>中调用以下语句即可。

    <body onload="opener.location.reload()"> 开窗时刷新
    <body onUnload="opener.location.reload()"> 关闭时刷新
    <script language="javascript"> 
    window.opener.document.location.reload(); 
    </script>

    3、JS获取来路链接地址 document.referrer

      用途:可用来检测来路,防止盗链。

      问题:用console.info() 和 alert()方法输出这个变量时,提示undefined。但在控制台直接打印,可以看到来路。也可以将其值正常写入Cookie中。

    4、JS批量修改元素样式

        // 单个修改设置

    var head= document. getElementById("head"); 
    head.style.width = "200px"; 
    head.style.height = "70px"; 
    head.style.display = "block";

        // 直接重写样式,会清空旧的样式

    head.style.cssText="width:200px;height:70px;display:bolck";

      使用该方法在IE9/Firefox/Safari/Chrome/Opera中没什么问题,但由于 IE6/7/8中cssText返回值少了分号,需要检测返回值,如果cssText返回值没";"则补上。

    5、阻止事件冒泡和默认动作

    1)阻止事件冒泡,使成为捕获型事件触发机制.

    function stopBubble(e) {
        //如果提供了事件对象,则这是一个非IE浏览器
        if ( e && e.stopPropagation )
            //因此它支持W3C的stopPropagation()方法
            e.stopPropagation();
        else
            //否则,我们需要使用IE的方式来取消事件冒泡
            window.event.cancelBubble =true;
    //如果在jquery中,也可以采用返回false的方法触发
    // return false;
    }

    2)当按键后,不希望按键继续传递给如HTML文本框对象时,可以取消返回值.即停止默认事件默认行为.

    //阻止浏览器的默认行为
    function stopDefault( e ) {
        //阻止默认浏览器动作(W3C)
        if ( e && e.preventDefault )
            e.preventDefault();
        //IE中阻止函数器默认动作的方式
        else
            window.event.returnValue =false;
        return false;
    }

    6、JS获取各种高度宽度:浏览器窗口滚动条的位置、元素的几何尺寸
    7、离开jquery,照样$和ready & 各浏览器中querySelector和querySelectorAll的实现差异

         利用querySelector querySelectorAll实现$

    1 document.querySelector(DOM); 
    2
    3 function $(query) {   
    4      return document.querySelectorAll(query);   
    5 }

         实现ready及事件绑定范例:

    01 var readyFuns = [];   
    02 function DOMReady(){   
    03     for(var i=0,l=readyFuns.length;i<l;i++){   
    04       readyFun[i]();   
    05     }   
    06     readyFuns = null;
    07     // 回调方法执行完毕之后,解除ready的事件绑定
    08     document.removeEventListener('DOMContentLoaded',DOMReady,false);   
    09 }   
    10 function readyFun(fn){   
    11     // 只在第一次添加回调方法时,执行绑定操作
    12     if(readyFuns.length == 0){   
    13        document.addEventListener('DOMContentLoaded',DOMReady,false);   
    14     }   
    15     readyFuns.push(fn);   
    16 }

    w3c:http://www.w3.org/TR/selectors-api/#nodeselector

    javascript高级选择器querySelector和querySelectorAll

    转:http://www.hujuntao.com/archives/javascript-selector-queryselector-and-queryselectorall.html

    querySelector 和 querySelectorAll 方法是 W3C Selectors API 规范中定义的。他们的作用是根据 CSS 选择器规范,便捷定位文档中指定元素。

    目前几乎主流浏览器均支持了他们。包括 IE8(含) 以上版本、 Firefox、 Chrome、Safari、Opera。

    querySelector 和 querySelectorAll 在规范中定义了如下接口:

    module dom { [Supplemental, NoInterfaceObject] interface NodeSelector { Element querySelector(in DOMString selectors); NodeList querySelectorAll(in DOMString selectors); }; Document implements NodeSelector; DocumentFragment implements NodeSelector; Element implements NodeSelector; };

    从接口定义可以看到Document、DocumentFragment、Element都实现了NodeSelector接口。即这三种类型的元素都拥有者两个方法。querySelector和querySelectorAll的参数须是符合 css selector 的字符串。不同的是querySelector返回的是一个对象,querySelectorAll返回的一个集合(NodeList)。

    获取页面I属性D为test的元素:

    1 document.getElementById("test"); 
    2 //or 
    3 document.querySelector("#test");  //or
    4 document.querySelectorAll("#test")[0];

    获取页面class属性为”red”的元素:

    1 document.getElementsByClassName('red'
    2 //or 
    3 document.querySelector('.red'
    4 //or 
    5 document.querySelectorAll('.red')

    Element.querySelector和Element.querySelectorAll和jQuery(element).find(selector)选择器的区别:

    01 <div id="test1"><a href="http://www.hujuntao.com/">设计蜂巢</a></div> 
    02 <p id="bar">111</p> 
    03 <script> 
    04 var d1 = document.getElementById('test1'), 
    05 obj1 = d1.querySelector('div a'), 
    06 obj2 = d1.querySelectorAll('div a'); 
    07 obj3 = $(d1).find('div a'); 
    08 console.log(obj1) //<a href="http://www.hujuntao.com/">设计蜂巢</a> 
    09 console.log(obj2.length) //1 
    10 console.log(obj3) //null 
    11 </script>

    querySelectorAll 在文档内找全部符合选择器描述的节点包括Element本身
    jQuery(element).find(selector) 在文档内找全部符合选择器描述的节点不包括Element本身

    -------------------------------------------------------------------------------------------------------

    转:http://www.cnblogs.com/snandy/archive/2011/03/30/1999388.html

    querySelector和querySelectorAll是W3C提供的 新的查询接口

    module dom {
    [Supplemental, NoInterfaceObject]
    interface NodeSelector {
    Element querySelector(in DOMString selectors);
    NodeList querySelectorAll(in DOMString selectors);
    };
    Document implements NodeSelector;
    DocumentFragment implements NodeSelector;
    Element implements NodeSelector;
    };

    从接口定义可以看到Document、DocumentFragment、Element都实现了NodeSelector接口。即这三种类型的元素都拥有者两个方法。querySelector和querySelectorAll的参数须是符合 css selector 的字符串。不同的是querySelector返回的是一个对象,querySelectorAll返回的一个集合(NodeList)。

    目前 IE8/9及Firefox/Chrome/Safari/Opera 的最新版已经支持它们。

    如想获取页面class属性为"red"的元素,除了使用document.getElementsByClassName('red')还可以使用document.querySelector('.red')和document.querySelectorAll('.red')。

    但Element.querySelector和Element.querySelectorAll的实现有错误,如下

    ?  

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    <div id="d1">

        <p><a href=" http://www.sina.com.cn">SINA</a></p>

    </div>

    <script type="text/javascript">  

        function $(id){return document.getElementById(id);}

        var d1 = $('d1');

        var obj1 = d1.querySelector('div a');

        var obj2 = d1.querySelectorAll('div a');

        alert(obj1); // -> http://www.sina.com.cn/      

        alert(obj2.length); // -> 1 

    </script>

    在支持这两个方法的浏览器可以看到分别弹出了“http://www.sina.com.cn/”,和 “1”。说明查询到了想要的元素或元素集合。这与W3C的定义却是不合的,根据定义应该是在元素d1范围内查找"div a",而d1内压根没有div。因此应该分别返回null,空集合。

    jQuery1.4.2 及之前版本中只使用了document.querySelectorAll,没有使用Element.querySelectorAll。 jQuery1.4.3 后使用了Element.querySelectorAll,但做了修复。在选择器前加了"#__sizzle__"以强制其在指定元素内查找(3903-3918行)。简化下

    ?  

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    function $(id){return document.getElementById(id);}

    var d1 = $('d1');

    var obj1 = d1.querySelector('div a');

    var obj2 = d1.querySelectorAll('div a');

    var old = d1.id, id = d1.id = "__sizzle__";

    try {

        var query = '#' + id + ' div a';

        alert(d1.querySelector( query ));

        alert(d1.querySelectorAll( query ).length);

    } catch(e) {

    } finally {

        old ? d1.id = old : d1.removeAttribute( "id" );

    }


    实现很巧妙,指定范围的元素如果有id,将其保留在old,"__sizzle__"赋值其作为临时id,在选择器"div a"前指定查找范围为"#__sizzle__",即d1。finally语句来最后清理,如果指定范围的元素本身有id将其恢复为old,没有则去掉临时的id属性"__sizzle__"。

    8、JS获取节点方法汇总

    获取父节点方法:

        1)通过顶层document节点获取

    •  document.getElementById(elementId):若有多个相同id,返回第一个节点

    • document.getElementsByName(elementName):该方法是通过节点的name获取节点,从名字可以看出,这个方法返回的不是一个节点元素,而是具有同样名称的节点数组。然后,我们可以通过要获取节点的某个属性来循环判断是否为需要的节点。例如:在HTML中checkbox和radio都是通过相同的name属性值,来标识一个组内的元素。如果我们现在要获取被选中的元素,首先获取改组元素,然后循环判断是节点的checked属性值是否为true即可。

    • document.getElementsByTagName(tagName)

    • document.getElementsByClassName(className):ie没有该方法

    • document.querySelector(".SpaceList")  // 选择器中的类别跟jquery相同,低版本浏览器不支持

    • document.querySelectorAll("div")  // 选择器中的类别跟jquery相同,低版本浏览器不支持

         2)通过父节点获取

    • parentObj.firstChild

    • parentObj.lastChild

    • parentObj.childNodes:注意:经测试发现,在IE7上获取的是直接子节点的数组,而在Firefox2.0.0.11上获取的是所有子节点即包括子节点的子节点。

    • parentObj.children:注意:经测试,在IE7上,和childNodes效果一样,而Firefox2.0.0.11不支持。这也是为什么我要使用和其他方法不同样式的原因。因此不建议使用。

    • parentObj.getElementsByTagName(tagName)

         3)通过临近节点获取

    • neighbourNode.previousSibling

    • neighbourNode.nextSibling

         4)通过子节点获取

    • childNode.parentNode

    9、关于attribute 和 prototype

    getAttribute 的潜规则,对部分属性(如,checked、value)获取到的是属性的初始值,

    .value 获取到的是当前对象的属性值。

    $("#inputWeixin").val()
    // "100"
    $("#inputWeixin").attr("value")
    // "100"
    document.getElementById("inputWeixin").value
    // "100"
    document.getElementById("inputWeixin").getAttribute("value")
    // null

    10、JS获取浏览器信息和判断浏览器类型示例

         navigator中包含浏览器信息的属性:

    • 浏览器代码名称:navigator.appCodeName

    • 浏览器名称:navigator.appName

    • 浏览器版本号:navigator.appVersion               // 可用于判断浏览器版本

    • 对Java的支持:navigator.javaEnabled()

    • MIME类型(数组):navigator.mimeTypes

    • 系统平台:navigator.platform

    • 插件(数组):navigator.plugins      

    • 用户代理:navigator.userAgent                      // 可用于判断浏览器类型

          判断浏览器的简单范例:

         1)jquery方法$.browser使用$.browser可以方便的获取浏览器类型以及版本号

    • alert($.browser.msie);  //如果是IE浏览器则返回true 现在我们来了解一下$.browser的所有属性,使用for in方法遍历该对象,

    • for(b in $.browser) alert(b);  //你将看到$.browser的所有属性上面遍历后会返回version,safari,opera,msie,mozilla这五个属性,其中第一个属性version返回浏览器版本,而后面四个属性则返回布尔值

         2)js原生方法

    01 function  getBrowserVersion() { 
    02     var  browser = {}; 
    03     var  userAgent = navigator.userAgent.toLowerCase(); 
    04     var  s; 
    05     (s = userAgent.match(/msie ([/d.]+)/)) 
    06             ? browser.ie = s[1] 
    07             : (s = userAgent.match(/firefox//([/d.]+)/)) 
    08                     ? browser.firefox = s[1] 
    09                     : (s = userAgent.match(/chrome//([/d.]+)/)) 
    10                             ? browser.chrome = s[1] 
    11                             : (s = userAgent.match(/opera.([/d.]+)/)) 
    12                                     ? browser.opera = s[1] 
    13                                     : (s = userAgent 
    14                                             .match(/version//([/d.]+).*safari/)) 
    15                                             ? browser.safari = s[1] 
    16                                             : 0; 
    17     var  version =  "" 
    18     if  (browser.ie) { 
    19         version = 'msie '  + browser.ie; 
    20     else   if  (browser.firefox) { 
    21         version = 'firefox '  + browser.firefox; 
    22     else   if  (browser.chrome) { 
    23         version = 'chrome '  + browser.chrome; 
    24     else   if  (browser.opera) { 
    25         version = 'opera '  + browser.opera; 
    26     else   if  (browser.safari) { 
    27         version = 'safari '  + browser.safari; 
    28     else  
    29         version = '未知浏览器' 
    30     
    31     return  version; 
    32 }


    去处字符串中的空格
    String.prototype.trim = function(){return this.replace(/^\s+|\s+$/g, "");};  

    Verify that a given argument is a number
    function isNumber(n){
        return !isNaN(parseFloat(n)) && isFinite(n); 
    }
    17 – Verify that a given argument is an array
    Object.prototype.toString.call(obj) === '[object Array]’
    Array.isArray(obj); // its a new Array method
    arr instanceof Array; // false
    Get the max or the min in an array of numbers
    var  numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411]; 
    var maxInNumbers = Math.max.apply(Math, numbers);  
    var minInNumbers = Math.min.apply(Math, numbers);
    19 – Empty an array
    var myArray = [12 , 222 , 1000 ];   
    myArray.length = 0; // myArray will be equal to [].


    随机打乱数组
    var numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411]; 
    numbers = numbers.sort(function(){ return Math.random() - 0.5});


    11 – Generate a random set of alphanumeric characters

    function generateRandomAlphaNum(len) {
        var rdmString = "";
        for( ; rdmString.length < len; rdmString  += Math.random().toString(36).substr(2));
        return  rdmString.substr(0, len);
     
    }

    20.给XMLHttpRequests设置timeouts 

    如果一个XHR需要花费太长时间,你可以终止链接(例如网络问题),通过给XHR使用setTimeout()解决。 

    [js] view plaincopy

    var xhr = new XMLHttpRequest ();   
    xhr.onreadystatechange = function () {    
        if (this.readyState == 4) {    
            clearTimeout(timeout);    
            // do something with response data   
        }    
    }    
    var timeout = setTimeout( function () {    
        xhr.abort(); // call error callback    
    }, 60*1000 /* timeout after a minute */ );   
    xhr.open('GET', url, true);    
      
    xhr.send();  
    此外,通常你应该完全避免同步Ajax调用。

    21.处理WebSocket超时
    一般来说,当创建一个WebSocket链接时,服务器可能在闲置30秒后链接超时,在闲置一段时间后,防火墙也可能会链接超时。 
    为了解决这种超时问题,你可以定期地向服务器发送空信息,在代码里添加两个函数:一个函数用来保持链接一直是活的,另一个用来取消链接是活的,使用这种方法,你将控制超时问题。 
    添加一个timeID……

    [js] view plaincopy

    var timerID = 0;   
    function keepAlive() {   
        var timeout = 15000;    
        if (webSocket.readyState == webSocket.OPEN) {    
            webSocket.send('');    
        }    
        timerId = setTimeout(keepAlive, timeout);    
    }    
    function cancelKeepAlive() {    
        if (timerId) {    
            cancelTimeout(timerId);    
        }    
    }  
    keepAlive()方法应该添加在WebSocket链接方法onOpen()的末端,cancelKeepAlive()方法放在onClose()方法下面。 


    5、简单的 clone 方法

    function clone(object) {        function OneShotConstructor(){};       OneShotConstructor.prototype= object;        return new OneShotConstructor();   }   clone(Array).prototype ;  // []  

    18.一个HTML escaper函数


    [js] view plaincopy

    function escapeHTML(text) {    
        var replacements= {"<""<"">"">","&""&""\"""""};                        
        return text.replace(/[<>&"]/g, function(character) {    
            return replacements[character];    
        });   
    }   

    你可能感兴趣的:(【JS教程】JS常用交互经验技巧篇(二))