2010-09-21 51 views
0

我有以下問題。style.display和href值=#

我有一個使用jQuery動態添加iFrame的頁面。

裏面的一些iFrame中的內容,也有像超鏈接:

<a href="#" onclick="hideTestDiv();"> 

功能hideTestDiv做:

...

document.getElementById('test').style.display = 'none'; 

..

中的IE瀏覽器,這會導致主頁面向右滾動到頂部並且第一個元素主頁消失。

我不知道如何解決這個問題,因爲我無法修改iFrames的內容。

我真的很感激任何幫助。

下一個是重現錯誤的例子。

主要頁面:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"><head> 
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> 


    <title>Dynamic tabs with jQuery - why and how to create them | JankoAtWarpSpeed Demos</title> 
    <style type="text/css"> 
     body { font-family:Lucida Sans, Lucida Sans Unicode, Arial, Sans-Serif; font-size:13px; margin:0px auto;} 
     #tabs { margin:0; padding:0; list-style:none; overflow:hidden; } 
     #tabs li { float:left; display:block; padding:5px; background-color:#bbb; margin-right:5px;} 
     #tabs li a { color:#fff; text-decoration:none; } 
     #tabs li.current { background-color:#e1e1e1;} 
     #tabs li.current a { color:#000; text-decoration:none; } 
     #tabs li a.remove { color:#f00; margin-left:10px;} 
     #content { width:100%; height:100%; background-color:#e1e1e1;} 


     #main { width:900px; height:100%; margin:0px auto; overflow:hidden;background-color:#F6F6F6; margin-top:0px; 
      -moz-border-radius:10px; -webkit-border-radius:10px; padding:0px;} 
     #wrapper, #doclist { float:left; margin:0 20px 0 0;} 
     #doclist { width:70px; border-right:solid 1px #dcdcdc;} 
     #doclist ul { margin:0; list-style:none;} 
     #doclist li { margin:10px 0; padding:0;} 
     #documents { margin:0; padding:0;} 

     #wrapper { width:100%; height:500px; margin-top:0px;} 

     #header{ background-color:#F6F6F6; width:900px; margin:0px auto; margin-top:0px; 
      -moz-border-radius:10px; -webkit-border-radius:10px; padding:30px; position:relative;} 
     #header h2 {font-size:16px; font-weight:normal; margin:0px; padding:0px;} 

    </style> 

    <script type="text/javascript" src="Dynamic%20tabs%20with%20jQuery%20_archivos/jquery-1.js"></script> 
    <script type="text/javascript"> 
     $(document).ready(function() { 
      $("#documents a").click(function() { 
       addTab($(this)); 
      }); 



      $('#tabs a.tab').live('click', function() { 
       // Get the tab name 
       var contentname = $(this).attr("id") + "_content"; 

       // hide all other tabs 
       $("#content iframe").hide(); 
       $("#tabs li").removeClass("current"); 

       // show current tab 
       $("#" + contentname).show(); 
       $(this).parent().addClass("current"); 
      }); 

      $('#tabs a.remove').live('click', function() { 
       // Get the tab name 
       var tabid = $(this).parent().find(".tab").attr("id"); 

       // remove tab and related content 
       var contentname = tabid + "_content"; 
       $("#" + contentname).remove(); 
       $(this).parent().remove(); 

       // if there is no current tab and if there are still tabs left, show the first one 
       if ($("#tabs li.current").length == 0 && $("#tabs li").length > 0) { 

        // find the first tab  
        var firsttab = $("#tabs li:first-child"); 
        firsttab.addClass("current"); 

        // get its link name and show related content 
        var firsttabid = $(firsttab).find("a.tab").attr("id"); 
        $("#" + firsttabid + "_content").show(); 
       } 
      }); 
     }); 
     function addTab(link) { 
      // If tab already exist in the list, return 
      if ($("#" + $(link).attr("rel")).length != 0) 
       return; 

      // hide other tabs 
      $("#tabs li").removeClass("current"); 
      $("#content iframe").hide(); 

      // add new tab and related content 
      $("#tabs").append("<li class='current'><a class='tab' id='" + 
       $(link).attr("rel") + "' href='#'>" + $(link).html() + 
       "</a><a href='#' class='remove'>x</a></li>"); 

    $("#content").append("<iframe width='100%' height='100%' frameborder='0' id='" + $(link).attr("rel") + "_content' src='"+ 
       $(link).attr("title") + "'/>"); 

      // set the newly added tab as current 
      $("#" + $(link).attr("rel") + "_content").show(); 
     } 
    </script> 
</head><body bgcolor="#F8F7F6"> 

    <div id="main"> 
<div id="dummy"> 
should not dissapear 
</div > 
    <div id="doclist"> 

     <ul id="documents"> 
      <li><a href="#" rel="Servicio1" title="tab_content.html">service 1</a></li> 
      <li><a href="#" rel="Servicio2" title="http://developer.yahoo.com/yui/">service 2</a></li> 
      <li><a href="#" rel="Servicio3" title="http://www.facebook.com/">service 3</a></li> 
      <li><a href="#" rel="Servicio4" title="http://www.save-ass.com/code/2010/01/28/pestanas-dinamicas-con-jquery/">service 4</a></li> 

     </ul> 
    </div> 
    <div id="wrapper"> 
     <ul id="tabs"> 
      <!-- Tabs go here --> 
     </ul> 
     <div id="content"> 
      <!-- Tab content goes here --> 
     </div> 
    </div> 
    </div> 
</body></html> 

與網址的iframe =#(tab_content.html)

<html> 

<head> 
    <title>JavaScript Popup Example 3</title> 
    <script type="text/javascript" src="Dynamic%20tabs%20with%20jQuery%20_archivos/jquery-1.js"></script> 
    <script language="JavaScript" type="text/javascript"> 

    function hideTestDiv() { 
    document.getElementById('test').style.display = 'none'; 
    } 

    function showTestDiv() { 
    document.getElementById('test').style.display = 'block'; 
    } 

</script> 

</head> 

<body > 

    <a href="#" onclick="hideTestDiv();">    hide test div </a> 
    <br> 
    <a href="#" onclick="showTestDiv();">    show test div  </a> 
    <br> 

<div id="test"> some content to hide or show</div> 
</body> 
</html> 

回答

1

hideTestDiv();後只需添加return false; - 防止click事件的發生和被調用的href。

1

您需要您的來電hideTestDiv功能後返回false,像這樣:

<a href="#" onclick="hideTestDiv(); return false;">

您的onClick JavaScript的執行環節,否則後跟隨(以#鏈接指向當前頁面的鏈接 - 當你按照這樣的鏈接時,一些瀏覽器會跳回到頁面的頂部)

+0

這是行不通的,除非你也該函數的返回值的事件,如'點擊數=「返回hideTestDiv();」'。 – 2010-09-21 15:44:02

+0

Doh,你是對的!這會教會我一次做太多事情!我編輯了我的答案,以更簡單的方式做到這一點:-) – Ash 2010-09-21 15:56:25

0

謝謝你的答案。

我已經解決了這個問題:

在叫addTab JavaScript函數,下一行後:

$("#" + $(link).attr("rel") + "_content").show(); 

我加入了folloging代碼:

$("#" + $(link).attr("rel") + "_content").load(
      function(){ 
       $("#" + $(link).attr("rel") + "_content") 
       .contents().find('a[href=#]') 
       .bind('click',function (event) { event.preventDefault();}); 
      } 
      ); 

我不得不這樣做因爲在實際情況下,我沒有權限直接在iframe的內容中添加代碼。

0

另一種選擇是攔截在iframe中單擊事件和影響像這樣的東西父框架停止:

  $("#content iframe").live('click', function (e) { 
       e.preventDefault(); 
      }); 

這也將防止在I幀點擊經由類似影響父:

<a href="malicioussite.com?s=innocentsite.com" target="_top">InnocentSite.com</a> 

或者類似的東西:

<a href="#top">Top</a> 

無論如何,無論什麼作品,對嗎?