阻止独立网络应用中的链接打开Mobile Safari并使用模式导航

时间:2016-05-03 09:06:05

标签: javascript ruby-on-rails modal-dialog

我正在制作一个应用程序,我希望在移动设备上独立显示。

我用过

 // Mobile Safari in standalone mode
if(("standalone" in window.navigator) && window.navigator.standalone){

    // If you want to prevent remote links in standalone web apps opening Mobile Safari, change 'remotes' to true
    var noddy, remotes = false;

    document.addEventListener('click', function(event) {

        noddy = event.target;

        // Bubble up until we hit link or top HTML element. Warning: BODY element is not compulsory so better to stop on HTML
        while(noddy.nodeName !== "A" && noddy.nodeName !== "HTML") {
            noddy = noddy.parentNode;
        }

        if('href' in noddy && noddy.href.indexOf('http') !== -1 && (noddy.href.indexOf(document.location.host) !== -1 || remotes))
        {
            event.preventDefault();
            document.location.href = noddy.href;
        }

    },false);
}

但是我也在我的应用程序中使用模态。以前的JS将破坏模态的代码。

JS莫代尔:

$ ->
  modal_holder_selector = '#modal-holder'
  modal_selector = '.modal'

  $(document).on 'click', 'a[data-modal]', ->
    location = $(this).attr('href')
    #Load modal dialog from server
    $.get location, (data)->
      $(modal_holder_selector).html(data).
      find(modal_selector).modal()
    false

  $(document).on 'ajax:success',
    'form[data-modal]', (event, data, status, xhr)->
      url = xhr.getResponseHeader('Location')
      if url
        # Redirect to url
        window.location = url
      else
        # Remove old modal backdrop
        $('.modal-backdrop').remove()

        # Replace old modal with new one
        $(modal_holder_selector).html(data).
        find(modal_selector).modal()

      false

有人可以帮我把这两个结合起来吗?

1 个答案:

答案 0 :(得分:1)

所以问题是你直接被重定向到页面,而不是在模态中打开那个页面。

由于您当前的“独立”代码看起来非常自定义,我假设您可以根据自己的需要进行增强。如果情况并非如此,请告诉我。

尝试更改触发重定向的条件,同时检查data-modal属性:

if('href' in noddy && !'data-modal' in noddy && noddy.href.indexOf('http') !== -1 && (noddy.href.indexOf(document.location.host) !== -1 || remotes)) 
{
    event.preventDefault();
    document.location.href = noddy.href;
}

由于条件变得很长(并且可能会发生变化),你可以将它抽象出来(shouldRedirect()isModal()或者其他东西),但我会把它留给你。