//如果浏览器没有为label元素添加默认行为,可手动写入foucusLables函数
function focusLables(){
var articles=document.getElementsByTagName("article");
if(articles.length==0)return false;
var forms=articles[0].getElementsByTagName("form");
if(forms.length==0)return false;
var labels=forms[0].getElementsByTagName("label");
for(var i=0;i<labels.length;i++){
if(!labels[i].getAttribute("for"))continue;
labels[i].onclick=function(){
var id=this.getAttribute("for");
//这了不写continue,是因为onclick事件中没有循环语句,因此不能使用continue
//故直接return false;
if(!document.getElementById(id))return false;
var element=document.getElementById(id);
element.focus();
}
}
}
addLoadEvent(focusLables);
// resetFields为了兼容低版本不支持placeholder的浏览器
function resetFields(whichform){
//如果placeholder浏览器支持,则直接return,不再需要执行下面的代码
        if(Modernizr.input.placeholder)return;
for(var i=0;i<whichform.elements.length;i++){
var element=whichform.elements[i];
if(element.type=="submit")continue;
var check=element.placeholder||element.getAttribute("placeholder");
if(!check)continue;
element.onfocus=function(){
var text=this.placeholder||this.getAttribute("placeholder");
if(this.value==text){
this.value="";
this.className="";
}
}
element.onblur=function(){
if(this.value==""){
this.value=this.placeholder||this.getAttribute("placeholder");
this.className="placeholder";
}
}
element.onblur();
}
}
function prepareForms(){
for(var i=0;i<document.forms.length;i++){
var thisform=document.forms[i];
resetFields(thisform);
}
}
addLoadEvent(prepareForms);<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8" />
  <title>Jay Skript And The Domsters: Tour dates</title>
  <script src="scripts/modernizr-2010.07.16dev.js"></script>
  <link rel="stylesheet" media="screen" href="styles/basic.css" />
</head>
<body>
  <header>
    <img src="images/logo.JPG" alt="Jay Skript and the Domsters" />
    <nav>
      <ul>
        <li><a href="index.html">Home</a></li>
        <li><a href="about.html">About</a></li>
        <li><a href="photos.html">Photos</a></li>
        <li><a href="live.html">Live</a></li>
        <li><a href="contact.html">Contact</a></li>
      </ul>
    </nav>
  </header>
  <article>
    <h1>Contact the band</h1>
    <form action="submit.html" method="post">
      <fieldset>
        <p>
          <label for="name">Name:</label>
          <input type="text" id="name" name="name" placeholder="Your name" required="required">
        </p>
        <p>
          <label for="email">Email:</label>
          <input type="email" id="email" name="email" placeholder="Your email address" required="required">
        </p>
        <p>
          <label for="message">Message:</label>
          <textarea name="message" id="message" cols="45" rows="7" required="required" placeholder="Write your message here."></textarea>
        </p>
        <input type="submit" value="Send">
      </fieldset>
    </form>
  </article>
  <script src="scripts/global.js"></script>
</body>
</html>
上面的代码是按照DOM编程艺术里面边学别跟着敲的。当获得焦点时,默认值应该为空,如果没有输入文本的情况下失去焦点,默认值应该会再次出现。但是我检查了好几遍,花了一下午时间也没法先哪里错了。明明是按照书上的代码敲出来的,但就是没有效果已经焦头烂额了。。求大神指点。。每次敲完代码,总要花两倍于敲代码的时间去检查错误。。有些比较明显的错误用F12就能检查出来。但有时候F12也显示没有出错,但就是效果出不来。。这该怎么检查提高效率

解决方案 »

  1.   

    scripts/modernizr-2010.07.16dev.js 这个文件有下载吗?if(Modernizr.input.placeholder)return;  把这行删了能运行.
      

  2.   

    照着书上敲太复杂了,可以简单的理一下思路,功能需求就是输入框有一个默认值或者输入过的值,当获取焦点的时候值清空,没有输入任何东西失去焦点的时候添加默认值。你可以尝试一下自己写一个简单的demo,创建一个中间变量,当输入框获取焦点的时候把值赋给中间变量,失去焦点的时候判断是否有输入东西,如果没有就把中间变量的值赋给输入框。
      

  3.   


    下载了。不管用。
    我把<script src="scripts/modernizr-2010.07.16dev.js"></script>
    if(Modernizr.input.placeholder)return;  都删掉了。也不起作用
      

  4.   

    chrome测试正常。
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="utf-8" />
      <title>Jay Skript And The Domsters: Tour dates</title>
      <link rel="stylesheet" media="screen" href="styles/basic.css" />
    </head>
    <body>
      <header>
        <img src="images/logo.JPG" alt="Jay Skript and the Domsters" />
        <nav>
          <ul>
            <li><a href="index.html">Home</a></li>
            <li><a href="about.html">About</a></li>
            <li><a href="photos.html">Photos</a></li>
            <li><a href="live.html">Live</a></li>
            <li><a href="contact.html">Contact</a></li>
          </ul>
        </nav>
      </header>
      <article>
        <h1>Contact the band</h1>
        <form action="submit.html" method="post">
          <fieldset>
            <p>
              <label for="name">Name:</label>
              <input type="text" id="name" name="name" placeholder="Your name" required="required">
            </p>
            <p>
              <label for="email">Email:</label>
              <input type="email" id="email" name="email" placeholder="Your email address" required="required">
            </p>
            <p>
              <label for="message">Message:</label>
              <textarea name="message" id="message" cols="45" rows="7" required="required" placeholder="Write your message here."></textarea>
            </p>
            <input type="submit" value="Send">
          </fieldset>
        </form>
      </article>
      <script type="text/javascript">
      function addLoadEvent(func){
        var oldonload = window.onload;
        if(typeof window.onload != 'function'){
            window.onload = func;
        }else{
            window.onload = function(){
                oldonload();
                func();
            }
        }    
    }//如果浏览器没有为label元素添加默认行为,可手动写入foucusLables函数
    function focusLables(){
        var articles=document.getElementsByTagName("article");
        if(articles.length==0)return false;
        var forms=articles[0].getElementsByTagName("form");
        if(forms.length==0)return false;
        var labels=forms[0].getElementsByTagName("label");
        for(var i=0;i<labels.length;i++){
            if(!labels[i].getAttribute("for"))continue;
            labels[i].onclick=function(){
                var id=this.getAttribute("for");
                //这了不写continue,是因为onclick事件中没有循环语句,因此不能使用continue
                //故直接return false;
                if(!document.getElementById(id))return false;
                var element=document.getElementById(id);
                element.focus();
            }
        }
    }
    addLoadEvent(focusLables);
    // resetFields为了兼容低版本不支持placeholder的浏览器
    function resetFields(whichform){
        //如果placeholder浏览器支持,则直接return,不再需要执行下面的代码
        //if(Modernizr.input.placeholder)return;
        for(var i=0;i<whichform.elements.length;i++){
            var element=whichform.elements[i];
            if(element.type=="submit")continue;
            var check=element.placeholder||element.getAttribute("placeholder");
            if(!check)continue;
            element.onfocus=function(){
                var text=this.placeholder||this.getAttribute("placeholder");
                if(this.value==text){
                    this.value="";
                    this.className="";
                }
            }
            element.onblur=function(){
                if(this.value==""){
                    this.value=this.placeholder||this.getAttribute("placeholder");
                    this.className="placeholder";
                }
            }
            element.onblur();
        }
    }
    function prepareForms(){
        for(var i=0;i<document.forms.length;i++){
            var thisform=document.forms[i];
            resetFields(thisform);
        }
    }
    addLoadEvent(prepareForms);
      </script>
    </body>
    </html>
      

  5.   

    Quote: 引用 4 楼 Free_Wind22 的回复:

    chrome测试正常。
    聚焦的时候,内容消失?失去焦点以后,内容又恢复了吗?可是我的不对啊。这是我的思路:关键点是通过判断元素节点的value与元素节点的placeholder属性的值是否相等。
    我也检查不出错误在哪,感觉思路是对的。可是我在chrome上没有效果啊。
    我在浏览器上显示的是 , 聚焦以后,placeholder的值还在只有当主动打字时,内容才消失被输入的值代替。
    当我把输入的值删除以后,placeholder的值立刻就恢复了。不是等到失去焦点以后才恢复的。
      

  6.   

    chrome下是用自带的placeholder功能
    用ie测试
      

  7.   


    我想问一下如果是chrome的话,怎么实现获得焦点时,内容消失。失去焦点以后,内容又恢复。
    chrome自带的placeholder并没有这个功能,只是具备一个占位的效果。function resetFields(){
    var articles=document.getElementsByTagName("article");
    var forms=articles[0].getElementsByTagName("form");
    var inputs=forms[0].getElementsByTagName("input");
    for(var i=0;i<inputs.length;i++){
    if(!inputs[i].placeholder)continue;
    var inpls=inputs[i].placeholder;
    // console.log(inpls);
    inputs[i].onfocus=function(){
    if(this.value==this.defaultValue){
    this.placeholder="";
    }
    }
    // console.log(inputs[i].placeholder);
    inputs[i].onblur=function(){
    if(this.value==""){
    this.placeholder=inpls;
    }
    }
    // console.log(inputs[i].placeholder);
    // inputs[i].onblur();
    }
    }
    addLoadEvent(resetFields);
    这是我自己写了一个。只是写的两个input的,还没有写textarea。但是我发现
    刚加载后,页面都是正常的。
    当我对id=name这个input取焦点后,内容从your name变成了your email address了。
    id=email这个input还是正常的。 我也用console。log测试了一下感觉应该是对的啊。可是为什么最后第一个input的内容改变了。
      

  8.   


    还想问一下。
    inputs[i].onblur();
    这行代码不太明白在这里是什么作用。
    注释掉感觉也没什么影响。()的作用是立刻执行。
    inputs[i].onblur是元素失去焦点以后执行。不就是在元素失去焦点以后立刻就会被执行吗?
    那为什么还要inputs[i].onblur()
      

  9.   

    不想用chrome自带的placeholder,就把属性换个名字<!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="utf-8" />
      <title>Jay Skript And The Domsters: Tour dates</title>
      <link rel="stylesheet" media="screen" href="styles/basic.css" />
    </head>
    <body>
      <header>
        <img src="images/logo.JPG" alt="Jay Skript and the Domsters" />
        <nav>
          <ul>
            <li><a href="index.html">Home</a></li>
            <li><a href="about.html">About</a></li>
            <li><a href="photos.html">Photos</a></li>
            <li><a href="live.html">Live</a></li>
            <li><a href="contact.html">Contact</a></li>
          </ul>
        </nav>
      </header>
      <article>
        <h1>Contact the band</h1>
        <form action="submit.html" method="post">
          <fieldset>
            <p>
              <label for="name">Name:</label>
              <input type="text" id="name" name="name" placeholderx="Your name" required="required">
            </p>
            <p>
              <label for="email">Email:</label>
              <input type="email" id="email" name="email" placeholderx="Your email address" required="required">
            </p>
            <p>
              <label for="message">Message:</label>
              <textarea name="message" id="message" cols="45" rows="7" required="required" placeholderx="Write your message here."></textarea>
            </p>
            <input type="submit" value="Send">
          </fieldset>
        </form>
      </article>
      <script type="text/javascript">
      function addLoadEvent(func){
        var oldonload = window.onload;
        if(typeof window.onload != 'function'){
            window.onload = func;
        }else{
            window.onload = function(){
                oldonload();
                func();
            }
        }    
    }
     
    //如果浏览器没有为label元素添加默认行为,可手动写入foucusLables函数
    function focusLables(){
        var articles=document.getElementsByTagName("article");
        if(articles.length==0)return false;
        var forms=articles[0].getElementsByTagName("form");
        if(forms.length==0)return false;
        var labels=forms[0].getElementsByTagName("label");
        for(var i=0;i<labels.length;i++){
            if(!labels[i].getAttribute("for"))continue;
            labels[i].onclick=function(){
                var id=this.getAttribute("for");
                //这了不写continue,是因为onclick事件中没有循环语句,因此不能使用continue
                //故直接return false;
                if(!document.getElementById(id))return false;
                var element=document.getElementById(id);
                element.focus();
            }
        }
    }
    addLoadEvent(focusLables);
    // resetFields为了兼容低版本不支持placeholderx的浏览器
    function resetFields(whichform){
        //如果placeholderx浏览器支持,则直接return,不再需要执行下面的代码
        //if(Modernizr.input.placeholderx)return;
        for(var i=0;i<whichform.elements.length;i++){
            var element=whichform.elements[i];
            if(element.type=="submit")continue;
            var check=element.placeholderx||element.getAttribute("placeholderx");
            if(!check)continue;
            element.onfocus=function(){
                var text=this.placeholderx||this.getAttribute("placeholderx");
                if(this.value==text){
                    this.value="";
                    this.className="";
                }
            }
            element.onblur=function(){
                if(this.value==""){
                    this.value=this.placeholderx||this.getAttribute("placeholderx");
                    this.className="placeholderx";
                }
            }
            element.onblur();
        }
    }
    function prepareForms(){
        for(var i=0;i<document.forms.length;i++){
            var thisform=document.forms[i];
            resetFields(thisform);
        }
    }
    addLoadEvent(prepareForms);
      </script>
    </body>
    </html>
      

  10.   

    Quote: 引用 9 楼 Free_Wind22 的回复:

    不想用chrome自带的placeholder,就把属性换个名字chrome自带的placeholder自带
    获得焦点内容消失这个功能吗?我用的chrome并不这样啊
      

  11.   

    Quote: 引用 9 楼 Free_Wind22 的回复:

    不想用chrome自带的placeholder,就把属性换个名字还有一个问题。
    就是把placeholder换成一个自定义属性,像placeholdera这样。我用chrome的F12检测:
    chrome自带的placeholder属性:
    var a=document.forms[0].elements[1].value 返回的是“”;
    使用placeholdera这个自定义属性:
    var a=document.forms[0].elements[1].value 返回的就是your name;
    这是怎么回事?
    这个value值是从哪来的?this.value==text为什么会成立呢?