2013-04-27 640 views
0

我想單擊iframe並使用jQuery UI在新選項卡中打開鏈接,但它不起作用,並且新鏈接將在相同的標籤。 但是,如果我單擊屏幕上iframe外部的任何點,則會創建新選項卡。如何在單擊iframe時獲取iframe外部的點擊事件

我很感激,如果有人知道幫我

問候, 基督教


主要頁面

<!doctype html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8" /> 
    <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.2/themes/smoothness/jquery-ui.css" /> 
    <script src="http://code.jquery.com/jquery-1.9.1.js"></script> 
    <script src="http://code.jquery.com/ui/1.10.2/jquery-ui.js"></script> 
    <style> 
     #tabs { margin-top: 1em; } 
     #tabs li .ui-icon-close { float: left; margin: 0.4em 0.2em 0 0; cursor: pointer; } 
     #add_tab { cursor: pointer; } 
    </style>   

    <script type="text/javascript"> 
     $(function() { 
      $('.dock').find("a").click(function(event) { 
       event.preventDefault(); 
       var name = $(event.currentTarget).text(), 
        url = $(event.currentTarget).attr("href"); 
       createNewTab(name, url, 5, true); 
       return false; 
      }); 

      $(this).click(function(e){ 
       $('iframe').contents().find("a").click(function(event){ 
        event.preventDefault(); 
        var name = $(event.currentTarget).text(), 
         url = $(event.currentTarget).attr("href"); 
        createNewTab(name, url, 5, true); 
        return false; 
       }); 
      }); 

      tabs = $("#tabs").tabs(); 
      tabCounter = 1;   

      function selectNewTab() { 
       $('#tabs').tabs('option', 'active', -1); 
      } 
      function addTab(name, url) { 
       tabCounter++; 
       var tabTemplate = "<li><a href='#{href}'>#{label}</a><span class='ui-icon ui-icon-close' role='presentation'>Remover Tab</span></li>"; 
       var id = "tabs-" + tabCounter, 
        li = $(tabTemplate.replace(/#\{href\}/g, "#" + id).replace(/#\{label\}/g, name)), 
        tabContentHtml = '<iframe id="ifr" class="tabs-iframe" src="' + url + '" width="100%" height="400" scrolling="auto" frameborder="no" align="center"></iframe>'; 
       tabs.find(".ui-tabs-nav").append(li); 
       tabs.append("<div id='" + id + "'>" + tabContentHtml + "</div>"); 
       tabs.tabs("refresh"); 
      } 
      function createNewTab(name, url, size, checkTabExists) { 
       addTab(name, url); 
       selectNewTab(); 
      }   
     }); 
    </script>  
</head> 
<body> 
    <div class="content"> 
     <div id="tabs"> 
      <ul> 
       <li><a href="#tabs-1">First Tab</a></li> 
      </ul> 
      <div id="tabs-1"> 
       <p>Tab 1</p> 
      </div> 
     </div> 
    </div> 
    <div class="dock"> 
     <a href="another-page.html">New Tab</a> 
    </div> 
</body> 
</html> 

的另一頁

<!doctype html> 
<html lang="en"> 
<head> 
<meta charset="utf-8" /> 
<head> 
</head> 
<body> 
    <div> 
     <a href="http://www.microsoft.com">Click Here</a> 
    </div> 
</body> 
</html> 
+0

我不認爲這是可能的,你想要的方式,JavaScript的同源策略會阻止任何JavaScript代碼來訪問的iFrame如果它不是在同一個域(域,協議和端口必須匹配)。 – 2013-04-27 15:06:21

+0

感謝您的反饋。如果我已經打開了另一個域的鏈接,我同意你的看法。我做了另一個測試,在同一個域中創建第三個頁面,但也沒有工作。在我看來,這個問題與點擊事件有關,因爲如果我點擊iframe外部的屏幕上的某個地方,它會起作用。在另一個測試中,我嘗試將focus()設置爲屏幕上的另一個元素,或者以編程方式在另一個元素上運行click(),但這也不起作用。 – ChristianB 2013-04-27 18:19:04

回答

1

@ChristianB創建時,您沒有將點擊事件附加到您的iFrame上,您正試圖將點擊事件附加到現有的iFrame上。我試圖改變你的函數addTab中的代碼;

我已將id屬性附加到您的iFrame,因此一旦創建iFrame,我就可以將點擊事件附加到iFrame文檔。

試試這個:

 function addTab(name, url) { 
      tabCounter++; 
      var tabTemplate = "<li><a href='#{href}'>#{label}</a><span class='ui-icon ui-icon-close' role='presentation'>Remover Tab</span></li>"; 
      var id = "tabs-" + tabCounter, 
       li = $(tabTemplate.replace(/#\{href\}/g, "#" + id).replace(/#\{label\}/g, name)), 
       tabContentHtml = '<iframe id="ifr' + tabCounter + '" class="tabs-iframe" src="' + url + '" width="100%" height="400" scrolling="auto" frameborder="no" align="center"></iframe>'; 
      tabs.find(".ui-tabs-nav").append(li); 
      tabs.append("<div id='" + id + "'>" + tabContentHtml + "</div>"); 
      tabs.tabs("refresh"); 

      //Add the Link Click to newly created iFrame 

      $('#ifr'+tabCounter).ready(function(e) { 
       /* This does not work with chrome 
       $('#ifr'+tabCounter).contents().find("a").bind('click', function(event){ 
       */ 
       //Below throws an exception in chrome, but still works 
       $('#ifr'+tabCounter.contentWindow.document.body).find(a).bind('click', function(event){ 
        //event.preventDefault(); 
        var name = $(event.currentTarget).text(); 
        var url = $(event.currentTarget).attr("href"); 
        createNewTab(name, url, 5, true); 
        return false; 
       }); 
      }); 
     } 
+0

感謝Mohit的反饋意見。我發佈一個新的答案,把你的代碼。 – ChristianB 2013-04-28 14:19:29

0

感謝莫希特Padalia。你幫了我很多。我試着用你的代碼,但沒有工作。我相信它適合你,因爲函數selectNewTab()不起作用。在這種情況下,我添加了一個策略來強制選擇創建的新選項卡。請注意,如果在下方運行代碼時選擇了新選項卡,並單擊「此處啓用」,則新鏈接將在同一選項卡中打開。但是,如果您單擊iframe外部屏幕上的任意位置,然後單擊將工作的鏈接,並創建新選項卡。

親切的問候,

<!doctype html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8" /> 
    <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.2/themes/smoothness/jquery-ui.css" /> 
    <script src="http://code.jquery.com/jquery-1.9.1.js"></script> 
    <script src="http://code.jquery.com/ui/1.10.2/jquery-ui.js"></script> 
    <style> 
     #tabs { margin-top: 1em; } 
     #tabs li .ui-icon-close { float: left; margin: 0.4em 0.2em 0 0; cursor: pointer; } 
     #add_tab { cursor: pointer; } 
    </style>   

    <script type="text/javascript"> 
     $(function() { 
      $('.dock').find("a").click(function(event) { 
       event.preventDefault(); 
       var name = $(event.currentTarget).text(), 
        url = $(event.currentTarget).attr("href"); 
       createNewTab(name, url, 5, true); 
       return false; 
      }); 

      $(this).click(function(e){ 
       $('iframe').contents().find("a").click(function(event){ 
        event.preventDefault(); 
        var name = $(event.currentTarget).text(), 
         url = $(event.currentTarget).attr("href"); 
        createNewTab(name, url, 5, true); 
        return false; 
       }); 
      }); 

      tabs = $("#tabs").tabs(); 
      tabCounter = 1;   

      function selectNewTab() { 
       $('#tabs').tabs('option', 'active', -1); 
      } 
      function addTab(name, url) { 
       tabCounter++; 
       var tabTemplate = "<li><a href='#{href}'>#{label}</a><span class='ui-icon ui-icon-close' role='presentation'>Remover Tab</span></li>"; 
       var id = "tabs-" + tabCounter, 
        li = $(tabTemplate.replace(/#\{href\}/g, "#" + id).replace(/#\{label\}/g, name)), 
        tabContentHtml = '<iframe id="ifr' + tabCounter + '" class="tabs-iframe" src="' + url + '" width="100%" height="400" scrolling="auto" frameborder="no" align="center"></iframe>'; 
       tabs.find(".ui-tabs-nav").append(li); 
       tabs.append("<div id='" + id + "'>" + tabContentHtml + "</div>"); 
       tabs.tabs("refresh"); 

       //Add force select new tab 
       tabs.tabs('option', 'active', -1); 

       //Add the Link Click to newly created iFrame 

       $('#ifr'+tabCounter).ready(function(e) { 
        /* This does not work with chrome 
        $('#ifr'+tabCounter).contents().find("a").bind('click', function(event){ 
        */ 
        //Below throws an exception in chrome, but still works 
        $('#ifr'+tabCounter.contentWindow.document.body).find(a).bind('click', function(event){ 
         //event.preventDefault(); 
         var name = $(event.currentTarget).text(); 
         var url = $(event.currentTarget).attr("href"); 
         createNewTab(name, url, 5, true); 
         return false; 
        }); 
       }); 
      } 

      function createNewTab(name, url, size, checkTabExists) { 
       addTab(name, url); 
       //selectNewTab(); 
      }   
     }); 
    </script>  
</head> 
<body> 
    <div class="content"> 
     <div id="tabs"> 
      <ul> 
       <li><a href="#tabs-1">First Tab</a></li> 
      </ul> 
      <div id="tabs-1"> 
       <p>Tab 1</p> 
      </div> 
     </div> 
    </div> 
    <div class="dock"> 
     <a href="another-page.html">New Tab</a> 
    </div> 
</body> 
</html>