2012-04-02 87 views
0

为什么不在IE6或IE7中使用此代码?在IE6和IE7中使用Javascript“确认”

$('a').click(
    function() 
    { 
     var urlIsExternal = true; 

     var urlMedicareDir = '/medicare/'; 
     var urlMedicareHost = 'health.healthcare.com'; 
     var urlMedicare = 'https://' + urlMedicareHost + urlMedicareDir; 

     var urlAppsHost = 'apps.healthcare.com'; 

     var urlCurrent = String(window.location); 
     var urlCurrentPrefix = urlCurrent.substring(0, urlMedicare.length); 
     var urlCurrentURL = $.url(urlCurrent); 

     var urlClicked = $(this).attr('href'); 
     var urlClickedURL = $.url($(this).attr('href')); 

     var urlHost = urlClickedURL.attr('host'); 

     if(!urlHost.length) 
     { 
      urlHost = urlCurrentURL.attr('host'); 
     } 

     var urlConfirmMessage = 'You are now leaving the Medicare website.'; 

     if(urlCurrentPrefix == urlMedicare) 
     { 
      if(urlClicked.substring(0, 1) == '/') // starts with slash 
      { 
       if(urlClicked.substring(0, urlMedicareDir.length) == urlMedicareDir) 
       { 
        urlIsExternal = false; 
       } 
      } 

      if(urlClicked.substring(0, urlMedicare.length) == urlMedicare) 
      { 
       urlIsExternal = false; 
      } 

      if (
       urlClicked.substring(0, 1) != '/' && 
       urlClicked.substring(0, 4) != 'http' && 
       urlClicked.substring(0, 4) != 'file' 
      ) 
      { 
       urlIsExternal = false; 
      } 

      if(urlAppsHost == urlHost) 
      { 
       urlIsExternal = false; 
      } 

      if(urlClicked.substring(urlClicked.length-4) == '.pdf') 
      { 
       urlIsExternal = false; 
      } 
     } 
     else 
     { 
      urlIsExternal = false; 
     } 

     if(urlIsExternal) 
     { 
      if(confirm(urlConfirmMessage)) 
      { 
       window.open(urlClicked); 
       return false; 
      } 
      else 
      { 
       return false; 
      } 
     } 
     else 
     { 
      return true; 
     } 
    } 
); 

出于某种原因,当链接被点击了IE6还是IE7,他们不会将用户引导到的链接,并没有提示确认对话框。它应该提示确认对话框,但由于某种原因,它不是。

+4

你在错误控制台看到任何错误? – jfriend00 2012-04-02 22:35:52

+2

代码提示:不要'String(window.location)'而是'window.location.href'。 – Ryan 2012-04-02 22:37:35

+0

如果您可以将问题缩小到可能的最小范围,它将帮助所有人(包括您!)。尝试在代码中的关键点插入一些有意义的'alert()'调用,以确保它们得到执行。 – aaaidan 2012-04-02 22:46:44

回答

1

我不认为你正在阻止锚点(“a”)的默认动作。

,这样,当你来到这里你应该开始$('a').click(function(event) {

if(urlIsExternal) { 

    // This tells jQuery to NOT follow the hyperlink 
    event.preventDefault(); 

    if(confirm(urlConfirmMessage)) { 
     window.open(urlClicked); 
    } 

}

然而,什么是真正缺少的是这个代码需要后文件已加载运行。所以,你只需要与

$(document).ready(function(){ 
    $('a').click(function(event) { 
     /* your code */ 
    } 
});

来包装你的功能,而不调用$(document).ready(),JavaScript的运行文件的正文之前被渲染,所以它没有找到任何<a>标签,它可以附加点击事件。

1

看来,如果用户点击一个链接,该链接的href以当前主机以外的某个值开始,则需要提供确认对话框。这是一个令人讨厌的策略,为什么用户不知道之前点击链接,它会在别处?

无论如何,你正在尝试做一个简单的版本是:

function showPrompt() { 
    return confirm('Do you really want to leaving ' + window.location.host + 
       '?\nPress OK to continue or Cancel to stay on this page.'); 
} 

window.onload = function() { 

    // The links collection is live and available as a property of window 
    var link, links = document.links; 

    // Include criteria for host, hostName, protocol, whatever as required 
    var re = new RegExp(window.location.host || 'no host'); 

    for (var i=0, iLen=links.length; i<iLen; i++) { 
    link = links[i]; 

    // Only add the listener to links that need it 
    if (!re.test(link.href)) { 

     // Add the listener however you want, this way is simple and robust 
     link.onclick = showPrompt; 
    } 
    } 
}